diff --git a/preview/pr-1379/CubosLogoDarkMode.png b/preview/pr-1379/CubosLogoDarkMode.png new file mode 100644 index 0000000000..4ad037a911 Binary files /dev/null and b/preview/pr-1379/CubosLogoDarkMode.png differ diff --git a/preview/pr-1379/Favicon.png b/preview/pr-1379/Favicon.png new file mode 100644 index 0000000000..3a0dab9b7f Binary files /dev/null and b/preview/pr-1379/Favicon.png differ diff --git a/preview/pr-1379/aabb_8hpp.html b/preview/pr-1379/aabb_8hpp.html new file mode 100644 index 0000000000..e659674e02 --- /dev/null +++ b/preview/pr-1379/aabb_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/geom/aabb.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/aabb.hpp file +

+

Component cubos::core::geom::AABB.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::geom
+
Geometry module.
+
+
+
+

Classes

+
+
+ struct cubos::core::geom::AABB +
+
Represents an axis-aligned bounding box.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/access_8hpp.html b/preview/pr-1379/access_8hpp.html new file mode 100644 index 0000000000..8f5520e747 --- /dev/null +++ b/preview/pr-1379/access_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/system/access.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/access.hpp file +

+

Struct cubos::core::ecs::SystemAccess.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SystemAccess +
+
Describes the types of data a system accesses.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/accumulated__correction_8hpp.html b/preview/pr-1379/accumulated__correction_8hpp.html new file mode 100644 index 0000000000..920f5c03bc --- /dev/null +++ b/preview/pr-1379/accumulated__correction_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/accumulated_correction.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/accumulated_correction.hpp file +

+

Component cubos::engine::AccumulatedCorrection.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::AccumulatedCorrection +
+
Component which holds the corrections accumulated from the constraints solving.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/action_8hpp.html b/preview/pr-1379/action_8hpp.html new file mode 100644 index 0000000000..b8a17608b0 --- /dev/null +++ b/preview/pr-1379/action_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/input/action.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/action.hpp file +

+

Class cubos::engine::InputAction.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::InputAction +
+
Stores the state of a single input action, such as "jump" or "attack".
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/address_8hpp.html b/preview/pr-1379/address_8hpp.html new file mode 100644 index 0000000000..ee87a855af --- /dev/null +++ b/preview/pr-1379/address_8hpp.html @@ -0,0 +1,132 @@ + + + + + core/net/address.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/net/address.hpp file +

+

Class cubos::core::net::Address.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
+
+
+

Classes

+
+
+ class cubos::core::net::Address +
+
Represents an address, either IPv4 or IPv6.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/angular__impulse_8hpp.html b/preview/pr-1379/angular__impulse_8hpp.html new file mode 100644 index 0000000000..0ab3d1e1f7 --- /dev/null +++ b/preview/pr-1379/angular__impulse_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/angular_impulse.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/angular_impulse.hpp file +

+

Component cubos::engine::AngularImpulse.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::AngularImpulse +
+
Component which holds angular impulses applied on a body.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/angular__velocity_8hpp.html b/preview/pr-1379/angular__velocity_8hpp.html new file mode 100644 index 0000000000..0de5dca250 --- /dev/null +++ b/preview/pr-1379/angular__velocity_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/angular_velocity.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/angular_velocity.hpp file +

+

Component cubos::engine::AngularVelocity.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::AngularVelocity +
+
Component which holds angular velocity of a body.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/annotated.html b/preview/pr-1379/annotated.html new file mode 100644 index 0000000000..5082260e82 --- /dev/null +++ b/preview/pr-1379/annotated.html @@ -0,0 +1,659 @@ + + + + + Cubos Docs + + + + + + + +
+
+
+
+
+

Classes

+
    +
  • + namespace cubos Cubos libraries namespace. +
      + + +
    +
  • +
  • + namespace tesseratos Tesseratos namespace. +
      +
    • struct AssetSelectedEvent Event sent when an asset is selected.
    • +
    • class ProjectManager System argument which can be used to manage the currently loaded project.
    • +
    +
  • +
+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/any__value_8hpp.html b/preview/pr-1379/any__value_8hpp.html new file mode 100644 index 0000000000..a5e66264c6 --- /dev/null +++ b/preview/pr-1379/any__value_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/memory/any_value.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/any_value.hpp file +

+

Class cubos::core::memory::AnyValue.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+ class cubos::core::memory::AnyValue +
+
Stores a blob of a given reflected type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/any__vector_8hpp.html b/preview/pr-1379/any__vector_8hpp.html new file mode 100644 index 0000000000..ac1f640fcd --- /dev/null +++ b/preview/pr-1379/any__vector_8hpp.html @@ -0,0 +1,136 @@ + + + + + core/memory/any_vector.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/any_vector.hpp file +

+

Class cubos::core::memory::AnyVector.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+ class cubos::core::memory::AnyVector +
+
Stores a dynamically sized array of blobs of a given reflected type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/archetype_8hpp.html b/preview/pr-1379/archetype_8hpp.html new file mode 100644 index 0000000000..6de5abe5c2 --- /dev/null +++ b/preview/pr-1379/archetype_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/query/node/archetype.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/node/archetype.hpp file +

+

Class cubos::core::ecs::QueryArchetypeNode.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::QueryArchetypeNode +
+
Node which forces a given target to belong to a set of archetypes.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/archetype__graph_8hpp.html b/preview/pr-1379/archetype__graph_8hpp.html new file mode 100644 index 0000000000..8ff026f195 --- /dev/null +++ b/preview/pr-1379/archetype__graph_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/entity/archetype_graph.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/archetype_graph.hpp file +

+

Class cubos::core::ecs::ArchetypeGraph.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::ArchetypeGraph +
+
Stores which column types each archetype holds and the edges which connect them.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/archetype__id_8hpp.html b/preview/pr-1379/archetype__id_8hpp.html new file mode 100644 index 0000000000..b7a8518089 --- /dev/null +++ b/preview/pr-1379/archetype__id_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/entity/archetype_id.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/archetype_id.hpp file +

+

Struct cubos::core::ecs::ArchetypeId.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::ArchetypeId +
+
Identifies an archetype.
+
+ struct cubos::core::ecs::ArchetypeIdHash +
+
Hash functor for ArchetypeId.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/archive_8hpp.html b/preview/pr-1379/archive_8hpp.html new file mode 100644 index 0000000000..986f0ccf9c --- /dev/null +++ b/preview/pr-1379/archive_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/fs/archive.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/archive.hpp file +

+

Class cubos::core::data::Archive.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::Archive +
+
Interface for a bridge between the Cubos virtual file system and the real world.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/array_8hpp.html b/preview/pr-1379/array_8hpp.html new file mode 100644 index 0000000000..78b01bd9b8 --- /dev/null +++ b/preview/pr-1379/array_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/array.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/array.hpp file +

+

Class cubos::core::reflection::ArrayTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::ArrayTrait +
+
Exposes array-like functionality of a type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/asset_8hpp.html b/preview/pr-1379/asset_8hpp.html new file mode 100644 index 0000000000..e63140764d --- /dev/null +++ b/preview/pr-1379/asset_8hpp.html @@ -0,0 +1,137 @@ + + + + + engine/assets/asset.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/asset.hpp file +

+

Classes cubos::engine::AnyAsset and cubos::engine::Asset.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::AnyAsset +
+
Handle to an asset of any type. May either be weak or strong. Weak handles do not guarantee the asset is loaded, while strong handles do.
+
+
template<typename T>
+ class cubos::engine::Asset +
+
Handle to an asset of a specific type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/assets_2bridge_8hpp.html b/preview/pr-1379/assets_2bridge_8hpp.html new file mode 100644 index 0000000000..aa5da4f19a --- /dev/null +++ b/preview/pr-1379/assets_2bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/assets/bridge.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/bridge.hpp file +

+

Class cubos::engine::AssetBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::AssetBridge +
+
Bridges are the objects responsible for loading and saving assets from/to disk. They form the bridge between the asset manager and the virtual file system.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/assets_8hpp.html b/preview/pr-1379/assets_8hpp.html new file mode 100644 index 0000000000..d83ae203ad --- /dev/null +++ b/preview/pr-1379/assets_8hpp.html @@ -0,0 +1,156 @@ + + + + + engine/assets/assets.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/assets.hpp file +

+

Resource cubos::engine::Assets.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::Assets +
+
Resource which manages all assets. Responsible for loading and unloading assets, storing them in memory, and providing access to them.
+
+
+
+

Typedefs

+
+
+ using AssetMetaRead = core::memory::ReadGuard<AssetMeta, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's metadata.
+
+ using AssetMetaWrite = core::memory::WriteGuard<AssetMeta, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's metadata.
+
+
template<typename T>
+ using AssetRead = core::memory::ReadGuard<T, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's data.
+
+
template<typename T>
+ using AssetWrite = core::memory::WriteGuard<T, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's data.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/audio_2bridge_8hpp.html b/preview/pr-1379/audio_2bridge_8hpp.html new file mode 100644 index 0000000000..667f97c372 --- /dev/null +++ b/preview/pr-1379/audio_2bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/audio/bridge.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/audio/bridge.hpp file +

+

Class cubos::engine::AudioBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::AudioBridge +
+
Bridge which loads and saves Audio assets.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/audio_8hpp.html b/preview/pr-1379/audio_8hpp.html new file mode 100644 index 0000000000..06084cd635 --- /dev/null +++ b/preview/pr-1379/audio_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/audio/audio.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/audio/audio.hpp file +

+

Class cubos::engine::Audio.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Audio +
+
Asset containing raw Audio data.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/audio__context_8hpp.html b/preview/pr-1379/audio__context_8hpp.html new file mode 100644 index 0000000000..c1ba80d596 --- /dev/null +++ b/preview/pr-1379/audio__context_8hpp.html @@ -0,0 +1,170 @@ + + + + + core/al/audio_context.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/al/audio_context.hpp file +

+

Class cubos::core::al::AudioContext and related types.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::al
+
Audio module.
+
namespace cubos::core::al::impl
+
Namespace to store the abstract types implemented by the audio device implementations.
+
+
+
+

Classes

+
+
+ class cubos::core::al::AudioContext +
+
Audio context that contains audio devices;.
+
+ class cubos::core::al::impl::Buffer +
+
Abstract audio buffer.
+
+ class cubos::core::al::impl::Source +
+
Abstract audio source.
+
+ class cubos::core::al::impl::AudioDevice +
+
Audio device interface used to wrap low-level audio rendering APIs.
+
+
+
+

Typedefs

+
+
+ using Buffer = std::shared_ptr<impl::Buffer> +
+
Handle to an audio buffer.
+
+ using Source = std::shared_ptr<impl::Source> +
+
Handle to an audio source.
+
+ using Listener = std::shared_ptr<impl::Listener> +
+
Handle to an audio listener.
+
+ using AudioDevice = std::shared_ptr<impl::AudioDevice> +
+
Handle to an audio device.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/axis_8hpp.html b/preview/pr-1379/axis_8hpp.html new file mode 100644 index 0000000000..1be744f7b6 --- /dev/null +++ b/preview/pr-1379/axis_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/input/axis.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/axis.hpp file +

+

Class cubos::engine::InputAxis.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::InputAxis +
+
Stores the state of a single input axis, such as "move forward" or "move right".
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/bindings_8hpp.html b/preview/pr-1379/bindings_8hpp.html new file mode 100644 index 0000000000..7e3601db8d --- /dev/null +++ b/preview/pr-1379/bindings_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/input/bindings.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/bindings.hpp file +

+

Class cubos::engine::InputBindings.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::InputBindings +
+
Stores the input bindings for a single player.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/bloom_8hpp.html b/preview/pr-1379/bloom_8hpp.html new file mode 100644 index 0000000000..5ac8a32d14 --- /dev/null +++ b/preview/pr-1379/bloom_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/bloom/bloom.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/bloom/bloom.hpp file +

+

Component cubos::engine::Bloom.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Bloom +
+
Component which stores the Bloom state for a render target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/blueprint_8hpp.html b/preview/pr-1379/blueprint_8hpp.html new file mode 100644 index 0000000000..98a96ad7b4 --- /dev/null +++ b/preview/pr-1379/blueprint_8hpp.html @@ -0,0 +1,146 @@ + + + + + core/ecs/blueprint.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/blueprint.hpp file +

+

Class cubos::core::ecs::Blueprint.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Blueprint +
+
Collection of entities and their respective components and relations.
+
+
+
+

Functions

+
+
+ auto convertEntities(const std::unordered_map<Entity, Entity, EntityHash>& map, + const reflection::Type& type, + void* value) -> CUBOS_CORE_API void +
+
Converts entities in a value to their respective new entities. If an entity is not found in the map, it is left unchanged.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/buffer__stream_8hpp.html b/preview/pr-1379/buffer__stream_8hpp.html new file mode 100644 index 0000000000..dab853e2b2 --- /dev/null +++ b/preview/pr-1379/buffer__stream_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/memory/buffer_stream.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/buffer_stream.hpp file +

+

Class cubos::core::memory::BufferStream.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+ class cubos::core::memory::BufferStream +
+
Stream implementation which writes to/reads from a buffer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/camera_8hpp.html b/preview/pr-1379/camera_8hpp.html new file mode 100644 index 0000000000..e6b81634db --- /dev/null +++ b/preview/pr-1379/camera_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/camera/camera.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/camera/camera.hpp file +

+

Component cubos::engine::Camera.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Camera +
+
Generic component to hold the projection matrix of a specific camera (either perspective or orthogonal).
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/canvas_8hpp.html b/preview/pr-1379/canvas_8hpp.html new file mode 100644 index 0000000000..e505216e5f --- /dev/null +++ b/preview/pr-1379/canvas_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/canvas.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/canvas.hpp file +

+

Component cubos::engine::UICanvas.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UICanvas +
+
Component which represents a target for UI rendering.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/caster_8hpp.html b/preview/pr-1379/caster_8hpp.html new file mode 100644 index 0000000000..c25fa80413 --- /dev/null +++ b/preview/pr-1379/caster_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadows/caster.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadows/caster.hpp file +

+

Struct cubos::engine::ShadowCaster.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ShadowCaster +
+
Struct which contains the settings common to all shadow casters.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/center__of__mass_8hpp.html b/preview/pr-1379/center__of__mass_8hpp.html new file mode 100644 index 0000000000..465eab42a4 --- /dev/null +++ b/preview/pr-1379/center__of__mass_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/center_of_mass.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/center_of_mass.hpp file +

+

Component cubos::engine::CenterOfMass.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::CenterOfMass +
+
Component which defines the center of mass of a body.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/child__of_8hpp.html b/preview/pr-1379/child__of_8hpp.html new file mode 100644 index 0000000000..2b6ca2379e --- /dev/null +++ b/preview/pr-1379/child__of_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/child_of.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/transform/child_of.hpp file +

+

Relation cubos::engine::ChildOf.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ChildOf +
+
Tree relation which indicates the 'from' entity is a child of the 'to' entity.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1al_1_1AudioContext.html b/preview/pr-1379/classcubos_1_1core_1_1al_1_1AudioContext.html new file mode 100644 index 0000000000..ba8bc2e6b9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1al_1_1AudioContext.html @@ -0,0 +1,243 @@ + + + + + cubos::core::al::AudioContext class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::AudioContext class + +

+

Audio context that contains audio devices;.

+ +
+

Derived classes

+
+
+ class MiniaudioContext +
+
Audio device implementation using miniaudio.
+
+
+
+

Public static functions

+
+
+ static auto create() -> std::shared_ptr<AudioContext> +
+
Creates an audio context.
+
+
+
+

Public functions

+
+
+ void enumerateDevices(std::vector<std::string>& devices) pure virtual +
+
Enumerates the available devices.
+
+ auto createDevice(unsigned int listenerCount, + const std::string& specifier = "") -> AudioDevice pure virtual +
+
Creates a new audio device.
+
+ auto createBuffer(const void* data, + size_t dataSize) -> Buffer pure virtual +
+
Creates a new audio buffer.
+
+
+
+

Function documentation

+
+

+ static std::shared_ptr<AudioContext> cubos::core::al::AudioContext::create() +

+

Creates an audio context.

+ + + + + + + +
ReturnsAudioContext, or nullptr on failure.
+
+
+

+ void cubos::core::al::AudioContext::enumerateDevices(std::vector<std::string>& devices) pure virtual +

+

Enumerates the available devices.

+ + + + + + + + + + +
Parameters
devices outVector to fill with the available device's specifiers.
+
+
+

+ AudioDevice cubos::core::al::AudioContext::createDevice(unsigned int listenerCount, + const std::string& specifier = "") pure virtual +

+

Creates a new audio device.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
listenerCountNumber of audio listeners to be supported by the device.
specifierIdentifier of the audio device.
ReturnsHandle of the new device
+
+
+

+ Buffer cubos::core::al::AudioContext::createBuffer(const void* data, + size_t dataSize) pure virtual +

+

Creates a new audio buffer.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataData to be written to the buffer, either .wav, .mp3 or .flac.
dataSizeSize of the data to be written.
ReturnsHandle of the new buffer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1al_1_1MiniaudioContext.html b/preview/pr-1379/classcubos_1_1core_1_1al_1_1MiniaudioContext.html new file mode 100644 index 0000000000..0a9dba6205 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1al_1_1MiniaudioContext.html @@ -0,0 +1,218 @@ + + + + + cubos::core::al::MiniaudioContext class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::MiniaudioContext class +

+

Audio device implementation using miniaudio.

+ +
+

Base classes

+
+
+ class AudioContext +
+
Audio context that contains audio devices;.
+
+
+
+

Public functions

+
+
+ auto createDevice(unsigned int listenerCount, + const std::string& specifier) -> AudioDevice override +
+
Creates a new audio device.
+
+ auto createBuffer(const void* data, + size_t dataSize) -> Buffer override +
+
Creates a new audio buffer.
+
+ void enumerateDevices(std::vector<std::string>& devices) override +
+
Enumerates the available devices.
+
+
+
+

Function documentation

+
+

+ AudioDevice cubos::core::al::MiniaudioContext::createDevice(unsigned int listenerCount, + const std::string& specifier) override +

+

Creates a new audio device.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
listenerCountNumber of audio listeners to be supported by the device.
specifierIdentifier of the audio device.
ReturnsHandle of the new device
+
+
+

+ Buffer cubos::core::al::MiniaudioContext::createBuffer(const void* data, + size_t dataSize) override +

+

Creates a new audio buffer.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataData to be written to the buffer, either .wav, .mp3 or .flac.
dataSizeSize of the data to be written.
ReturnsHandle of the new buffer.
+
+
+

+ void cubos::core::al::MiniaudioContext::enumerateDevices(std::vector<std::string>& devices) override +

+

Enumerates the available devices.

+ + + + + + + + + + +
Parameters
devices outVector to fill with the available device's specifiers.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1AudioDevice.html b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1AudioDevice.html new file mode 100644 index 0000000000..25814d1a97 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1AudioDevice.html @@ -0,0 +1,168 @@ + + + + + cubos::core::al::impl::AudioDevice class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::impl::AudioDevice class + +

+

Audio device interface used to wrap low-level audio rendering APIs.

+ +
+

Constructors, destructors, conversion operators

+
+
+ AudioDevice(const AudioDevice&) deleted +
+
Forbid copy construction.
+
+
+
+

Public functions

+
+
+ auto createSource() -> std::shared_ptr<impl::Source> pure virtual +
+
Creates a new audio source.
+
+ auto listener(size_t index) -> std::shared_ptr<impl::Listener> pure virtual +
+
Creates a new audio listener.
+
+
+
+

Function documentation

+
+

+ std::shared_ptr<impl::Source> cubos::core::al::impl::AudioDevice::createSource() pure virtual +

+

Creates a new audio source.

+ + + + + + + +
ReturnsHandle of the new source.
+
+
+

+ std::shared_ptr<impl::Listener> cubos::core::al::impl::AudioDevice::listener(size_t index) pure virtual +

+

Creates a new audio listener.

+ + + + + + + +
ReturnsHandle of the new listener.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Buffer.html b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Buffer.html new file mode 100644 index 0000000000..1a9988e369 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Buffer.html @@ -0,0 +1,140 @@ + + + + + cubos::core::al::impl::Buffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::impl::Buffer class + +

+

Abstract audio buffer.

+ +
+

Public functions

+
+
+ auto length() -> float pure virtual +
+
Gets the length in seconds of the audio buffer.
+
+
+
+

Function documentation

+
+

+ float cubos::core::al::impl::Buffer::length() pure virtual +

+

Gets the length in seconds of the audio buffer.

+ + + + + + + +
ReturnsLength in seconds of the audio buffer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Source.html b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Source.html new file mode 100644 index 0000000000..9afb20645f --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1al_1_1impl_1_1Source.html @@ -0,0 +1,353 @@ + + + + + cubos::core::al::impl::Source class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::impl::Source class + +

+

Abstract audio source.

+ +
+

Public functions

+
+
+ void setBuffer(cubos::core::al::Buffer buffer) pure virtual +
+
Sets the buffer to be played by the source.
+
+ void setPosition(const glm::vec3& position) pure virtual +
+
Sets the position of the source, by default, in the world space.
+
+ void setVelocity(const glm::vec3& velocity) pure virtual +
+
Sets the velocity of the source, by default, in the world space.
+
+ void setGain(float gain) pure virtual +
+
Sets the gain of the source.
+
+ void setPitch(float pitch) pure virtual +
+
Sets the pitch of the source.
+
+ void setLooping(bool looping) pure virtual +
+
Sets whether the source plays in a loop.
+
+ void setRelative(cubos::core::al::Listener listener) pure virtual +
+
Sets whether the source position and velocity is relative to the listener or not.
+
+ void setMaxDistance(float maxDistance) pure virtual +
+
Sets the maximum distance at which the source is audible.
+
+ void setMinDistance(float minDistance) pure virtual +
+
Sets the minimum distance at which the source starts to attenuate.
+
+ void setCone(float innerAngle, + float outerAngle, + float outerGain) pure virtual +
+
Sets the cone angle, in degrees. While also setting the outerGain.
+
+ void setConeDirection(const glm::vec3& direction) pure virtual +
+
Sets the cone direction of the source.
+
+ void play() pure virtual +
+
Plays the source.
+
+
+
+

Function documentation

+
+

+ void cubos::core::al::impl::Source::setBuffer(cubos::core::al::Buffer buffer) pure virtual +

+

Sets the buffer to be played by the source.

+ + + + + + + + + + +
Parameters
bufferBuffer.
+
+
+

+ void cubos::core::al::impl::Source::setPosition(const glm::vec3& position) pure virtual +

+

Sets the position of the source, by default, in the world space.

+ + + + + + + + + + +
Parameters
positionPosition.
+ +
+
+

+ void cubos::core::al::impl::Source::setVelocity(const glm::vec3& velocity) pure virtual +

+

Sets the velocity of the source, by default, in the world space.

+ + + + + + + + + + +
Parameters
velocityVelocity.
+
+
+

+ void cubos::core::al::impl::Source::setGain(float gain) pure virtual +

+

Sets the gain of the source.

+ + + + + + + + + + +
Parameters
gainGain.
+
+
+

+ void cubos::core::al::impl::Source::setPitch(float pitch) pure virtual +

+

Sets the pitch of the source.

+ + + + + + + + + + +
Parameters
pitchPitch.
+
+
+

+ void cubos::core::al::impl::Source::setLooping(bool looping) pure virtual +

+

Sets whether the source plays in a loop.

+ + + + + + + + + + +
Parameters
loopingLooping flag.
+
+
+

+ void cubos::core::al::impl::Source::setMaxDistance(float maxDistance) pure virtual +

+

Sets the maximum distance at which the source is audible.

+ + + + + + + + + + +
Parameters
maxDistanceMaximum distance.
+
+
+

+ void cubos::core::al::impl::Source::setMinDistance(float minDistance) pure virtual +

+

Sets the minimum distance at which the source starts to attenuate.

+ + + + + + + + + + +
Parameters
minDistanceMinimum distance.
+
+
+

+ void cubos::core::al::impl::Source::setCone(float innerAngle, + float outerAngle, + float outerGain) pure virtual +

+

Sets the cone angle, in degrees. While also setting the outerGain.

+ + + + + + + + + + + + + + + + + + +
Parameters
innerAngleOuter angle, in degrees.
outerAngleInner angle, in degrees.
outerGain
+
+
+

+ void cubos::core::al::impl::Source::setConeDirection(const glm::vec3& direction) pure virtual +

+

Sets the cone direction of the source.

+ + + + + + + + + + +
Parameters
directionDirection.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1Archive.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Archive.html new file mode 100644 index 0000000000..66860df1aa --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Archive.html @@ -0,0 +1,398 @@ + + + + + cubos::core::data::Archive class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::Archive class + +

+

Interface for a bridge between the Cubos virtual file system and the real world.

+ +

By real world, we mean something such as a file on the OS file system or a network connection. The archive is responsible for creating and destroying files, supplying streams for reading and writing, and retrieving information about existing files.

Each file in an archive is represented by a unique integer identifier. The identifier 0 is reserved for errors, and the identifier 1 is reserved for the root file of the archive.

The root file may be a directory or a regular file. If its a directory, when mounted, the archive will take the form of a directory, with the root file being placed on the mount point. If the root file is a regular file, then the mount point will be a regular file.

This class is not meant to be thread-safe - it is the responsibility of the File class to ensure that the same file is not accessed or modified by multiple threads at the same time.

Implementations should crash when called with invalid arguments - since they're only called by File, its okay to assume the arguments are correct (please do use asserts though).

+
+

Derived classes

+
+
+ class EmbeddedArchive +
+
Archive implementation which reads data embedded in the application. Meant to be used with the quadrados embed tool.
+
+ class StandardArchive +
+
Archive implementation which reads and writes from/into the OS file system using the standard library.
+
+
+
+

Public functions

+
+
+ auto create(std::size_t parent, + std::string_view name, + bool directory = false) -> std::size_t pure virtual +
+
Creates a new file in the archive.
+
+ auto destroy(std::size_t id) -> bool pure virtual +
+
Destroys a regular file or empty directory in the archive.
+
+ auto name(std::size_t id) const -> std::string pure virtual +
+
Gets the name of the file with the given id.
+
+ auto directory(std::size_t id) const -> bool pure virtual +
+
Checks whether the file with the given id is a directory.
+
+ auto readOnly() const -> bool pure virtual +
+
Checks whether the archive is read-only.
+
+ auto parent(std::size_t id) const -> std::size_t pure virtual +
+
Gets the identifier of the parent file of the file with the given id.
+
+ auto sibling(std::size_t id) const -> std::size_t pure virtual +
+
Gets the identifier of the sibling of the file with the given id.
+
+ auto child(std::size_t id) const -> std::size_t pure virtual +
+
Gets the identifier of the first child of the file with the given id.
+
+ auto open(std::size_t id, + File::Handle handle, + File::OpenMode mode) -> std::unique_ptr<memory::Stream> pure virtual +
+
Opens a file in the archive.
+
+
+
+

Function documentation

+
+

+ std::size_t cubos::core::data::Archive::create(std::size_t parent, + std::string_view name, + bool directory = false) pure virtual +

+

Creates a new file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
parentParent directory of the new file.
nameName of the new file.
directoryWhether the new file is a directory or not.
ReturnsIdentifier of the file, or 0 if the file could not be created.
+

The first child of the parent will have its sibling set to the new file and then be replaced by the new file.

+
+
+

+ bool cubos::core::data::Archive::destroy(std::size_t id) pure virtual +

+

Destroys a regular file or empty directory in the archive.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file was destroyed successfully.
+

Will be replaced in the tree by its sibling.

+
+
+

+ std::string cubos::core::data::Archive::name(std::size_t id) const pure virtual +

+

Gets the name of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsName of the file.
+
+
+

+ bool cubos::core::data::Archive::directory(std::size_t id) const pure virtual +

+

Checks whether the file with the given id is a directory.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file is a directory or not.
+
+
+

+ bool cubos::core::data::Archive::readOnly() const pure virtual +

+

Checks whether the archive is read-only.

+ + + + + + + +
ReturnsWhether the archive is read-only.
+
+
+

+ std::size_t cubos::core::data::Archive::parent(std::size_t id) const pure virtual +

+

Gets the identifier of the parent file of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the parent file, or 0 if the file is the root file.
+
+
+

+ std::size_t cubos::core::data::Archive::sibling(std::size_t id) const pure virtual +

+

Gets the identifier of the sibling of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the sibling, or 0 if there are no more files in the parent.
+
+
+

+ std::size_t cubos::core::data::Archive::child(std::size_t id) const pure virtual +

+

Gets the identifier of the first child of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the first child, or 0 if the file is not a directory or is empty.
+
+
+

+ std::unique_ptr<memory::Stream> cubos::core::data::Archive::open(std::size_t id, + File::Handle handle, + File::OpenMode mode) pure virtual +

+

Opens a file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
handleHandle to the file.
modeMode to open the file in.
ReturnsFile stream, or nullptr if the file could not be opened.
+

Although a bit hacky, the handle parameter is used to keep a reference to the respective File alive, preventing the file from being destroyed while the stream is open.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinaryDeserializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinaryDeserializer.html new file mode 100644 index 0000000000..4d81d1898e --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinaryDeserializer.html @@ -0,0 +1,193 @@ + + + + + cubos::core::data::BinaryDeserializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::BinaryDeserializer class + +

+

Implementation of the abstract Deserializer class meant to deserialize data written by a BinarySerializer.

+ +
+

Base classes

+
+
+ class Deserializer +
+
Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ BinaryDeserializer(memory::Stream& stream) +
+
Constructs.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + void* value) -> bool override +
+
Called for each type with no hook defined.
+
+
+
+

Function documentation

+
+

+ cubos::core::data::BinaryDeserializer::BinaryDeserializer(memory::Stream& stream) +

+

Constructs.

+ + + + + + + + + + +
Parameters
streamStream to read from.
+
+
+

+ bool cubos::core::data::BinaryDeserializer::decompose(const reflection::Type& type, + void* value) override protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully deserialized.
+

Should recurse by calling read() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinarySerializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinarySerializer.html new file mode 100644 index 0000000000..3648ca1c3c --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1BinarySerializer.html @@ -0,0 +1,193 @@ + + + + + cubos::core::data::BinarySerializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::BinarySerializer class + +

+

Implementation of the abstract Serializer class meant to serialize data in a non-readable but fast and compact way.

+ +
+

Base classes

+
+
+ class Serializer +
+
Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ BinarySerializer(memory::Stream& stream) +
+
Constructs.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + const void* value) -> bool override +
+
Called for each type with no hook defined.
+
+
+
+

Function documentation

+
+

+ cubos::core::data::BinarySerializer::BinarySerializer(memory::Stream& stream) +

+

Constructs.

+ + + + + + + + + + +
Parameters
streamStream to write to.
+
+
+

+ bool cubos::core::data::BinarySerializer::decompose(const reflection::Type& type, + const void* value) override protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully serialized.
+

Should recurse by calling write() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1DebugSerializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1DebugSerializer.html new file mode 100644 index 0000000000..60c1b92cad --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1DebugSerializer.html @@ -0,0 +1,220 @@ + + + + + cubos::core::data::DebugSerializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::DebugSerializer class + +

+

Serializer implementation which prints the given data to a stream in a human-readable format not meant to be parsed.

+ +
+

Base classes

+
+
+ class Serializer +
+
Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ DebugSerializer(memory::Stream& stream) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void pretty(bool pretty) +
+
Sets whether to pretty-print the output.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + const void* value) -> bool override +
+
Called for each type with no hook defined.
+
+
+
+

Function documentation

+
+

+ cubos::core::data::DebugSerializer::DebugSerializer(memory::Stream& stream) +

+

Constructs.

+ + + + + + + + + + +
Parameters
streamStream to serialize to.
+
+
+

+ void cubos::core::data::DebugSerializer::pretty(bool pretty) +

+

Sets whether to pretty-print the output.

+ + + + + + + + + + +
Parameters
prettyWhether to pretty-print the output.
+
+
+

+ bool cubos::core::data::DebugSerializer::decompose(const reflection::Type& type, + const void* value) override protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully serialized.
+

Should recurse by calling write() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1Deserializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Deserializer.html new file mode 100644 index 0000000000..78648078cf --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Deserializer.html @@ -0,0 +1,359 @@ + + + + + cubos::core::data::Deserializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::Deserializer class + +

+

Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.

+ +

Deserializers are type visitors which allow overriding the default deserialization behaviour for each type using hooks. Hooks are functions which are called when the deserializer encounters a type, and can be used to customize the deserialization process.

If a type which can't be further decomposed is encountered for which no hook is defined, the deserializer will emit a warning and fail. Implementations should set default hooks for at least the primitive types.

+
+

Derived classes

+
+
+ class BinaryDeserializer +
+
Implementation of the abstract Deserializer class meant to deserialize data written by a BinarySerializer.
+
+ class JSONDeserializer +
+
Deserializer implementation which allows reading data from a JSON object.
+
+
+
+

Public types

+
+
+ using Hook = memory::Function<bool(void*)> +
+
Function type for deserialization hooks.
+
+
template<typename T>
+ using TypedHook = memory::Function<bool(T&)> +
+
Function type for deserialization hooks.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Deserializer() defaulted +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto read(const reflection::Type& type, + void* value) -> bool +
+
Deserialize the given value.
+
+
template<typename T>
+ auto read(T& value) -> bool +
+
Deserialize the given value.
+
+ void hook(const reflection::Type& type, + Hook hook) +
+
Sets the hook to be called on deserialization of the given type.
+
+
template<typename T>
+ void hook(TypedHook<T> hook) +
+
Sets the hook to be called on deserialization of the given type.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + void* value) -> bool pure virtual +
+
Called for each type with no hook defined.
+
+
+
+

Typedef documentation

+
+

+
+ template<typename T> +
+ using cubos::core::data::Deserializer::TypedHook = memory::Function<bool(T&)> +

+

Function type for deserialization hooks.

+ + + + + + + + + + +
Template parameters
TType.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::data::Deserializer::read(const reflection::Type& type, + void* value) +

+

Deserialize the given value.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully deserialized.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::data::Deserializer::read(T& value) +

+

Deserialize the given value.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType.
Parameters
valueValue.
ReturnsWhether the value was successfully deserialized.
+
+
+

+ void cubos::core::data::Deserializer::hook(const reflection::Type& type, + Hook hook) +

+

Sets the hook to be called on deserialization of the given type.

+ + + + + + + + + + + + + + +
Parameters
typeType.
hookHook.
+
+
+

+
+ template<typename T> +
+ void cubos::core::data::Deserializer::hook(TypedHook<T> hook) +

+

Sets the hook to be called on deserialization of the given type.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
TType.
Parameters
hookHook.
+
+
+

+ bool cubos::core::data::Deserializer::decompose(const reflection::Type& type, + void* value) pure virtual protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully deserialized.
+

Should recurse by calling read() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1EmbeddedArchive.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1EmbeddedArchive.html new file mode 100644 index 0000000000..f15dc7613e --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1EmbeddedArchive.html @@ -0,0 +1,466 @@ + + + + + cubos::core::data::EmbeddedArchive class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::EmbeddedArchive class + +

+

Archive implementation which reads data embedded in the application. Meant to be used with the quadrados embed tool.

+ +

Can be used to create single-file applications, where all the data is embedded in the executable.

This archive accesses a global map of data, where embedded data can be registered with a given name. Then, to access that data, an instance of this archive is created pointing to that name.

The embed tool generates source files which define and register that data. By linking those files into your application, you're making the data available to be accessed through an instance of this archive.

+
+

Base classes

+
+
+ class Archive +
+
Interface for a bridge between the Cubos virtual file system and the real world.
+
+
+
+

Public types

+
+
+ struct Data +
+
Describes the structure of the embedded data.
+
+
+
+

Public static functions

+
+
+ static void registerData(const std::string& name, + const Data& data) +
+
Registers embedded archive data, which must remain valid for the lifetime of the application.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ EmbeddedArchive(const std::string& name) +
+
Constructs pointing to the data with the given name.
+
+
+
+

Public functions

+
+
+ auto create(std::size_t parent, + std::string_view name, + bool directory = false) -> std::size_t override +
+
Creates a new file in the archive.
+
+ auto destroy(std::size_t id) -> bool override +
+
Destroys a regular file or empty directory in the archive.
+
+ auto name(std::size_t id) const -> std::string override +
+
Gets the name of the file with the given id.
+
+ auto directory(std::size_t id) const -> bool override +
+
Checks whether the file with the given id is a directory.
+
+ auto readOnly() const -> bool override +
+
Checks whether the archive is read-only.
+
+ auto parent(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the parent file of the file with the given id.
+
+ auto sibling(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the sibling of the file with the given id.
+
+ auto child(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the first child of the file with the given id.
+
+ auto open(std::size_t id, + File::Handle handle, + File::OpenMode mode) -> std::unique_ptr<memory::Stream> override +
+
Opens a file in the archive.
+
+
+
+

Function documentation

+
+

+ static void cubos::core::data::EmbeddedArchive::registerData(const std::string& name, + const Data& data) +

+

Registers embedded archive data, which must remain valid for the lifetime of the application.

+ + + + + + + + + + + + + + +
Parameters
nameName of the embedded archive data.
dataEmbedded archive data.
+

This function is called by the code generated by the embed tool.

+
+
+

+ cubos::core::data::EmbeddedArchive::EmbeddedArchive(const std::string& name) +

+

Constructs pointing to the data with the given name.

+ + + + + + + + + + +
Parameters
nameName of the data the embedded archive is going to access.
+

Aborts if no data with the given name was registered.

+
+
+

+ std::size_t cubos::core::data::EmbeddedArchive::create(std::size_t parent, + std::string_view name, + bool directory = false) override +

+

Creates a new file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
parentParent directory of the new file.
nameName of the new file.
directoryWhether the new file is a directory or not.
ReturnsIdentifier of the file, or 0 if the file could not be created.
+

The first child of the parent will have its sibling set to the new file and then be replaced by the new file.

+
+
+

+ bool cubos::core::data::EmbeddedArchive::destroy(std::size_t id) override +

+

Destroys a regular file or empty directory in the archive.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file was destroyed successfully.
+

Will be replaced in the tree by its sibling.

+
+
+

+ std::string cubos::core::data::EmbeddedArchive::name(std::size_t id) const override +

+

Gets the name of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsName of the file.
+
+
+

+ bool cubos::core::data::EmbeddedArchive::directory(std::size_t id) const override +

+

Checks whether the file with the given id is a directory.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file is a directory or not.
+
+
+

+ bool cubos::core::data::EmbeddedArchive::readOnly() const override +

+

Checks whether the archive is read-only.

+ + + + + + + +
ReturnsWhether the archive is read-only.
+
+
+

+ std::size_t cubos::core::data::EmbeddedArchive::parent(std::size_t id) const override +

+

Gets the identifier of the parent file of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the parent file, or 0 if the file is the root file.
+
+
+

+ std::size_t cubos::core::data::EmbeddedArchive::sibling(std::size_t id) const override +

+

Gets the identifier of the sibling of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the sibling, or 0 if there are no more files in the parent.
+
+
+

+ std::size_t cubos::core::data::EmbeddedArchive::child(std::size_t id) const override +

+

Gets the identifier of the first child of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the first child, or 0 if the file is not a directory or is empty.
+
+
+

+ std::unique_ptr<memory::Stream> cubos::core::data::EmbeddedArchive::open(std::size_t id, + File::Handle handle, + File::OpenMode mode) override +

+

Opens a file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
handleHandle to the file.
modeMode to open the file in.
ReturnsFile stream, or nullptr if the file could not be opened.
+

Although a bit hacky, the handle parameter is used to keep a reference to the respective File alive, preventing the file from being destroyed while the stream is open.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1File.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1File.html new file mode 100644 index 0000000000..216d48f3af --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1File.html @@ -0,0 +1,496 @@ + + + + + cubos::core::data::File class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::File class final + +

+

Represents a file in the virtual file system of the engine.

+ +

Instances of this class are always held through a File::Handle, which is just a smart shared pointer.

Files may either be regular files or directories. Directories can have children files, but no data. Regular files are only allowed inside mounted archives, since they must have data associated with them, while the directories are just a way to organize the files.

+
+

Public types

+
+
+ enum class OpenMode { Read, + Write, + ReadWrite } +
+
Possible modes to open files in.
+
+ using Handle = std::shared_ptr<File> +
+
Handle to a file in the Cubos virtual file system.
+
+
+
+

Public functions

+
+
+ auto mount(std::string_view path, + std::unique_ptr<Archive> archive) -> bool +
+
Mounts an archive to a path relative to this file.
+
+ auto unmount(std::string_view path) -> bool +
+
Unmounts an archive from a path relative to this file.
+
+ auto find(std::string_view path) -> Handle +
+
Gets a handle to a file relative to this file.
+
+ auto create(std::string_view path, + bool directory = false) -> Handle +
+
Creates a new file on a path relative to this file.
+
+ auto destroy() -> bool +
+
Marks this file for destruction.
+
+ auto open(OpenMode mode) -> std::unique_ptr<memory::Stream> +
+
Opens this file for reading or writing.
+
+ auto name() const -> std::string_view +
+
Gets the name of this file.
+
+ auto path() const -> std::string_view +
+
Gets the absolute path of this file.
+
+ auto directory() const -> bool +
+
Checks whether this file is a directory.
+
+ auto archive() const -> const std::shared_ptr<Archive>& +
+
Gets the archive this file is in.
+
+ auto id() const -> std::size_t +
+
Gets the identifier of this file on its archive.
+
+ auto parent() const -> Handle +
+
Gets the parent directory of this file.
+
+ auto sibling() const -> Handle +
+
Gets the next sibling of this file.
+
+ auto child() const -> Handle +
+
Gets the first child of this file.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::core::data::File::OpenMode +

+

Possible modes to open files in.

+ + + + + + + + + + + + + + + + +
Enumerators
Read +

Open the file for reading.

+
Write +

Open the file for writing, overwriting any previous changes.

+
ReadWrite +

Open the file for reading or writing data.

+
+
+
+
+

Typedef documentation

+
+

+ using cubos::core::data::File::Handle = std::shared_ptr<File> +

+

Handle to a file in the Cubos virtual file system.

+

This is a smart shared pointer, so that files are not destroyed while being referenced.

+
+
+
+

Function documentation

+
+

+ bool cubos::core::data::File::mount(std::string_view path, + std::unique_ptr<Archive> archive) +

+

Mounts an archive to a path relative to this file.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pathPath relative to this file to mount the archive on.
archiveArchive to mount.
ReturnsWhether the archive was successfully mounted.
+

Creates any parent directories that may be necessary, but the mount point itself must not already exist.

This method fails on the following conditions:

  • path is absolute or invalid.
  • a parent file in the path exists and is not a directory.
  • a parent directory in the path belongs to an archive.
  • a file already exists at the mount point.
+
+
+

+ bool cubos::core::data::File::unmount(std::string_view path) +

+

Unmounts an archive from a path relative to this file.

+ + + + + + + + + + + + + + + + +
Parameters
pathPath relative to this file to unmount the archive from.
ReturnsWhether the archive was successfully unmounted.
+

Removes all of the archive's files from the virtual file system.

This method fails on the following conditions:

  • path is absolute or invalid.
  • any of the files in the path do not exist.
  • the target path is not the mount point for an archive.
+
+
+

+ Handle cubos::core::data::File::find(std::string_view path) +

+

Gets a handle to a file relative to this file.

+ + + + + + + + + + + + + + + + +
Parameters
pathPath relative to this file to get the file from.
ReturnsHandle to the file, or nullptr on failure.
+

Fails if the file does not exist or if the path is absolute or invalid.

+
+
+

+ Handle cubos::core::data::File::create(std::string_view path, + bool directory = false) +

+

Creates a new file on a path relative to this file.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pathRelative path to the file.
directoryWhether the new file should be a directory.
ReturnsHandle to the file, or nullptr on failure.
+

The destination location must be writeable - that is, it must be under a mounted writeable archive. If a file at the given path already exists, it is returned instead. Any parent directories that may be necessary are created.

This method fails on the following conditions:

  • path is absolute or invalid.
  • a parent directory in the path does not exist and cannot be created.
  • a parent directory in the path already exists as a regular file.
  • a file of a different type already exists at the destination.
+
+
+

+ bool cubos::core::data::File::destroy() +

+

Marks this file for destruction.

+ + + + + + + +
ReturnsWhether the file was successfully marked for destruction.
+

Although the file will only be deleted when no more references to it exist, it is immediately removed from the virtual file system and this method is called recursively on all its children.

This method fails on the following conditions:

  • this file is the mount point of an archive.
  • this file does not belong to an archive.
  • this file belongs to a read-only archive.
+
+
+

+ std::unique_ptr<memory::Stream> cubos::core::data::File::open(OpenMode mode) +

+

Opens this file for reading or writing.

+ + + + + + + + + + + + + + + + +
Parameters
modeMode to open the file in.
ReturnsHandle to a file stream, or nullptr on failure.
+

If the file is being written to, blocks until the other threads are done with the file.

This method fails on the following conditions:

  • this file is a directory.
  • this file belongs to a read-only archive and the mode is not OpenMode::Read.
+
+
+

+ std::string_view cubos::core::data::File::name() const +

+

Gets the name of this file.

+ + + + + + + +
ReturnsName of this file.
+
+
+

+ std::string_view cubos::core::data::File::path() const +

+

Gets the absolute path of this file.

+ + + + + + + +
ReturnsAbsolute path of this file.
+
+
+

+ bool cubos::core::data::File::directory() const +

+

Checks whether this file is a directory.

+ + + + + + + +
ReturnsWhether this file is a directory.
+
+
+

+ const std::shared_ptr<Archive>& cubos::core::data::File::archive() const +

+

Gets the archive this file is in.

+ + + + + + + +
ReturnsArchive this file is in, or nullptr if the file is not in an archive.
+
+
+

+ std::size_t cubos::core::data::File::id() const +

+

Gets the identifier of this file on its archive.

+ + + + + + + +
ReturnsIdentifier of this file on its archive, or 0 if it is not in an archive.
+
+
+

+ Handle cubos::core::data::File::parent() const +

+

Gets the parent directory of this file.

+ + + + + + + +
ReturnsFile's parent directory, or nullptr if there isn't one.
+
+
+

+ Handle cubos::core::data::File::sibling() const +

+

Gets the next sibling of this file.

+ + + + + + + +
ReturnsNext sibling, or nullptr if this file is the last child of its parent.
+
+
+

+ Handle cubos::core::data::File::child() const +

+

Gets the first child of this file.

+ + + + + + + +
ReturnsFirst child, or nullptr if this file is not a directory or if it is empty.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileStream.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileStream.html new file mode 100644 index 0000000000..d4bf8fe6da --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileStream.html @@ -0,0 +1,354 @@ + + + + + cubos::core::data::FileStream class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::data::FileStream class final +

+

Wrapper around an implementation-specific file stream which keeps the file alive and does some sanity checks.

+ + + + + + + + + + +
Template parameters
TInner implementation-specific stream type.
+ +

The file is kept alive by storing a handle to it, which prevents it from being destroyed as long as the stream is alive.

+
+

Base classes

+
+
+ class cubos::core::memory::Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ FileStream(File::Handle file, + File::OpenMode mode, + T&& stream) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto read(void* data, + std::size_t size) -> std::size_t override +
+
Reads data from the stream.
+
+ auto write(const void* data, + std::size_t size) -> std::size_t override +
+
Writes data to the stream.
+
+ auto tell() const -> std::size_t override +
+
Gets the current position in the stream.
+
+ void seek(ptrdiff_t offset, + memory::SeekOrigin origin) override +
+
Seeks to a position in the stream.
+
+ auto eof() const -> bool override +
+
Checks if the stream still has content to read.
+
+ auto peek() -> char override +
+
Peeks one byte from the stream.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::data::FileStream<T>::FileStream(File::Handle file, + File::OpenMode mode, + T&& stream) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
fileFile which the stream is reading/writing from/to.
modeMode to open the file in.
streamStream to read/write from/to.
+
+
+

+
+ template<typename T> +
+ std::size_t cubos::core::data::FileStream<T>::read(void* data, + std::size_t size) override +

+

Reads data from the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsNumber of bytes read.
+ +
+
+

+
+ template<typename T> +
+ std::size_t cubos::core::data::FileStream<T>::write(const void* data, + std::size_t size) override +

+

Writes data to the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsNumber of bytes written.
+ +
+
+

+
+ template<typename T> +
+ std::size_t cubos::core::data::FileStream<T>::tell() const override +

+

Gets the current position in the stream.

+ + + + + + + +
ReturnsCurrent position in the stream, or SIZE_MAX if the position is unknown.
+
+
+

+
+ template<typename T> +
+ void cubos::core::data::FileStream<T>::seek(ptrdiff_t offset, + memory::SeekOrigin origin) override +

+

Seeks to a position in the stream.

+ + + + + + + + + + + + + + +
Parameters
offsetOffset to seek to.
originOrigin of the offset.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::data::FileStream<T>::eof() const override +

+

Checks if the stream still has content to read.

+ + + + + + + +
ReturnsWhether the stream has reached the end.
+
+
+

+
+ template<typename T> +
+ char cubos::core::data::FileStream<T>::peek() override +

+

Peeks one byte from the stream.

+ + + + + + + +
ReturnsPeeked byte.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileSystem.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileSystem.html new file mode 100644 index 0000000000..fb81bf9bfb --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1FileSystem.html @@ -0,0 +1,361 @@ + + + + + cubos::core::data::FileSystem class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::FileSystem class final + +

+

Singleton which represents the virtual file system of the engine.

+ +

All filesystem operations in the engine should be done through this class or through a File obtained here.

+
+

Public static functions

+
+
+ static auto root() -> File::Handle +
+
Gets the root file of the virtual file system.
+
+ static auto mount(std::string_view path, + std::unique_ptr<Archive> archive) -> bool +
+
Mounts an archive to an absolute path.
+
+ static auto unmount(std::string_view path) -> bool +
+
Unmounts an archive from an absolute path.
+
+ static auto find(std::string_view path) -> File::Handle +
+
Gets a handle to a file.
+
+ static auto create(std::string_view path, + bool directory = false) -> File::Handle +
+
Creates a new file at the specified absolute path.
+
+ static auto destroy(std::string_view path) -> bool +
+
Marks a file for destruction.
+
+ static auto open(std::string_view path, + File::OpenMode mode) -> std::unique_ptr<memory::Stream> +
+
Opens a file in the virtual file system.
+
+ static auto copy(std::string_view sourcePath, + std::string_view destinationPath) -> bool +
+
Copies a file from the source path to the destination path.
+
+
+
+

Function documentation

+
+

+ static File::Handle cubos::core::data::FileSystem::root() +

+

Gets the root file of the virtual file system.

+ + + + + + + +
ReturnsFile handle.
+
+
+

+ static bool cubos::core::data::FileSystem::mount(std::string_view path, + std::unique_ptr<Archive> archive) +

+

Mounts an archive to an absolute path.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pathAbsolute path to mount the archive on.
archiveArchive to mount.
ReturnsWhether the archive was successfully mounted.
+

Creates any parent directories that may be necessary, but the mount point itself must not already exist.

This method fails on the following conditions:

  • path is relative or invalid.
  • a parent file in the path exists and is not a directory.
  • a parent directory in the path belongs to an archive.
  • a file already exists at the mount point.
+
+
+

+ static bool cubos::core::data::FileSystem::unmount(std::string_view path) +

+

Unmounts an archive from an absolute path.

+ + + + + + + + + + + + + + + + +
Parameters
pathPath to unmount the archive from.
ReturnsWhether the archive was successfully unmounted.
+

Removes all of the archive's files from the virtual file system.

This method fails on the following conditions:

  • path is relative or invalid.
  • any of the files in the path do not exist.
  • the target path is not the mount point of an archive.
+
+
+

+ static File::Handle cubos::core::data::FileSystem::find(std::string_view path) +

+

Gets a handle to a file.

+ + + + + + + + + + + + + + + + +
Parameters
pathAbsolute path to the file.
ReturnsFile handle or nullptr on failure.
+

Fails if the file does not exist or the path is relative or invalid.

+
+
+

+ static File::Handle cubos::core::data::FileSystem::create(std::string_view path, + bool directory = false) +

+

Creates a new file at the specified absolute path.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pathAbsolute path to the file.
directoryWhether the new file should be a directory.
ReturnsFile or nullptr on failure.
+

The destination location must be writeable - that is, it must be under a mounted writeable archive.

If a file at the specified path already exists, it is returned instead. Any parent directories that may be necessary are created.

This method fails on the following conditions:

  • path is relative or invalid.
  • a parent directory in the path does not exist and cannot be created.
  • a parent directory in the path already exists as a regular file.
  • a file of a different type already exists at the destination.
+
+
+

+ static bool cubos::core::data::FileSystem::destroy(std::string_view path) +

+

Marks a file for destruction.

+ + + + + + + + + + + + + + + + +
Parameters
pathAbsolute path of the file to destroy.
ReturnsWhether the file was successfully marked for destruction.
+

Although The file will only be deleted when no more references to it exist, it is immediately removed from the virtual file system.

All children of the file are also marked for destruction.

This method fails on the following conditions:

  • path is relative or invalid.
  • the file does not exist.
  • the file is the mount point of an archive.
  • the file does not belong to an archive.
  • the file belongs to a read-only archive.
+
+
+

+ static std::unique_ptr<memory::Stream> cubos::core::data::FileSystem::open(std::string_view path, + File::OpenMode mode) +

+

Opens a file in the virtual file system.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pathAbsolute path of the file.
modeMode to open the file in.
ReturnsFile stream, or nullptr if an error occurred.
+

If the file is being written to, blocks until the other threads are done with the file.

This method fails on the following conditions:

  • FileSystem::find(path) fails.
  • file->open(mode) fails.
+
+
+

+ static bool cubos::core::data::FileSystem::copy(std::string_view sourcePath, + std::string_view destinationPath) +

+

Copies a file from the source path to the destination path.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
sourcePathAbsolute path of the source file.
destinationPathAbsolute path of the destination file.
ReturnsWhether the file was successfully copied.
+

This method opens the source file in binary mode, reads its contents, and writes them to the destination file. If the destination file already exists, it will be overwritten.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONDeserializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONDeserializer.html new file mode 100644 index 0000000000..0aa112fa0b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONDeserializer.html @@ -0,0 +1,204 @@ + + + + + cubos::core::data::JSONDeserializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::JSONDeserializer class + +

+

Deserializer implementation which allows reading data from a JSON object.

+ +

Before deserializing any data, a JSON object must be fed to the deserializer.

+
+

Base classes

+
+
+ class Deserializer +
+
Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ JSONDeserializer() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void feed(nlohmann::json json) +
+
Feeds a JSON object to be deserialized.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + void* value) -> bool override +
+
Called for each type with no hook defined.
+
+
+
+

Function documentation

+
+

+ void cubos::core::data::JSONDeserializer::feed(nlohmann::json json) +

+

Feeds a JSON object to be deserialized.

+ + + + + + + + + + +
Parameters
jsonJSON object.
+
+
+

+ bool cubos::core::data::JSONDeserializer::decompose(const reflection::Type& type, + void* value) override protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully deserialized.
+

Should recurse by calling read() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONSerializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONSerializer.html new file mode 100644 index 0000000000..62cfe86a86 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1JSONSerializer.html @@ -0,0 +1,200 @@ + + + + + cubos::core::data::JSONSerializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::JSONSerializer class + +

+

Implementation of the abstract Serializer class for serializing to JSON.

+ +
+

Base classes

+
+
+ class Serializer +
+
Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ JSONSerializer() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto output() -> nlohmann::json +
+
Outputs the serialized JSON. write must be called before this.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + const void* value) -> bool override +
+
Called for each type with no hook defined.
+
+
+
+

Function documentation

+
+

+ nlohmann::json cubos::core::data::JSONSerializer::output() +

+

Outputs the serialized JSON. write must be called before this.

+ + + + + + + +
ReturnsJSON.
+
+
+

+ bool cubos::core::data::JSONSerializer::decompose(const reflection::Type& type, + const void* value) override protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully serialized.
+

Should recurse by calling write() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1Serializer.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Serializer.html new file mode 100644 index 0000000000..f19e28267c --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1Serializer.html @@ -0,0 +1,363 @@ + + + + + cubos::core::data::Serializer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::Serializer class + +

+

Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.

+ +

Serializers are type visitors which allow overriding the default serialization behaviour for each type using hooks. Hooks are functions which are called when the serializer encounters a type, and can be used to customize the serialization process.

If a type which can't be further decomposed is encountered for which no hook is defined, the serializer will emit a warning and fail. Implementations should set default hooks for at least the primitive types.

+
+

Derived classes

+
+
+ class BinarySerializer +
+
Implementation of the abstract Serializer class meant to serialize data in a non-readable but fast and compact way.
+
+ class DebugSerializer +
+
Serializer implementation which prints the given data to a stream in a human-readable format not meant to be parsed.
+
+ class JSONSerializer +
+
Implementation of the abstract Serializer class for serializing to JSON.
+
+
+
+

Public types

+
+
+ using Hook = memory::Function<bool(const void*)> +
+
Function type for serialization hooks.
+
+
template<typename T>
+ using TypedHook = memory::Function<bool(const T&)> +
+
Function type for serialization hooks.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Serializer() defaulted +
+
Default constructs.
+
+
+
+

Public functions

+
+
+ auto write(const reflection::Type& type, + const void* value) -> bool +
+
Serialize the given value.
+
+
template<typename T>
+ auto write(const T& value) -> bool +
+
Serialize the given value.
+
+ void hook(const reflection::Type& type, + Hook hook) +
+
Sets the hook to be called on serialization of the given type.
+
+
template<typename T>
+ void hook(TypedHook<T> hook) +
+
Sets the hook to be called on serialization of the given type.
+
+
+
+

Protected functions

+
+
+ auto decompose(const reflection::Type& type, + const void* value) -> bool pure virtual +
+
Called for each type with no hook defined.
+
+
+
+

Typedef documentation

+
+

+
+ template<typename T> +
+ using cubos::core::data::Serializer::TypedHook = memory::Function<bool(const T&)> +

+

Function type for serialization hooks.

+ + + + + + + + + + +
Template parameters
TType.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::data::Serializer::write(const reflection::Type& type, + const void* value) +

+

Serialize the given value.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully serialized.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::data::Serializer::write(const T& value) +

+

Serialize the given value.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType.
Parameters
valueValue.
ReturnsWhether the value was successfully serialized.
+
+
+

+ void cubos::core::data::Serializer::hook(const reflection::Type& type, + Hook hook) +

+

Sets the hook to be called on serialization of the given type.

+ + + + + + + + + + + + + + +
Parameters
typeType.
hookHook.
+
+
+

+
+ template<typename T> +
+ void cubos::core::data::Serializer::hook(TypedHook<T> hook) +

+

Sets the hook to be called on serialization of the given type.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
TType.
Parameters
hookHook.
+
+
+

+ bool cubos::core::data::Serializer::decompose(const reflection::Type& type, + const void* value) pure virtual protected +

+

Called for each type with no hook defined.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
ReturnsWhether the value was successfully serialized.
+

Should recurse by calling write() again as appropriate.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1data_1_1StandardArchive.html b/preview/pr-1379/classcubos_1_1core_1_1data_1_1StandardArchive.html new file mode 100644 index 0000000000..b4c931e5e9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1data_1_1StandardArchive.html @@ -0,0 +1,452 @@ + + + + + cubos::core::data::StandardArchive class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::StandardArchive class + +

+

Archive implementation which reads and writes from/into the OS file system using the standard library.

+ +

Can represent both regular files and directories.

+
+

Base classes

+
+
+ class Archive +
+
Interface for a bridge between the Cubos virtual file system and the real world.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ StandardArchive(const std::filesystem::path& osPath, + bool isDirectory, + bool readOnly) +
+
Constructs pointing to the regular file or directory with the given osPath.
+
+
+
+

Public functions

+
+
+ auto initialized() const -> bool +
+
Checks if the archive was successfully initialized.
+
+ auto create(std::size_t parent, + std::string_view name, + bool directory = false) -> std::size_t override +
+
Creates a new file in the archive.
+
+ auto destroy(std::size_t id) -> bool override +
+
Destroys a regular file or empty directory in the archive.
+
+ auto name(std::size_t id) const -> std::string override +
+
Gets the name of the file with the given id.
+
+ auto directory(std::size_t id) const -> bool override +
+
Checks whether the file with the given id is a directory.
+
+ auto readOnly() const -> bool override +
+
Checks whether the archive is read-only.
+
+ auto parent(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the parent file of the file with the given id.
+
+ auto sibling(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the sibling of the file with the given id.
+
+ auto child(std::size_t id) const -> std::size_t override +
+
Gets the identifier of the first child of the file with the given id.
+
+ auto open(std::size_t id, + File::Handle handle, + File::OpenMode mode) -> std::unique_ptr<memory::Stream> override +
+
Opens a file in the archive.
+
+
+
+

Function documentation

+
+

+ cubos::core::data::StandardArchive::StandardArchive(const std::filesystem::path& osPath, + bool isDirectory, + bool readOnly) +

+

Constructs pointing to the regular file or directory with the given osPath.

+ + + + + + + + + + + + + + + + + + +
Parameters
osPathThe path to the file/directory in the real file system.
isDirectoryWhether the path is a directory or a file.
readOnlyTrue if the archive is read-only, false otherwise.
+

If readOnly is false and there's no file or directory at osPath, then it is created.

+
+
+

+ bool cubos::core::data::StandardArchive::initialized() const +

+

Checks if the archive was successfully initialized.

+ + + + + + + +
ReturnsTrue if the archive was successfully initialized, false otherwise.
+
+
+

+ std::size_t cubos::core::data::StandardArchive::create(std::size_t parent, + std::string_view name, + bool directory = false) override +

+

Creates a new file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
parentParent directory of the new file.
nameName of the new file.
directoryWhether the new file is a directory or not.
ReturnsIdentifier of the file, or 0 if the file could not be created.
+

The first child of the parent will have its sibling set to the new file and then be replaced by the new file.

+
+
+

+ bool cubos::core::data::StandardArchive::destroy(std::size_t id) override +

+

Destroys a regular file or empty directory in the archive.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file was destroyed successfully.
+

Will be replaced in the tree by its sibling.

+
+
+

+ std::string cubos::core::data::StandardArchive::name(std::size_t id) const override +

+

Gets the name of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsName of the file.
+
+
+

+ bool cubos::core::data::StandardArchive::directory(std::size_t id) const override +

+

Checks whether the file with the given id is a directory.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsWhether the file is a directory or not.
+
+
+

+ bool cubos::core::data::StandardArchive::readOnly() const override +

+

Checks whether the archive is read-only.

+ + + + + + + +
ReturnsWhether the archive is read-only.
+
+
+

+ std::size_t cubos::core::data::StandardArchive::parent(std::size_t id) const override +

+

Gets the identifier of the parent file of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the parent file, or 0 if the file is the root file.
+
+
+

+ std::size_t cubos::core::data::StandardArchive::sibling(std::size_t id) const override +

+

Gets the identifier of the sibling of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the sibling, or 0 if there are no more files in the parent.
+
+
+

+ std::size_t cubos::core::data::StandardArchive::child(std::size_t id) const override +

+

Gets the identifier of the first child of the file with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
ReturnsIdentifier of the first child, or 0 if the file is not a directory or is empty.
+
+
+

+ std::unique_ptr<memory::Stream> cubos::core::data::StandardArchive::open(std::size_t id, + File::Handle handle, + File::OpenMode mode) override +

+

Opens a file in the archive.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the file.
handleHandle to the file.
modeMode to open the file in.
ReturnsFile stream, or nullptr if the file could not be opened.
+

Although a bit hacky, the handle parameter is used to keep a reference to the respective File alive, preventing the file from being destroyed while the stream is open.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1ArchetypeGraph.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1ArchetypeGraph.html new file mode 100644 index 0000000000..618e99f273 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1ArchetypeGraph.html @@ -0,0 +1,345 @@ + + + + + cubos::core::ecs::ArchetypeGraph class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ArchetypeGraph class + +

+

Stores which column types each archetype holds and the edges which connect them.

+ +

These edges are bidirectional and indicate the addition or removal of column types, depending on the direction being taken. Neighboring archetypes (which have only one differing column type) are not always connected by an edge, as they are only generated the first time the traversal is done between those two archetypes.

In practice, this means that the first time a component is added to an entity of a given archetype, even if the target archetype already exists, a slow lookup must first be made. We cache the result of the lookup as a new edge, such that the next time the same component type is added, we just traverse the edge to find the target archetype's id.

+
+

Constructors, destructors, conversion operators

+
+
+ ArchetypeGraph() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void reset() +
+
Resets the graph to its initial state.
+
+ auto contains(ArchetypeId archetype, + ColumnId id) const -> bool +
+
Checks if the given archetype contains the column type with the given id.
+
+ auto with(ArchetypeId source, + ColumnId id) -> ArchetypeId +
+
Returns an archetype with same identifiers as the given source archetype, but with an extra column type with the given id.
+
+ auto without(ArchetypeId source, + ColumnId id) -> ArchetypeId +
+
Returns an archetype with same identifiers as the given source archetype, except for the column type with the given id, which is excluded.
+
+ auto first(ArchetypeId archetype) const -> ColumnId +
+
Returns the first column type in the set of column types held by the given archetype.
+
+ auto next(ArchetypeId archetype, + ColumnId id) const -> ColumnId +
+
Returns the next column type in the set of column types held by the given archetype.
+
+ auto collect(ArchetypeId archetype, + std::vector<ArchetypeId>& supersets, + std::size_t seen = 0) const -> std::size_t +
+
Collects all of the archetypes which are supersets of the given archetype.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::ArchetypeGraph::reset() +

+

Resets the graph to its initial state.

+

Previously returned identifiers become invalid, as they might be reused.

+
+
+

+ bool cubos::core::ecs::ArchetypeGraph::contains(ArchetypeId archetype, + ColumnId id) const +

+

Checks if the given archetype contains the column type with the given id.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype.
idColumn type identifier.
ReturnsWhether the archetype contains the column type.
+
+
+

+ ArchetypeId cubos::core::ecs::ArchetypeGraph::with(ArchetypeId source, + ColumnId id) +

+

Returns an archetype with same identifiers as the given source archetype, but with an extra column type with the given id.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
sourceSource archetype.
idExtra column type identifier.
ReturnsTarget archetype.
+

The column type with the given id must not already be present in source.

+
+
+

+ ArchetypeId cubos::core::ecs::ArchetypeGraph::without(ArchetypeId source, + ColumnId id) +

+

Returns an archetype with same identifiers as the given source archetype, except for the column type with the given id, which is excluded.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
sourceSource archetype.
idExcluded column type identifier.
ReturnsTarget archetype.
+

The given column type with the given id must be present in source.

+
+
+

+ ColumnId cubos::core::ecs::ArchetypeGraph::first(ArchetypeId archetype) const +

+

Returns the first column type in the set of column types held by the given archetype.

+ + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype.
ReturnsFirst column type, or ColumnId::Invalid if the archetype is Empty.
+
+
+

+ ColumnId cubos::core::ecs::ArchetypeGraph::next(ArchetypeId archetype, + ColumnId id) const +

+

Returns the next column type in the set of column types held by the given archetype.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype.
idCurrent column type.
ReturnsNext column type, or ColumnId::Invalid if there is no next column type.
+
+
+

+ std::size_t cubos::core::ecs::ArchetypeGraph::collect(ArchetypeId archetype, + std::vector<ArchetypeId>& supersets, + std::size_t seen = 0) const +

+

Collects all of the archetypes which are supersets of the given archetype.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
archetypeBase archetype.
supersets outSet to insert new found archetypes into.
seenMaximum previously seen archetype. To be used after the first call to this.
ReturnsMaximum seen archetype.
+

Returns the largest identifier checked during the call, which can then be used to only check new archetypes in later calls.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Blueprint.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Blueprint.html new file mode 100644 index 0000000000..064ab3ea80 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Blueprint.html @@ -0,0 +1,549 @@ + + + + + cubos::core::ecs::Blueprint class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Blueprint class final + +

+

Collection of entities and their respective components and relations.

+ +

Blueprints are in a way the 'Prefab' of Cubos They act as a tiny World which can then be spawned into an actual World, as many times as needed.

When a blueprint is spawned, all of its components and relations are scanned using the Reflection system for any references to other entities in the blueprint. These references are then replaced with the actual spawned entities. This has the side effect that if you do not expose an Entity field to the Reflection system, it will not be replaced and thus continue referencing the original entity in the blueprint.

+
+

Public types

+
+
+ using Create = Entity(*)(void*userData, std::string name) +
+
Function used by instantiate to create entities.
+
+ using Add = void(*)(void*userData, Entity entity, memory::AnyValue component) +
+
Function used by instantiate to add components to entities.
+
+ using Relate = void(*)(void*userData, Entity fromEntity, Entity toEntity, memory::AnyValue relation) +
+
Function used by instantiate to add relations to entities.
+
+
+
+

Public static functions

+
+
+ static auto validEntityName(const std::string& name) -> bool +
+
Checks if the given name is a valid entity name.
+
+
+
+

Public functions

+
+
+ auto create(std::string name) -> Entity +
+
Creates a new entity in the blueprint and returns it.
+
+ void add(Entity entity, + memory::AnyValue component) +
+
Adds a component to an entity. Overwrites the existing component, if there's any.
+
+
template<typename... Ts>
+ void add(Entity entity, + Ts... components) +
+
Adds components to an entity. Overwrites the existing components, if there's any.
+
+ void relate(Entity fromEntity, + Entity toEntity, + memory::AnyValue relation) +
+
Adds a relation between two entities. Overwrites the existing relation, if there's any.
+
+
template<typename T>
+ void relate(Entity fromEntity, + Entity toEntity, + T relation) +
+
Adds a relation between two entities. Overwrites the existing relation, if there's any.
+
+ void merge(const std::string& prefix, + const Blueprint& other) +
+
Merges another blueprint into this one.
+
+ void clear() +
+
Clears the blueprint.
+
+ auto bimap() const -> const memory::UnorderedBimap<Entity, std::string, EntityHash>& +
+
Returns a bimap which maps entities to their names.
+
+ void instantiate(void* userData, + Create create, + Add add, + Relate relate, + bool withName) const +
+
Instantiates the blueprint by calling the given functions.
+
+
template<typename C, typename A, typename R>
+ void instantiate(C create, + A add, + R relate, + bool withName) const +
+
Instantiates the blueprint by calling the given functors.
+
+ auto entities() const -> memory::UnorderedBimap<Entity, std::string, EntityHash> +
+
Gets the map relating entities to their name.
+
+ auto components() const -> memory::TypeMap<EntityMap<memory::AnyValue>> +
+
Gets the map relating types of components to maps of entities to the component values.
+
+ auto relations() const -> memory::TypeMap<EntityMap<EntityMap<memory::AnyValue>>> +
+
Gets the map relating types of relations to maps of entities to maps of entities to the component values.
+
+
+
+

Function documentation

+
+

+ static bool cubos::core::ecs::Blueprint::validEntityName(const std::string& name) +

+

Checks if the given name is a valid entity name.

+ + + + + + + +
ReturnsWhether the name is valid.
+

Entity names must contain only lowercase alphanumerical characters and hyphens.

+
+
+

+ Entity cubos::core::ecs::Blueprint::create(std::string name) +

+

Creates a new entity in the blueprint and returns it.

+ + + + + + + + + + + + + + + + +
Parameters
nameEntity name.
ReturnsEntity.
+

An entity with the same name must not exist. The name must be valid.

+
+
+

+ void cubos::core::ecs::Blueprint::add(Entity entity, + memory::AnyValue component) +

+

Adds a component to an entity. Overwrites the existing component, if there's any.

+ + + + + + + + + + + + + + +
Parameters
entityEntity.
componentComponent to move.
+
+
+

+
+ template<typename... Ts> +
+ void cubos::core::ecs::Blueprint::add(Entity entity, + Ts... components) +

+

Adds components to an entity. Overwrites the existing components, if there's any.

+ + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TsComponent types.
Parameters
entityEntity.
componentsComponents to move.
+
+
+

+ void cubos::core::ecs::Blueprint::relate(Entity fromEntity, + Entity toEntity, + memory::AnyValue relation) +

+

Adds a relation between two entities. Overwrites the existing relation, if there's any.

+ + + + + + + + + + + + + + + + + + +
Parameters
fromEntityFrom entity.
toEntityTo entity.
relationRelation to move.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::Blueprint::relate(Entity fromEntity, + Entity toEntity, + T relation) +

+

Adds a relation between two entities. Overwrites the existing relation, if there's any.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromEntityFrom entity.
toEntityTo entity.
relationRelation to move.
+
+
+

+ void cubos::core::ecs::Blueprint::merge(const std::string& prefix, + const Blueprint& other) +

+

Merges another blueprint into this one.

+ + + + + + + + + + + + + + +
Parameters
prefixName to prefix with the merged blueprint.
otherBlueprint to merge.
+

Entities in the other blueprint will have their names prefixed with the specified string.

+
+
+

+ const memory::UnorderedBimap<Entity, std::string, EntityHash>& cubos::core::ecs::Blueprint::bimap() const +

+

Returns a bimap which maps entities to their names.

+ + + + + + + +
ReturnsBimap of entities to names.
+
+
+

+ void cubos::core::ecs::Blueprint::instantiate(void* userData, + Create create, + Add add, + Relate relate, + bool withName) const +

+

Instantiates the blueprint by calling the given functions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
userDataUser data to pass into the functions.
createFunction used to create entities.
addFunction used to add components to entities.
relateFunction used to add relations to entities.
withNameWhether to add the 'Name' component to instantiated entities.
+
+
+

+
+ template<typename C, typename A, typename R> +
+ void cubos::core::ecs::Blueprint::instantiate(C create, + A add, + R relate, + bool withName) const +

+

Instantiates the blueprint by calling the given functors.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
CCreate functor type.
AAdd functor type.
RRelate functor type.
Parameters
createFunctor used to create entities.
addFunctor used to add components to entities.
relateFunctor used to add relations to entities.
withNameWhether to use the entity names from the blueprint.
+
+
+

+ memory::UnorderedBimap<Entity, std::string, EntityHash> cubos::core::ecs::Blueprint::entities() const +

+

Gets the map relating entities to their name.

+ + + + + + + +
ReturnsBimap relating entities and names
+
+
+

+ memory::TypeMap<EntityMap<memory::AnyValue>> cubos::core::ecs::Blueprint::components() const +

+

Gets the map relating types of components to maps of entities to the component values.

+ + + + + + + +
ReturnsTypeMap of an EntityMap to component values
+
+
+

+ memory::TypeMap<EntityMap<EntityMap<memory::AnyValue>>> cubos::core::ecs::Blueprint::relations() const +

+

Gets the map relating types of relations to maps of entities to maps of entities to the component values.

+ + + + + + + +
ReturnsTypeMap of an EntityMap to another EntityMap to component values
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1CommandBuffer.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1CommandBuffer.html new file mode 100644 index 0000000000..826a1a8ad6 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1CommandBuffer.html @@ -0,0 +1,421 @@ + + + + + cubos::core::ecs::CommandBuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::CommandBuffer class final + +

+

Stores commands to execute them later.

+ +
+

Constructors, destructors, conversion operators

+
+
+ CommandBuffer(World& world) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void insertResource(memory::AnyValue value) +
+
Inserts a resource into the world.
+
+ void eraseResource(const reflection::Type& type) +
+
Removes a resource from the world.
+
+ auto create() -> Entity +
+
Creates a new entity.
+
+ void destroy(Entity entity) +
+
Destroys an entity.
+
+ auto spawn(const Blueprint& blueprint, + bool withName = true) -> std::unordered_map<std::string, Entity> +
+
Spawns a blueprint into the world.
+
+ void add(Entity entity, + const reflection::Type& type, + void* value) +
+
Adds a component to an entity.
+
+ void remove(Entity entity, + const reflection::Type& type) +
+
Removes a component from an entity.
+
+ void relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) +
+
Inserts a relation between the two given entities.
+
+ void unrelate(Entity from, + Entity to, + const reflection::Type& type) +
+
Removes the relation, if there's any, between the two given entities.
+
+ void push(memory::Function<void(World&)> command) +
+
Pushes a command.
+
+ void commit() +
+
Commits the commands to the world.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::CommandBuffer::CommandBuffer(World& world) +

+

Constructs.

+ + + + + + + + + + +
Parameters
worldWorld to which the commands will be applied.
+
+
+

+ void cubos::core::ecs::CommandBuffer::insertResource(memory::AnyValue value) +

+

Inserts a resource into the world.

+ + + + + + + + + + +
Parameters
valueResource value.
+
+
+

+ void cubos::core::ecs::CommandBuffer::eraseResource(const reflection::Type& type) +

+

Removes a resource from the world.

+ + + + + + + + + + +
Parameters
typeResource type.
+
+
+

+ Entity cubos::core::ecs::CommandBuffer::create() +

+

Creates a new entity.

+ + + + + + + +
ReturnsEntity identifier.
+
+
+

+ void cubos::core::ecs::CommandBuffer::destroy(Entity entity) +

+

Destroys an entity.

+ + + + + + + + + + +
Parameters
entityEntity identifier.
+
+
+

+ std::unordered_map<std::string, Entity> cubos::core::ecs::CommandBuffer::spawn(const Blueprint& blueprint, + bool withName = true) +

+

Spawns a blueprint into the world.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
blueprintBlueprint to spawn.
withNameWhether to use the entity names from the blueprint.
ReturnsMap of entity names to their identifiers.
+
+
+

+ void cubos::core::ecs::CommandBuffer::add(Entity entity, + const reflection::Type& type, + void* value) +

+

Adds a component to an entity.

+ + + + + + + + + + + + + + + + + + +
Parameters
entityEntity identifier.
typeComponent type.
valueComponent value to be moved.
+
+
+

+ void cubos::core::ecs::CommandBuffer::remove(Entity entity, + const reflection::Type& type) +

+

Removes a component from an entity.

+ + + + + + + + + + + + + + +
Parameters
entityEntity identifier.
typeComponent type.
+
+
+

+ void cubos::core::ecs::CommandBuffer::relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) +

+

Inserts a relation between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
valueRelation value to move.
+

If the relation already exists, it is overwritten.

+
+
+

+ void cubos::core::ecs::CommandBuffer::unrelate(Entity from, + Entity to, + const reflection::Type& type) +

+

Removes the relation, if there's any, between the two given entities.

+ + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
+
+
+

+ void cubos::core::ecs::CommandBuffer::push(memory::Function<void(World&)> command) +

+

Pushes a command.

+ + + + + + + + + + +
Parameters
commandCommand function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Commands.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Commands.html new file mode 100644 index 0000000000..8d07e7cd53 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Commands.html @@ -0,0 +1,1143 @@ + + + + + cubos::core::ecs::Commands class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Commands class final + +

+

System argument used to write ECS commands and execute them at a later time.

+ +

Internally wraps a reference to a CommandBuffer object.

+
+

Constructors, destructors, conversion operators

+
+
+ Commands(CommandBuffer& buffer) +
+
Constructs.
+
+ Commands(Commands&&) defaulted +
+
Move constructor.
+
+ EntityBuilder(CommandBuffer& buffer, + Entity entity) +
+
Constructs.
+
+ BlueprintBuilder(CommandBuffer& buffer, + std::unordered_map<std::string, Entity> nameToEntity) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void insertResource(memory::AnyValue value) +
+
Inserts a resource into the world.
+
+
template<typename T>
+ void insertResource(T value) +
+
Inserts a resource into the world.
+
+
template<typename T, typename... TArgs>
+ void emplaceResource(TArgs && ... args) +
+
Emplaces a resource into the world. Directly constructs the resource in place.
+
+ void eraseResource(const reflection::Type& type) +
+
Removes a resource from the world.
+
+
template<typename T>
+ void eraseResource() +
+
Removes a resource from the world.
+
+ auto create() -> EntityBuilder +
+
Creates a new entity.
+
+ void destroy(Entity entity) +
+
Destroys an entity.
+
+ auto spawn(const Blueprint& blueprint, + bool withName = true) -> BlueprintBuilder +
+
Spawns a blueprint into the world.
+
+ auto add(Entity entity, + const reflection::Type& type, + void* value) -> Commands& +
+
Adds a component to an entity.
+
+
template<typename T>
+ auto add(Entity entity, + T value) -> Commands& +
+
Adds a component to an entity.
+
+ auto remove(Entity entity, + const reflection::Type& type) -> Commands& +
+
Removes a component from an entity.
+
+
template<typename T>
+ auto remove(Entity entity) -> Commands& +
+
Removes a component from an entity.
+
+ auto relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) -> Commands& +
+
Inserts a relation between the two given entities.
+
+
template<typename T>
+ auto relate(Entity from, + Entity to, + T value) -> Commands& +
+
Inserts a relation between the two given entities.
+
+ auto unrelate(Entity from, + Entity to, + const reflection::Type& type) -> Commands& +
+
Removes the relation, if there's any, between the two given entities.
+
+
template<typename T>
+ auto unrelate(Entity from, + Entity to) -> Commands& +
+
Removes the relation, if there's any, between the two given entities.
+
+ auto entity() const -> Entity +
+
Gets the entity this builder is modifying.
+
+ auto named(std::string name) -> EntityBuilder& +
+
Adds a Name component to the entity.
+
+ auto add(const reflection::Type& type, + void* value) -> EntityBuilder& +
+
Adds a component to the entity.
+
+
template<typename T>
+ auto add(T value) -> EntityBuilder& +
+
Adds a component to the entity.
+
+ auto relatedFrom(Entity entity, + const reflection::Type& type, + void* value) -> EntityBuilder& +
+
Adds an incoming relation from the given entity to this entity.
+
+
template<typename T>
+ auto relatedFrom(Entity entity, + T value) -> EntityBuilder& +
+
Adds an incoming relation from the given entity to this entity.
+
+ auto relatedTo(Entity entity, + const reflection::Type& type, + void* value) -> EntityBuilder& +
+
Adds an outgoing relation from this entity to the given entity.
+
+
template<typename T>
+ auto relatedTo(Entity entity, + T value) -> EntityBuilder& +
+
Adds an outgoing relation from this entity to the given entity.
+
+ auto entity(const std::string& name) const -> Entity +
+
Gets an entity of the spawned blueprint.
+
+ auto add(const std::string& name, + const reflection::Type& type, + void* value) -> BlueprintBuilder& +
+
Adds a component to an entity of the blueprint.
+
+
template<typename T>
+ auto add(const std::string& name, + T value) -> BlueprintBuilder& +
+
Adds a component to an entity of the blueprint.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::Commands::Commands(CommandBuffer& buffer) +

+

Constructs.

+ + + + + + + + + + +
Parameters
bufferCommand buffer to write to.
+
+
+

+ cubos::core::ecs::Commands::EntityBuilder(CommandBuffer& buffer, + Entity entity) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
bufferCommand buffer.
entityEntity being modified.
+
+
+

+ void cubos::core::ecs::Commands::insertResource(memory::AnyValue value) +

+

Inserts a resource into the world.

+ + + + + + + + + + +
Parameters
valueResource value.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::Commands::insertResource(T value) +

+

Inserts a resource into the world.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
TResource type.
Parameters
valueResource value.
+
+
+

+
+ template<typename T, typename... TArgs> +
+ void cubos::core::ecs::Commands::emplaceResource(TArgs && ... args) +

+

Emplaces a resource into the world. Directly constructs the resource in place.

+ + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TResource type.
TArgsArgument types.
Parameters
argsArguments.
+

This is useful when the resource doesn't have a move constructor, for example, due to not implementing reflection.

+
+
+

+ void cubos::core::ecs::Commands::eraseResource(const reflection::Type& type) +

+

Removes a resource from the world.

+ + + + + + + + + + +
Parameters
typeResource type.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::Commands::eraseResource() +

+

Removes a resource from the world.

+ + + + + + + + + + +
Template parameters
TResource type.
+
+
+

+ EntityBuilder cubos::core::ecs::Commands::create() +

+

Creates a new entity.

+ + + + + + + +
ReturnsBuilder which can be used to modify the created entity.
+
+
+

+ void cubos::core::ecs::Commands::destroy(Entity entity) +

+

Destroys an entity.

+ + + + + + + + + + +
Parameters
entityEntity identifier.
+
+
+

+ BlueprintBuilder cubos::core::ecs::Commands::spawn(const Blueprint& blueprint, + bool withName = true) +

+

Spawns a blueprint into the world.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
blueprintBlueprint to spawn.
withNameWhether to use the entity names from the blueprint.
ReturnsBlueprint builder.
+
+
+

+ Commands& cubos::core::ecs::Commands::add(Entity entity, + const reflection::Type& type, + void* value) +

+

Adds a component to an entity.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
entityEntity identifier.
typeComponent type.
valueComponent value.
ReturnsCommands.
+
+
+

+
+ template<typename T> +
+ Commands& cubos::core::ecs::Commands::add(Entity entity, + T value) +

+

Adds a component to an entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
Parameters
entityEntity identifier.
valueComponent value.
ReturnsCommands.
+
+
+

+ Commands& cubos::core::ecs::Commands::remove(Entity entity, + const reflection::Type& type) +

+

Removes a component from an entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
entityEntity identifier.
typeComponent type.
ReturnsCommands.
+
+
+

+
+ template<typename T> +
+ Commands& cubos::core::ecs::Commands::remove(Entity entity) +

+

Removes a component from an entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
Parameters
entityEntity identifier.
ReturnsCommands.
+
+
+

+ Commands& cubos::core::ecs::Commands::relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) +

+

Inserts a relation between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
valueRelation value to move.
ReturnsCommands.
+

If the relation already exists, it is overwritten.

+
+
+

+
+ template<typename T> +
+ Commands& cubos::core::ecs::Commands::relate(Entity from, + Entity to, + T value) +

+

Inserts a relation between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
valueRelation value.
ReturnsCommands.
+

If the relation already exists, it is overwritten.

+
+
+

+ Commands& cubos::core::ecs::Commands::unrelate(Entity from, + Entity to, + const reflection::Type& type) +

+

Removes the relation, if there's any, between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
ReturnsCommands.
+
+
+

+
+ template<typename T> +
+ Commands& cubos::core::ecs::Commands::unrelate(Entity from, + Entity to) +

+

Removes the relation, if there's any, between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
ReturnsCommands.
+
+
+

+ Entity cubos::core::ecs::Commands::entity() const +

+

Gets the entity this builder is modifying.

+ + + + + + + +
ReturnsEntity identifier.
+
+
+

+ EntityBuilder& cubos::core::ecs::Commands::named(std::string name) +

+

Adds a Name component to the entity.

+ + + + + + + + + + + + + + + + +
Parameters
nameEntity name.
ReturnsReference to this builder, for chaining.
+
+
+

+ EntityBuilder& cubos::core::ecs::Commands::add(const reflection::Type& type, + void* value) +

+

Adds a component to the entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
valueComponent value.
ReturnsReference to this builder, for chaining.
+
+
+

+
+ template<typename T> +
+ EntityBuilder& cubos::core::ecs::Commands::add(T value) +

+

Adds a component to the entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
Parameters
valueComponent value.
ReturnsReference to this builder, for chaining.
+
+
+

+ EntityBuilder& cubos::core::ecs::Commands::relatedFrom(Entity entity, + const reflection::Type& type, + void* value) +

+

Adds an incoming relation from the given entity to this entity.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
entityEntity.
typeRelation type.
valueRelation value.
ReturnsReference to this builder, for chaining.
+
+
+

+
+ template<typename T> +
+ EntityBuilder& cubos::core::ecs::Commands::relatedFrom(Entity entity, + T value) +

+

Adds an incoming relation from the given entity to this entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
valueRelation value.
ReturnsReference to this builder, for chaining.
+
+
+

+ EntityBuilder& cubos::core::ecs::Commands::relatedTo(Entity entity, + const reflection::Type& type, + void* value) +

+

Adds an outgoing relation from this entity to the given entity.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
entityEntity.
typeRelation type.
valueRelation value.
ReturnsReference to this builder, for chaining.
+
+
+

+
+ template<typename T> +
+ EntityBuilder& cubos::core::ecs::Commands::relatedTo(Entity entity, + T value) +

+

Adds an outgoing relation from this entity to the given entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
valueRelation value.
ReturnsReference to this builder, for chaining.
+
+
+

+ Entity cubos::core::ecs::Commands::entity(const std::string& name) const +

+

Gets an entity of the spawned blueprint.

+ + + + + + + + + + + + + + + + +
Parameters
nameEntity name.
ReturnsEntity identifier.
+

Aborts if the name does not match any entity of the blueprint.

+
+
+

+ BlueprintBuilder& cubos::core::ecs::Commands::add(const std::string& name, + const reflection::Type& type, + void* value) +

+

Adds a component to an entity of the blueprint.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameEntity name.
typeComponent Type.
valueComponent value.
ReturnsReference to this builder, for chaining.
+

Aborts if name does not match any entity of the blueprint.

+
+
+

+
+ template<typename T> +
+ BlueprintBuilder& cubos::core::ecs::Commands::add(const std::string& name, + T value) +

+

Adds a component to an entity of the blueprint.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
Parameters
nameEntity name.
valueComponent value.
ReturnsReference to this builder, for chaining.
+

Aborts if name does not match any entity of the blueprint.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Cubos.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Cubos.html new file mode 100644 index 0000000000..111df71874 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Cubos.html @@ -0,0 +1,1936 @@ + + + + + cubos::core::ecs::Cubos class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Cubos class final + +

+

Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Cubos() +
+
Constructs an empty application without arguments.
+
+ Cubos(int argc, + char** argv) +
+
Constructs an empty application with arguments.
+
+ TagBuilder(Cubos& cubos, + std::string name, + bool isStartup, + Planner::TagId tagId) +
+
Constructs.
+
+ SystemBuilder(Cubos& cubos, + bool isStartup, + std::string name) +
+
Constructs.
+
+ ObserverBuilder(Cubos& cubos, + std::string name) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto plugin(Plugin plugin) -> Cubos& +
+
Adds a new plugin as a sub-plugin of the current plugin.
+
+ auto depends(Plugin plugin) -> Cubos& +
+
Marks the given plugin as a dependency of the current plugin.
+
+ auto inject(Plugin target, + Plugin plugin) -> Cubos& +
+
Marks the target plugin so that when it is added, it is replaced by the given plugin.
+
+ auto uninitResource(const reflection::Type& type) -> Cubos& +
+
Registers a new resource type, without initializing it.
+
+ auto resource(memory::AnyValue value) -> Cubos& +
+
Registers a new resource type with the given initial value.
+
+
template<typename T>
+ auto uninitResource() -> Cubos& +
+
Registers a new resource type, without initializing it.
+
+
template<typename T, typename... TArgs>
+ auto resource(TArgs && ... args) -> Cubos& +
+
Registers a new resource type, constructing it with the given arguments.
+
+ auto component(const reflection::Type& type) -> Cubos& +
+
Registers a new component type.
+
+
template<typename T>
+ auto component() -> Cubos& +
+
Registers a new component type.
+
+ auto relation(const reflection::Type& type) -> Cubos& +
+
Registers a new relation type.
+
+
template<typename T>
+ auto relation() -> Cubos& +
+
Registers a new relation type.
+
+
template<typename T>
+ auto event() -> Cubos& +
+
Registers a new event type.
+
+ auto tag(const Tag& tag) -> TagBuilder +
+
Registers a new tag. Returns a builder used to configure tagged systems.
+
+ auto startupTag(const Tag& tag) -> TagBuilder +
+
Registers a new startup tag. Returns a builder used to configure tagged systems.
+
+ auto system(std::string name) -> SystemBuilder +
+
Returns a new builder used to add a system to the engine.
+
+ auto startupSystem(std::string name) -> SystemBuilder +
+
Returns a new builder used to add a startup system to the engine.
+
+ auto observer(std::string name) -> ObserverBuilder +
+
Returns a new builder used to add an observer to the engine.
+
+ auto typeServer() -> memory::Opt<reflection::TypeServer&> +
+
Returns the type server to be used by the engine, in case debugging is enabled.
+
+ void reset() +
+
Resets the application to its initial state.
+
+ void start() +
+
Runs the application's startup systems.
+
+ auto update() -> bool +
+
Runs the application's main systems.
+
+ void run() +
+
Runs the application's main loop.
+
+ auto started() const -> bool +
+
Returns whether the application has been started.
+
+ auto shouldQuit() const -> bool +
+
Returns whether the application should quit.
+
+ auto before(const Tag& tag) -> TagBuilder& +
+
Makes all tagged systems run before systems with the given tag.
+
+ auto after(const Tag& tag) -> TagBuilder& +
+
Makes all tagged systems run after systems with the given tag.
+
+ auto tagged(const Tag& tag) -> TagBuilder& +
+
Tags all tagged systems with the given tag.
+
+ auto addTo(const Tag& tag) -> TagBuilder& +
+
Equivalent to calling tagged on the given tag.
+
+ auto runIf(auto func) -> TagBuilder& +
+
Makes all systems within the tag run only if the given condition evaluates to true.
+
+ auto repeatWhile(auto func) -> TagBuilder& +
+
Makes all systems within the tag repeat while the given condition evaluates to true.
+
+ auto tagged(const Tag& tag) && -> SystemBuilder&& +
+
Adds a tag to the system.
+
+ auto before(const Tag& tag) && -> SystemBuilder&& +
+
Forces this system to only run after all systems with the given tag have finished.
+
+ auto after(const Tag& tag) && -> SystemBuilder&& +
+
Forces all systems with the given tag to run only after this system has finished.
+
+ auto entity(int target = -1) && -> SystemBuilder&& +
+
Forces the next entity query argument to have the given target.
+
+ auto with(const reflection::Type& type, + int target = -1) && -> SystemBuilder&& +
+
Forces the given target of the next query argument to have the following component.
+
+
template<typename T>
+ auto with(int target = -1) && -> SystemBuilder&& +
+
+
+ auto withOpt(const reflection::Type& type, + int target = -1) && -> SystemBuilder&& +
+
Accepts the following component from the given target of the next query argument.
+
+
template<typename T>
+ auto withOpt(int target = -1) && -> SystemBuilder&& +
+
+
+ auto without(const reflection::Type& type, + int target = -1) && -> SystemBuilder&& +
+
Forces the given target of the next query argument to not have the following component.
+
+
template<typename T>
+ auto without(int target = -1) && -> SystemBuilder&& +
+
+
+ auto related(const reflection::Type& type, + int fromTarget = -1, + int toTarget = -1) && -> SystemBuilder&& +
+
Forces the given targets of the next query argument to be related with the given relation.
+
+
template<typename T>
+ auto related(int fromTarget = -1, + int toTarget = -1) && -> SystemBuilder&& +
+
+
+ auto related(const reflection::Type& type, + Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && -> SystemBuilder&& +
+
Forces the given targets of the next query argument to be related with the given tree relation.
+
+
template<typename T>
+ auto related(Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && -> SystemBuilder&& +
+
+
+ auto other() && -> SystemBuilder&& +
+
Makes the following argument options relative to the next argument.
+
+ auto onlyIf(auto function) && -> SystemBuilder&& +
+
Makes the system only run if the given condition evaluates to true.
+
+ void call(auto function) && +
+
Finishes building the system with the given function.
+
+ auto onAdd(const reflection::Type& type, + int target = -1) && -> ObserverBuilder&& +
+
Triggers the observer whenever the given component is added to an entity.
+
+
template<typename T>
+ auto onAdd(int target = -1) && -> ObserverBuilder&& +
+
+
+ auto onRemove(const reflection::Type& type, + int target = -1) && -> ObserverBuilder&& +
+
Triggers the observer whenever the given component is removed from an entity, or an entity with it is destroyed.
+
+
template<typename T>
+ auto onRemove(int target = -1) && -> ObserverBuilder&& +
+
+
+ auto entity(int target = -1) && -> ObserverBuilder&& +
+
Forces the next entity query argument to have the given target.
+
+ auto with(const reflection::Type& type, + int target = -1) && -> ObserverBuilder&& +
+
Forces the given target of the next query argument to have the following component.
+
+
template<typename T>
+ auto with(int target = -1) && -> ObserverBuilder&& +
+
+
+ auto without(const reflection::Type& type, + int target = -1) && -> ObserverBuilder&& +
+
Forces the given target of the next query argument to not have the following component.
+
+
template<typename T>
+ auto without(int target = -1) && -> ObserverBuilder&& +
+
+
+ auto related(const reflection::Type& type, + int fromTarget = -1, + int toTarget = -1) && -> ObserverBuilder&& +
+
Forces the given targets of the next query argument to be related with the given relation.
+
+
template<typename T>
+ auto related(int fromTarget = -1, + int toTarget = -1) && -> ObserverBuilder&& +
+
+
+ auto related(const reflection::Type& type, + Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && -> ObserverBuilder&& +
+
Forces the given targets of the next query argument to be related with the given tree relation.
+
+
template<typename T>
+ auto related(Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && -> ObserverBuilder&& +
+
+
+ auto other() && -> ObserverBuilder&& +
+
Makes the following argument options relative to the next argument.
+
+ void call(auto function) && +
+
Finishes building the observer with the given function.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::Cubos::Cubos(int argc, + char** argv) +

+

Constructs an empty application with arguments.

+ + + + + + + + + + + + + + +
Parameters
argcArgument count.
argvArgument array.
+
+
+

+ cubos::core::ecs::Cubos::TagBuilder(Cubos& cubos, + std::string name, + bool isStartup, + Planner::TagId tagId) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
cubosCubos.
nameTag debug name.
isStartupWhether the tag is a startup tag.
tagIdTag identifier.
+
+
+

+ cubos::core::ecs::Cubos::SystemBuilder(Cubos& cubos, + bool isStartup, + std::string name) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
cubosCubos.
isStartupWhether the system is a startup system.
nameDebug name.
+
+
+

+ cubos::core::ecs::Cubos::ObserverBuilder(Cubos& cubos, + std::string name) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
cubosCubos.
nameDebug name.
+
+
+

+ Cubos& cubos::core::ecs::Cubos::plugin(Plugin plugin) +

+

Adds a new plugin as a sub-plugin of the current plugin.

+ + + + + + + + + + + + + + + + +
Parameters
pluginPlugin.
ReturnsCubos.
+

Aborts if the plugin has already been added by this or any other plugin.

+
+
+

+ Cubos& cubos::core::ecs::Cubos::depends(Plugin plugin) +

+

Marks the given plugin as a dependency of the current plugin.

+ + + + + + + + + + + + + + + + +
Parameters
pluginPlugin.
ReturnsCubos.
+

Aborts if the plugin hasn't been added by this or any other plugin.

+
+
+

+ Cubos& cubos::core::ecs::Cubos::inject(Plugin target, + Plugin plugin) +

+

Marks the target plugin so that when it is added, it is replaced by the given plugin.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
targetTarget plugin.
pluginPlugin.
ReturnsCubos.
+

Aborts if the target plugin has already been added.

+
+
+

+ Cubos& cubos::core::ecs::Cubos::uninitResource(const reflection::Type& type) +

+

Registers a new resource type, without initializing it.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsCubos.
+
+
+

+ Cubos& cubos::core::ecs::Cubos::resource(memory::AnyValue value) +

+

Registers a new resource type with the given initial value.

+ + + + + + + + + + + + + + + + +
Parameters
valueResource value.
ReturnsCubos.
+
+
+

+
+ template<typename T> +
+ Cubos& cubos::core::ecs::Cubos::uninitResource() +

+

Registers a new resource type, without initializing it.

+ + + + + + + + + + + + + + + + +
Template parameters
TType.
ReturnsCubos.
+
+
+

+
+ template<typename T, typename... TArgs> +
+ Cubos& cubos::core::ecs::Cubos::resource(TArgs && ... args) +

+

Registers a new resource type, constructing it with the given arguments.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType.
TArgsConstructor argument types.
Parameters
argsConstructor arguments.
ReturnsCubos.
+
+
+

+ Cubos& cubos::core::ecs::Cubos::component(const reflection::Type& type) +

+

Registers a new component type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsCubos.
+
+
+

+
+ template<typename T> +
+ Cubos& cubos::core::ecs::Cubos::component() +

+

Registers a new component type.

+ + + + + + + + + + + + + + + + +
Template parameters
TType.
ReturnsCubos.
+
+
+

+ Cubos& cubos::core::ecs::Cubos::relation(const reflection::Type& type) +

+

Registers a new relation type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsCubos.
+
+
+

+
+ template<typename T> +
+ Cubos& cubos::core::ecs::Cubos::relation() +

+

Registers a new relation type.

+ + + + + + + + + + + + + + + + +
Template parameters
TType.
ReturnsCubos.
+
+
+

+
+ template<typename T> +
+ Cubos& cubos::core::ecs::Cubos::event() +

+

Registers a new event type.

+ + + + + + + + + + + + + + + + +
Template parameters
TType.
ReturnsReference to this object, for chaining.
+
+
+

+ TagBuilder cubos::core::ecs::Cubos::tag(const Tag& tag) +

+

Registers a new tag. Returns a builder used to configure tagged systems.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsTagBuilder.
+
+
+

+ TagBuilder cubos::core::ecs::Cubos::startupTag(const Tag& tag) +

+

Registers a new startup tag. Returns a builder used to configure tagged systems.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsTagBuilder.
+
+
+

+ SystemBuilder cubos::core::ecs::Cubos::system(std::string name) +

+

Returns a new builder used to add a system to the engine.

+ + + + + + + + + + + + + + + + +
Parameters
nameSystem debug name.
ReturnsBuilder used to configure the system.
+
+
+

+ SystemBuilder cubos::core::ecs::Cubos::startupSystem(std::string name) +

+

Returns a new builder used to add a startup system to the engine.

+ + + + + + + + + + + + + + + + +
Parameters
nameSystem debug name.
ReturnsBuilder used to configure the system.
+
+
+

+ ObserverBuilder cubos::core::ecs::Cubos::observer(std::string name) +

+

Returns a new builder used to add an observer to the engine.

+ + + + + + + + + + + + + + + + +
Parameters
nameObserver debug name.
ReturnsBuilder used to configure the observer.
+
+
+

+ memory::Opt<reflection::TypeServer&> cubos::core::ecs::Cubos::typeServer() +

+

Returns the type server to be used by the engine, in case debugging is enabled.

+ + + + + + + +
ReturnsType server.
+

Can be used to register new types or traits manually.

+
+
+

+ void cubos::core::ecs::Cubos::reset() +

+

Resets the application to its initial state.

+

Equivalent to constructing a new Cubos object.

+
+
+

+ bool cubos::core::ecs::Cubos::update() +

+

Runs the application's main systems.

+ + + + + + + +
ReturnsWhether the application should continue running, based on the ShouldQuit resource.
+
+
+

+ void cubos::core::ecs::Cubos::run() +

+

Runs the application's main loop.

+

Equivalent to calling start() followed by update() until it returns false.

+
+
+

+ bool cubos::core::ecs::Cubos::started() const +

+

Returns whether the application has been started.

+ + + + + + + +
ReturnsWhether the application has been started.
+
+
+

+ bool cubos::core::ecs::Cubos::shouldQuit() const +

+

Returns whether the application should quit.

+ + + + + + + +
ReturnsWhether the application should quit.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::before(const Tag& tag) +

+

Makes all tagged systems run before systems with the given tag.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::after(const Tag& tag) +

+

Makes all tagged systems run after systems with the given tag.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::tagged(const Tag& tag) +

+

Tags all tagged systems with the given tag.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::addTo(const Tag& tag) +

+

Equivalent to calling tagged on the given tag.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::runIf(auto func) +

+

Makes all systems within the tag run only if the given condition evaluates to true.

+ + + + + + + + + + + + + + + + +
Parameters
funcCondition system function.
ReturnsBuilder.
+
+
+

+ TagBuilder& cubos::core::ecs::Cubos::repeatWhile(auto func) +

+

Makes all systems within the tag repeat while the given condition evaluates to true.

+ + + + + + + + + + + + + + + + +
Parameters
funcCondition system function.
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::tagged(const Tag& tag) && +

+

Adds a tag to the system.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::before(const Tag& tag) && +

+

Forces this system to only run after all systems with the given tag have finished.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::after(const Tag& tag) && +

+

Forces all systems with the given tag to run only after this system has finished.

+ + + + + + + + + + + + + + + + +
Parameters
tagTag.
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::entity(int target = -1) && +

+

Forces the next entity query argument to have the given target.

+ + + + + + + + + + + + + + + + +
Parameters
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::with(const reflection::Type& type, + int target = -1) && +

+

Forces the given target of the next query argument to have the following component.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ SystemBuilder&& cubos::core::ecs::Cubos::with(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::withOpt(const reflection::Type& type, + int target = -1) && +

+

Accepts the following component from the given target of the next query argument.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ SystemBuilder&& cubos::core::ecs::Cubos::withOpt(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::without(const reflection::Type& type, + int target = -1) && +

+

Forces the given target of the next query argument to not have the following component.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ SystemBuilder&& cubos::core::ecs::Cubos::without(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::related(const reflection::Type& type, + int fromTarget = -1, + int toTarget = -1) && +

+

Forces the given targets of the next query argument to be related with the given relation.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
fromTargetFrom target index. By default, the last specified target or 0.
toTargetFrom target index. By default, fromTarget + 1.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ SystemBuilder&& cubos::core::ecs::Cubos::related(int fromTarget = -1, + int toTarget = -1) && +

+ + + + + + + + + + +
Template parameters
TRelation type.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::related(const reflection::Type& type, + Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && +

+

Forces the given targets of the next query argument to be related with the given tree relation.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
traversalTree traversal direction.
fromTargetFrom target index. By default, the last specified target or 0.
toTargetFrom target index. By default, fromTarget + 1.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ SystemBuilder&& cubos::core::ecs::Cubos::related(Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && +

+ + + + + + + + + + +
Template parameters
TRelation type.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::other() && +

+

Makes the following argument options relative to the next argument.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+ SystemBuilder&& cubos::core::ecs::Cubos::onlyIf(auto function) && +

+

Makes the system only run if the given condition evaluates to true.

+ + + + + + + + + + + + + + + + +
Parameters
functionCondition function.
ReturnsBuilder.
+

The condition runs immediately before the system runs, and is basically just like a normal system, but which returns a boolean instead of void.

+
+
+

+ void cubos::core::ecs::Cubos::call(auto function) && +

+

Finishes building the system with the given function.

+ + + + + + + + + + +
Parameters
functionSystem function.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::onAdd(const reflection::Type& type, + int target = -1) && +

+

Triggers the observer whenever the given component is added to an entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::onAdd(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::onRemove(const reflection::Type& type, + int target = -1) && +

+

Triggers the observer whenever the given component is removed from an entity, or an entity with it is destroyed.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::onRemove(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::entity(int target = -1) && +

+

Forces the next entity query argument to have the given target.

+ + + + + + + + + + + + + + + + +
Parameters
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::with(const reflection::Type& type, + int target = -1) && +

+

Forces the given target of the next query argument to have the following component.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget index. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::with(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::without(const reflection::Type& type, + int target = -1) && +

+

Forces the given target of the next query argument to not have the following component.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetTarget. By default, the last specified target or 0.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::without(int target = -1) && +

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::related(const reflection::Type& type, + int fromTarget = -1, + int toTarget = -1) && +

+

Forces the given targets of the next query argument to be related with the given relation.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
fromTargetFrom target index. By default, the last specified target or 0.
toTargetFrom target index. By default, fromTarget + 1.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::related(int fromTarget = -1, + int toTarget = -1) && +

+ + + + + + + + + + +
Template parameters
TRelation type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::related(const reflection::Type& type, + Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && +

+

Forces the given targets of the next query argument to be related with the given tree relation.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
traversalTree traversal direction.
fromTargetFrom target index. By default, the last specified target or 0.
toTargetFrom target index. By default, fromTarget + 1.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ ObserverBuilder&& cubos::core::ecs::Cubos::related(Traversal traversal, + int fromTarget = -1, + int toTarget = -1) && +

+ + + + + + + + + + +
Template parameters
TRelation type.
+
+
+

+ ObserverBuilder&& cubos::core::ecs::Cubos::other() && +

+

Makes the following argument options relative to the next argument.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+ void cubos::core::ecs::Cubos::call(auto function) && +

+

Finishes building the observer with the given function.

+ + + + + + + + + + +
Parameters
functionSystem function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTable.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTable.html new file mode 100644 index 0000000000..5d78318ab4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTable.html @@ -0,0 +1,387 @@ + + + + + cubos::core::ecs::DenseTable class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::DenseTable class final + +

+

Stores the dense data associated to entities of a given archetype.

+ +
+

Constructors, destructors, conversion operators

+
+
+ DenseTable() defaulted +
+
Constructs a table without columns.
+
+
+
+

Public functions

+
+
+ void addColumn(ColumnId id, + const reflection::Type& type) +
+
Adds a new column to the table.
+
+ void pushBack(uint32_t index) +
+
Inserts a new entity to the end of the table.
+
+ void swapErase(uint32_t index) +
+
Removes an entity from the table.
+
+ void swapMove(uint32_t index, + DenseTable& other) +
+
Moves an entity from this table into another table, effectively calling pushBack() on the other table, and swapErase() on this one.
+
+ auto row(uint32_t index) const -> std::size_t +
+
Gets the row which contains the data for the given entity.
+
+ auto entity(std::size_t row) const -> uint32_t +
+
Gets the index of the entity which is stored in the given row.
+
+ auto size() const -> std::size_t +
+
Gets the number of rows in the table.
+
+ auto column(ColumnId id) -> memory::AnyVector& +
+
Gets a reference to the column with the given id.
+
+ auto column(ColumnId id) const -> const memory::AnyVector& +
+
Gets a reference to the column with the given id.
+
+ auto contains(ColumnId id) const -> bool +
+
Checks if the table has a column with the given id.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::DenseTable::addColumn(ColumnId id, + const reflection::Type& type) +

+

Adds a new column to the table.

+ + + + + + + + + + + + + + +
Parameters
idColumn type identifier.
typeColumn data type.
+

The table must still be empty, and the column must not already exist in the table.

+
+
+

+ void cubos::core::ecs::DenseTable::pushBack(uint32_t index) +

+

Inserts a new entity to the end of the table.

+ + + + + + + + + + +
Parameters
indexEntity index.
+ +
+
+

+ void cubos::core::ecs::DenseTable::swapErase(uint32_t index) +

+

Removes an entity from the table.

+ + + + + + + + + + +
Parameters
indexEntity index.
+

If the entity isn't the last one in the table, the last entity will be moved to the position of the removed entity. The data columns will be updated accordingly.

+
+
+

+ void cubos::core::ecs::DenseTable::swapMove(uint32_t index, + DenseTable& other) +

+

Moves an entity from this table into another table, effectively calling pushBack() on the other table, and swapErase() on this one.

+ + + + + + + + + + + + + + +
Parameters
indexEntity index.
otherDestination table.
+ +
+
+

+ std::size_t cubos::core::ecs::DenseTable::row(uint32_t index) const +

+

Gets the row which contains the data for the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
indexEntity index.
ReturnsRow index.
+
+
+

+ uint32_t cubos::core::ecs::DenseTable::entity(std::size_t row) const +

+

Gets the index of the entity which is stored in the given row.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow index.
ReturnsEntity index.
+
+
+

+ std::size_t cubos::core::ecs::DenseTable::size() const +

+

Gets the number of rows in the table.

+ + + + + + + +
ReturnsNumber of rows.
+
+
+

+ memory::AnyVector& cubos::core::ecs::DenseTable::column(ColumnId id) +

+

Gets a reference to the column with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idColumn identifier.
ReturnsColumn reference.
+

Aborts if the column does not exist in the table.

+
+
+

+ const memory::AnyVector& cubos::core::ecs::DenseTable::column(ColumnId id) const +

+

Gets a reference to the column with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idColumn identifier.
ReturnsColumn reference.
+

Aborts if the column does not exist in the table.

+
+
+

+ bool cubos::core::ecs::DenseTable::contains(ColumnId id) const +

+

Checks if the table has a column with the given id.

+ + + + + + + + + + + + + + + + +
Parameters
idColumn identifier.
ReturnsWhether the table contains the given column.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTableRegistry.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTableRegistry.html new file mode 100644 index 0000000000..ae077dd204 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DenseTableRegistry.html @@ -0,0 +1,238 @@ + + + + + cubos::core::ecs::DenseTableRegistry class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::DenseTableRegistry class final + +

+

Stores the dense tables of a given world.

+ +
+

Constructors, destructors, conversion operators

+
+
+ DenseTableRegistry() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void reset() +
+
Resets the registry to its initial state.
+
+ auto contains(ArchetypeId archetype) const -> bool +
+
Checks if the given archetype has a dense table.
+
+ auto create(ArchetypeId archetype, + ArchetypeGraph& graph, + Types& types) -> DenseTable& +
+
Returns a reference to the dense table of the given archetype.
+
+ auto at(ArchetypeId archetype) -> DenseTable& +
+
Returns a reference to the dense table of the given archetype.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::DenseTableRegistry::reset() +

+

Resets the registry to its initial state.

+

Previously returned identifiers become invalid, as they might be reused.

+
+
+

+ bool cubos::core::ecs::DenseTableRegistry::contains(ArchetypeId archetype) const +

+

Checks if the given archetype has a dense table.

+ + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype identifier.
ReturnsWHether it contains a table or not.
+
+
+

+ DenseTable& cubos::core::ecs::DenseTableRegistry::create(ArchetypeId archetype, + ArchetypeGraph& graph, + Types& types) +

+

Returns a reference to the dense table of the given archetype.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype identifier.
graphArchetype graph used to initialize the table, if necessary.
typesType registry used to initialize the table, if necessary.
ReturnsReference to table.
+

Creates the table if it doesn't exist already.

+
+
+

+ DenseTable& cubos::core::ecs::DenseTableRegistry::at(ArchetypeId archetype) +

+

Returns a reference to the dense table of the given archetype.

+ + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype identifier.
ReturnsReference to table.
+

Aborts if the table doesn't exist.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DynamicPlugin.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DynamicPlugin.html new file mode 100644 index 0000000000..430bbc750e --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1DynamicPlugin.html @@ -0,0 +1,179 @@ + + + + + cubos::core::ecs::DynamicPlugin class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::DynamicPlugin class + +

+

Manages the loading and unloading of a plugin from a shared library.

+ +
+

Public functions

+
+
+ auto load(const std::string& name) -> bool +
+
Loads the plugin from a shared library with the given name.
+
+ void unload() +
+
Unloads the plugin.
+
+ auto function() const -> Plugin +
+
Gets the plugin function pointer.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::DynamicPlugin::load(const std::string& name) +

+

Loads the plugin from a shared library with the given name.

+ + + + + + + + + + + + + + + + +
Parameters
nameShared library name.
ReturnsWhether the plugin was loaded successfully.
+
+
+

+ void cubos::core::ecs::DynamicPlugin::unload() +

+

Unloads the plugin.

+

Does nothing if the plugin was not loaded.

+
+
+

+ Plugin cubos::core::ecs::DynamicPlugin::function() const +

+

Gets the plugin function pointer.

+ + + + + + + +
ReturnsPlugin function pointer.
+

Aborts if the plugin was not loaded.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EntityPool.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EntityPool.html new file mode 100644 index 0000000000..8414ec34c4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EntityPool.html @@ -0,0 +1,307 @@ + + + + + cubos::core::ecs::EntityPool class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::EntityPool class final + +

+

Manages the creation and destruction of entity identifiers, as well as storing their archetype identifiers.

+ +
+

Public functions

+
+
+ void reset() +
+
Resets the pool to its initial state.
+
+ auto create(ArchetypeId archetype) -> Entity +
+
Creates a new entity on the given archetype.
+
+ void destroy(uint32_t index) +
+
Removes an entity from the world.
+
+ void archetype(uint32_t index, + ArchetypeId archetype) +
+
Changes the archetype identifier of an entity.
+
+ auto archetype(uint32_t index) const -> ArchetypeId +
+
Gets the archetype identifier of an entity.
+
+ auto generation(uint32_t index) const -> uint32_t +
+
Gets the generation of an entity index.
+
+ auto contains(Entity entity) const -> bool +
+
Checks if a given entity exists.
+
+ auto size() const -> size_t +
+
Gets the number of alive entities in the pool.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::EntityPool::reset() +

+

Resets the pool to its initial state.

+

Previously returned entity identifiers become invalid, as they might be reused.

+
+
+

+ Entity cubos::core::ecs::EntityPool::create(ArchetypeId archetype) +

+

Creates a new entity on the given archetype.

+ + + + + + + + + + + + + + + + +
Parameters
archetypeArchetype identifier.
ReturnsEntity.
+
+
+

+ void cubos::core::ecs::EntityPool::destroy(uint32_t index) +

+

Removes an entity from the world.

+ + + + + + + + + + +
Parameters
indexEntity index to remove.
+
+
+

+ void cubos::core::ecs::EntityPool::archetype(uint32_t index, + ArchetypeId archetype) +

+

Changes the archetype identifier of an entity.

+ + + + + + + + + + + + + + +
Parameters
indexEntity index.
archetypeNew archetype identifier.
+
+
+

+ ArchetypeId cubos::core::ecs::EntityPool::archetype(uint32_t index) const +

+

Gets the archetype identifier of an entity.

+ + + + + + + + + + + + + + + + +
Parameters
indexEntity index.
ReturnsArchetype identifier.
+
+
+

+ uint32_t cubos::core::ecs::EntityPool::generation(uint32_t index) const +

+

Gets the generation of an entity index.

+ + + + + + + + + + + + + + + + +
Parameters
indexEntity index.
ReturnsGeneration.
+
+
+

+ bool cubos::core::ecs::EntityPool::contains(Entity entity) const +

+

Checks if a given entity exists.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity to check.
ReturnsWhether the entity exists.
+
+
+

+ size_t cubos::core::ecs::EntityPool::size() const +

+

Gets the number of alive entities in the pool.

+ + + + + + + +
ReturnsNumber of entities.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventPipe.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventPipe.html new file mode 100644 index 0000000000..6c90a602e5 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventPipe.html @@ -0,0 +1,299 @@ + + + + + cubos::core::ecs::EventPipe class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::EventPipe class +

+

Resource which stores events of type T.

+ + + + + + + + + + +
Template parameters
TEvent type.
+ + +
+

Public functions

+
+
+ void push(T event, + unsigned int mask = DEFAULT_PUSH_MASK) +
+
Pushes an event into the event pipe.
+
+ auto getEventMask(std::size_t index) const -> unsigned int +
+
Returns the event mask from event pipe at the given index.
+
+ auto get(std::size_t index) const -> std::pair<const T&, unsigned int> +
+
Returns the event and mask with the given index.
+
+ void clear() +
+
Clears events that have been read by all readers.
+
+ auto sentEvents() const -> std::size_t +
+
Returns the number of events that already were sent.
+
+ auto size() const -> std::size_t +
+
Returns the number of events that are present on the pipe.
+
+ void addReader() +
+
Adds a new reader to reader count.
+
+ void removeReader() +
+
Removes a reader from reader count.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ void cubos::core::ecs::EventPipe<T>::push(T event, + unsigned int mask = DEFAULT_PUSH_MASK) +

+

Pushes an event into the event pipe.

+ + + + + + + + + + + + + + +
Parameters
eventEvent.
maskMask.
+
+
+

+
+ template<typename T> +
+ unsigned int cubos::core::ecs::EventPipe<T>::getEventMask(std::size_t index) const +

+

Returns the event mask from event pipe at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexEvent index.
ReturnsEvent mask.
+
+
+

+
+ template<typename T> +
+ std::pair<const T&, unsigned int> cubos::core::ecs::EventPipe<T>::get(std::size_t index) const +

+

Returns the event and mask with the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexEvent index.
ReturnsEvent and mask.
+
+
+

+
+ template<typename T> +
+ std::size_t cubos::core::ecs::EventPipe<T>::sentEvents() const +

+

Returns the number of events that already were sent.

+ + + + + + + +
ReturnsNumber of events that already were sent.
+
+
+

+
+ template<typename T> +
+ std::size_t cubos::core::ecs::EventPipe<T>::size() const +

+

Returns the number of events that are present on the pipe.

+ + + + + + + +
ReturnsNumber of events that are present on the pipe.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::EventPipe<T>::addReader() +

+

Adds a new reader to reader count.

+

This is necessary to keep track of when its okay to delete events on clear().

+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::EventPipe<T>::removeReader() +

+

Removes a reader from reader count.

+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader.html new file mode 100644 index 0000000000..d5b1763835 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader.html @@ -0,0 +1,249 @@ + + + + + cubos::core::ecs::EventReader class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ cubos::core::ecs::EventReader class +

+

System arguments used to read events of type T.

+ + + + + + + + + + + + + + +
Template parameters
TEvent.
MFilter mask.
+ +

Filtering the received events by their mask is also possible via the parameter M. By default, the reader will read all events sent.

+
+

Public types

+
+
+ class Iterator +
+
Used to iterate over events received by a reader.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ EventReader(const EventPipe<T>& pipe, + std::size_t& index) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto read() -> const T* +
+
Returns a reference to current event, and advances.
+
+ auto begin() -> Iterator +
+
Returns an iterator to the first event.
+
+ auto end() -> Iterator +
+
Returns an iterator to the end.
+
+
+
+

Function documentation

+
+

+
+ template<typename T, unsigned int M> +
+ cubos::core::ecs::EventReader<T, M>::EventReader(const EventPipe<T>& pipe, + std::size_t& index) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
pipeEvent pipe to read events from.
indexReference to the reader's index.
+

Uses the given index to know which events it has already read. Increments it whenever it reads an event.

+
+
+

+
+ template<typename T, unsigned int M> +
+ const T* cubos::core::ecs::EventReader<T, M>::read() +

+

Returns a reference to current event, and advances.

+ + + + + + + +
ReturnsPointer to current event, or null if there are no more events.
+
+
+

+
+ template<typename T, unsigned int M> +
+ Iterator cubos::core::ecs::EventReader<T, M>::begin() +

+

Returns an iterator to the first event.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename T, unsigned int M> +
+ Iterator cubos::core::ecs::EventReader<T, M>::end() +

+

Returns an iterator to the end.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader_1_1Iterator.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader_1_1Iterator.html new file mode 100644 index 0000000000..7b22ef755d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventReader_1_1Iterator.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::EventReader::Iterator class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::EventReader::Iterator class + +

+

Used to iterate over events received by a reader.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventWriter.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventWriter.html new file mode 100644 index 0000000000..e00a130f32 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1EventWriter.html @@ -0,0 +1,195 @@ + + + + + cubos::core::ecs::EventWriter class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::EventWriter class +

+

System argument which allows the system to send events of type T to other systems.

+ + + + + + + + + + +
Template parameters
T
+ + +
+

Constructors, destructors, conversion operators

+
+
+ EventWriter(EventPipe<T>& pipe) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void push(T event, + unsigned int mask = DEFAULT_PUSH_MASK) +
+
Sends the given event to the event pipe with the given mask.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::ecs::EventWriter<T>::EventWriter(EventPipe<T>& pipe) +

+

Constructs.

+ + + + + + + + + + +
Parameters
pipeEvent pipe to write events to.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::EventWriter<T>::push(T event, + unsigned int mask = DEFAULT_PUSH_MASK) +

+

Sends the given event to the event pipe with the given mask.

+ + + + + + + + + + + + + + +
Parameters
eventEvent.
maskMask.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Observers.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Observers.html new file mode 100644 index 0000000000..5f7ce2c9f1 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Observers.html @@ -0,0 +1,287 @@ + + + + + cubos::core::ecs::Observers class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Observers class + +

+

Stores and manages all of the observers associated with a world.

+ +
+

Public functions

+
+
+ auto notifyAdd(CommandBuffer& commandBuffer, + Entity entity, + ColumnId column) -> bool +
+
Notifies that the given entity has a new column.
+
+ auto notifyRemove(CommandBuffer& commandBuffer, + Entity entity, + ColumnId column) -> bool +
+
Notifies that the given entity has lost a column.
+
+ auto hookOnAdd(ColumnId column, + System<void> observer) -> ObserverId +
+
Hooks an observer to the addition of a column.
+
+ auto hookOnRemove(ColumnId column, + System<void> observer) -> ObserverId +
+
Hooks an observer to the removal of a column.
+
+ void unhook(ObserverId id) +
+
Unhooks an observer.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::Observers::notifyAdd(CommandBuffer& commandBuffer, + Entity entity, + ColumnId column) +

+

Notifies that the given entity has a new column.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
commandBufferCommand buffer to record the any commands emitted by the observer.
entityEntity.
columnColumn.
ReturnsWhether an observer was triggered.
+
+
+

+ bool cubos::core::ecs::Observers::notifyRemove(CommandBuffer& commandBuffer, + Entity entity, + ColumnId column) +

+

Notifies that the given entity has lost a column.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
commandBufferCommand buffer to record the any commands emitted by the observer.
entityEntity.
columnColumn.
ReturnsWhether an observer was triggered.
+
+
+

+ ObserverId cubos::core::ecs::Observers::hookOnAdd(ColumnId column, + System<void> observer) +

+

Hooks an observer to the addition of a column.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
columnColumn.
observerObserver system.
ReturnsObserver identifier.
+
+
+

+ ObserverId cubos::core::ecs::Observers::hookOnRemove(ColumnId column, + System<void> observer) +

+

Hooks an observer to the removal of a column.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
columnColumn.
observerObserver system.
ReturnsObserver identifier.
+
+
+

+ void cubos::core::ecs::Observers::unhook(ObserverId id) +

+

Unhooks an observer.

+ + + + + + + + + + +
Parameters
idObserver identifier.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Planner.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Planner.html new file mode 100644 index 0000000000..f3f4ab762b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Planner.html @@ -0,0 +1,377 @@ + + + + + cubos::core::ecs::Planner class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Planner class + +

+

Layer on top of Schedule, used to build them with added abstractions such as tags.

+ +
+

Public types

+
+
+ struct TagId +
+
Local identifier for tags.
+
+
+
+

Public functions

+
+
+ void clear() +
+
Resets the planner to its initial state.
+
+ auto add() -> TagId +
+
Adds a new unnamed tag to the planner.
+
+ auto add(std::string name) -> TagId +
+
Adds a new named tag to the planner.
+
+ auto add(std::string name, + SystemId systemId) -> TagId +
+
Adds a new system to the planner.
+
+ void remove(TagId tagId) +
+
Removes a tag from the planner and any constraints related to it.
+
+ auto tag(TagId childId, + TagId parentId) -> bool +
+
Makes the given tag a child of the the given tag.
+
+ void order(TagId beforeId, + TagId afterId) +
+
Specifies that the given tag must run before another tag.
+
+ void onlyIf(TagId tagId, + ConditionId conditionId) +
+
Specifies that systems within the given tag should only run if the given condition evaluates to true.
+
+ auto repeatWhile(TagId tagId, + ConditionId conditionId) -> bool +
+
Specifies that the given tag is a repeating tag. Can only be specified once per tag.
+
+ auto build() const -> memory::Opt<Schedule> +
+
Constructs a new schedule from the constraints specified until now.
+
+
+
+

Function documentation

+
+

+ TagId cubos::core::ecs::Planner::add() +

+

Adds a new unnamed tag to the planner.

+ + + + + + + +
ReturnsTag identifier.
+
+
+

+ TagId cubos::core::ecs::Planner::add(std::string name) +

+

Adds a new named tag to the planner.

+ + + + + + + + + + + + + + + + +
Parameters
nameDebug name.
ReturnsTag identifier.
+
+
+

+ TagId cubos::core::ecs::Planner::add(std::string name, + SystemId systemId) +

+

Adds a new system to the planner.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
nameDebug name.
systemIdSystem identifier.
ReturnsTag identifier which includes only the system itself.
+
+
+

+ void cubos::core::ecs::Planner::remove(TagId tagId) +

+

Removes a tag from the planner and any constraints related to it.

+ + + + + + + + + + +
Parameters
tagIdTag identifier.
+

Any directly associated systems and conditions are also removed.

+
+
+

+ bool cubos::core::ecs::Planner::tag(TagId childId, + TagId parentId) +

+

Makes the given tag a child of the the given tag.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
childIdChild tag identifier.
parentIdParent tag identifier.
ReturnsWhether the operation was successful.
+

Essentially makes the child inherit all constraints of the parent. Tags may have multiple parents, but only one of them must be a repeated tag.

Returns false if the tag identified by parentId is a leaf tag (i.e., created through add(SystemId)).

+
+
+

+ void cubos::core::ecs::Planner::order(TagId beforeId, + TagId afterId) +

+

Specifies that the given tag must run before another tag.

+ + + + + + + + + + + + + + +
Parameters
beforeIdBefore tag identifier.
afterIdAfter tag identifier.
+
+
+

+ void cubos::core::ecs::Planner::onlyIf(TagId tagId, + ConditionId conditionId) +

+

Specifies that systems within the given tag should only run if the given condition evaluates to true.

+ + + + + + + + + + + + + + +
Parameters
tagIdTag identifier.
conditionIdCondition identifier.
+

The condition itself inherits all of the constraints of the tag.

+
+
+

+ bool cubos::core::ecs::Planner::repeatWhile(TagId tagId, + ConditionId conditionId) +

+

Specifies that the given tag is a repeating tag. Can only be specified once per tag.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
tagIdTag identifier.
conditionIdCondition identifier.
ReturnsWhether the operation was successful.
+

Returns false if the given tag was already a repeating tag.

+
+
+

+ memory::Opt<Schedule> cubos::core::ecs::Planner::build() const +

+

Constructs a new schedule from the constraints specified until now.

+ + + + + + + +
ReturnsSchedule, or nothing if the constraints couldn't be fulfilled.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Plugins.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Plugins.html new file mode 100644 index 0000000000..bfaea7c412 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Plugins.html @@ -0,0 +1,193 @@ + + + + + cubos::core::ecs::Plugins class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Plugins class final + +

+

System argument used to add or remove Cubos plugins at runtime.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Plugins(PluginQueue* queue) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void add(Plugin plugin) +
+
Adds a plugin to the application. Will be executed on the next frame.
+
+ void remove(Plugin plugin) +
+
Removes a plugin from the application. Will be executed on the next frame.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::Plugins::Plugins(PluginQueue* queue) +

+

Constructs.

+ + + + + + + + + + +
Parameters
queuePlugin queue.
+
+
+

+ void cubos::core::ecs::Plugins::add(Plugin plugin) +

+

Adds a plugin to the application. Will be executed on the next frame.

+ + + + + + + + + + +
Parameters
pluginPlugin.
+

The plugin's startup systems will run before the frame begins.

+
+
+

+ void cubos::core::ecs::Plugins::remove(Plugin plugin) +

+

Removes a plugin from the application. Will be executed on the next frame.

+ + + + + + + + + + +
Parameters
pluginPlugin.
+

This will revert all configuration changes made by the plugin. It won't revert any effects caused by the plugin on the world, such as adding or removing entities.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Query.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Query.html new file mode 100644 index 0000000000..d826fb3f68 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Query.html @@ -0,0 +1,352 @@ + + + + + cubos::core::ecs::Query class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename... Ts>
+ cubos::core::ecs::Query class +

+

System argument which holds the result of a query over all entities in world which match the given arguments.

+ + + + + + + + + + +
Template parameters
TsArgument types.
+ +

An example of a valid query is:

Query<Position&, const Velocity&, Opt<Rotation&>, Opt<const Scale&>>

This query will return all entities with a Position and Velocity component. Accessors to Rotation and Scale components are also passed but may be null if the component is not present in the entity. Whenever mutability is not needed, const should be used.

+
+

Constructors, destructors, conversion operators

+
+
+ Query(typename QueryData<Ts...>::View view) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto begin() -> Iterator +
+
Returns an iterator pointing to the first query match.
+
+ auto end() -> Iterator +
+
Returns an out of bounds iterator representing the end of the query matches.
+
+ auto pin(int target, + Entity entity) -> Query +
+
Returns a new query equal to this one but with the given target pinned to the given entity.
+
+ auto at(Entity entity) -> memory::Opt<std::tuple<Ts...>> +
+
Accesses the match for the given entity, if there is one.
+
+ auto at(Entity firstEntity, + Entity secondEntity) -> memory::Opt<std::tuple<Ts...>> +
+
Accesses the match for the given entities, if there is one.
+
+ auto first() -> memory::Opt<std::tuple<Ts...>> +
+
Returns the first match of the query, if there's any.
+
+ auto empty() -> bool +
+
Returns whether the query is empty.
+
+
+
+

Function documentation

+
+

+
+ template<typename... Ts> +
+ cubos::core::ecs::Query<Ts>::Query(typename QueryData<Ts...>::View view) +

+

Constructs.

+ + + + + + + + + + +
Parameters
viewQuery data view.
+
+
+

+
+ template<typename... Ts> +
+ Iterator cubos::core::ecs::Query<Ts>::begin() +

+

Returns an iterator pointing to the first query match.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename... Ts> +
+ Iterator cubos::core::ecs::Query<Ts>::end() +

+

Returns an out of bounds iterator representing the end of the query matches.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename... Ts> +
+ Query cubos::core::ecs::Query<Ts>::pin(int target, + Entity entity) +

+

Returns a new query equal to this one but with the given target pinned to the given entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
targetTarget index.
entityEntity.
ReturnsQuery.
+

Effectively this filters out all matches where the given target isn't the given entity.

+
+
+

+
+ template<typename... Ts> +
+ memory::Opt<std::tuple<Ts...>> cubos::core::ecs::Query<Ts>::at(Entity entity) +

+

Accesses the match for the given entity, if there is one.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsRequested components, or nothing if the entity does not match the query.
+
+
+

+
+ template<typename... Ts> +
+ memory::Opt<std::tuple<Ts...>> cubos::core::ecs::Query<Ts>::at(Entity firstEntity, + Entity secondEntity) +

+

Accesses the match for the given entities, if there is one.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
firstEntityEntity for the first target.
secondEntityEntity for the second target.
ReturnsRequested data, or nothing if the entities do not match the query.
+
+
+

+
+ template<typename... Ts> +
+ memory::Opt<std::tuple<Ts...>> cubos::core::ecs::Query<Ts>::first() +

+

Returns the first match of the query, if there's any.

+ + + + + + + +
ReturnsRequested data, or nothing if there are no matches.
+
+
+

+
+ template<typename... Ts> +
+ bool cubos::core::ecs::Query<Ts>::empty() +

+

Returns whether the query is empty.

+ + + + + + + +
ReturnsTrue if the query is empty, false otherwise.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryArchetypeNode.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryArchetypeNode.html new file mode 100644 index 0000000000..50bfb2243d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryArchetypeNode.html @@ -0,0 +1,268 @@ + + + + + cubos::core::ecs::QueryArchetypeNode class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::QueryArchetypeNode class final + +

+

Node which forces a given target to belong to a set of archetypes.

+ +
+

Base classes

+
+
+ class QueryNode +
+
Query filter step, which receives an iterator and advances it until it points to a valid match.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ QueryArchetypeNode(int target) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void with(ColumnId column) +
+
Forces the node to match only archetypes with the given column.
+
+ void without(ColumnId column) +
+
Forces the node to match only archetypes without the given column.
+
+ auto equivalent(const QueryArchetypeNode& other) const -> bool +
+
Returns whether two nodes are equivalent.
+
+ auto target() const -> int +
+
Gets the target being filtered.
+
+ auto archetypes() const -> const std::vector<ArchetypeId>& +
+
Gets the known archetypes which match the requirements for the target.
+
+ auto estimate() const -> std::size_t override +
+
Returns a rough estimate on how many matches this node produces by itself.
+
+ void update(World& world) override +
+
Updates the node with new data from the given world.
+
+ auto next(World& world, + TargetMask pins, + Iterator& iterator) const -> bool override +
+
Advances the iterator to the next valid match, or checks if the pinned targets are valid.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::QueryArchetypeNode::QueryArchetypeNode(int target) +

+

Constructs.

+ + + + + + + + + + +
Parameters
targetTarget.
+
+
+

+ bool cubos::core::ecs::QueryArchetypeNode::equivalent(const QueryArchetypeNode& other) const +

+

Returns whether two nodes are equivalent.

+ + + + + + + + + + +
Parameters
otherOther node.
+
+
+

+ std::size_t cubos::core::ecs::QueryArchetypeNode::estimate() const override +

+

Returns a rough estimate on how many matches this node produces by itself.

+

Nodes are sorted by this value to minimize the number of iterations. It makes more sense to first run the node which produces the fewest matches, as it will be the most selective.

+
+
+

+ void cubos::core::ecs::QueryArchetypeNode::update(World& world) override +

+

Updates the node with new data from the given world.

+ + + + + + + + + + +
Parameters
worldWorld.
+
+
+

+ bool cubos::core::ecs::QueryArchetypeNode::next(World& world, + TargetMask pins, + Iterator& iterator) const override +

+

Advances the iterator to the next valid match, or checks if the pinned targets are valid.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
pinsWhether each target is pinned.
iteratorIterator.
ReturnsWhether a match was found.
+

Operates in two different modes:

  • Iterate: at least one of the node targets is not pinned.
  • Validate: all node targets are already pinned.

When iterating, this function should receive an iterator with the cursor index set to SIZE_MAX, or one previously returned by this function. It will update the iterator's cursor index and row to point to the first or next valid match. The relevant target archetypes and cursor rows will be set for any newly pinned targets.

When validating, the function will only check if the pinned targets match the requirements and return true or false without modifying the iterator. The passed iterator should have the pinned targets' archetypes and cursor rows set.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryData.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryData.html new file mode 100644 index 0000000000..135c1669c7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryData.html @@ -0,0 +1,307 @@ + + + + + cubos::core::ecs::QueryData class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename... Ts>
+ cubos::core::ecs::QueryData class +

+

Holds the data necessary to execute a query.

+ + + + + + + + + + +
Template parameters
TsArgument types.
+ +

The argument types of the query specify exactly what data will be accessed during iteration. For example, the query might have been constructed with properties such that a given column must be present on the entity. That doesn't mean that the data will actually end up being accessed.

If an argument type is present which requires a certain column to be present, then that column is automatically added to the query properties, if it isn't there already.

+
+

Constructors, destructors, conversion operators

+
+
+ QueryData(World& world, + const std::vector<QueryTerm>& extraTerms) +
+
Constructs.
+
+ QueryData(QueryData&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto accesses() const -> const std::unordered_set<DataTypeId, DataTypeIdHash>& +
+
Gets a set with the data types accessed by this query.
+
+ void update() +
+
Fetches any new matching archetypes that have been added since the last call to this function.
+
+ auto view() -> View +
+
Returns a view which can be used to iterate over the matches.
+
+ auto at(Entity entity) -> memory::Opt<std::tuple<Ts...>> +
+
Accesses the match for the given entity, if there is one.
+
+ auto at(Entity firstEntity, + Entity secondEntity) -> memory::Opt<std::tuple<Ts...>> +
+
Accesses the match for the given entities, if there is one.
+
+
+
+

Function documentation

+
+

+
+ template<typename... Ts> +
+ cubos::core::ecs::QueryData<Ts>::QueryData(World& world, + const std::vector<QueryTerm>& extraTerms) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
extraTermsExtra query terms.
+
+
+

+
+ template<typename... Ts> +
+ cubos::core::ecs::QueryData<Ts>::QueryData(QueryData&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther query data.
+
+
+

+
+ template<typename... Ts> +
+ const std::unordered_set<DataTypeId, DataTypeIdHash>& cubos::core::ecs::QueryData<Ts>::accesses() const +

+

Gets a set with the data types accessed by this query.

+ + + + + + + +
ReturnsData type set.
+
+
+

+
+ template<typename... Ts> +
+ View cubos::core::ecs::QueryData<Ts>::view() +

+

Returns a view which can be used to iterate over the matches.

+ + + + + + + +
ReturnsView.
+
+
+

+
+ template<typename... Ts> +
+ memory::Opt<std::tuple<Ts...>> cubos::core::ecs::QueryData<Ts>::at(Entity entity) +

+

Accesses the match for the given entity, if there is one.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsRequested data, or nothing if the entity does not match the query.
+
+
+

+
+ template<typename... Ts> +
+ memory::Opt<std::tuple<Ts...>> cubos::core::ecs::QueryData<Ts>::at(Entity firstEntity, + Entity secondEntity) +

+

Accesses the match for the given entities, if there is one.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
firstEntityEntity for the first target.
secondEntityEntity for the second target.
ReturnsRequested data, or nothing if the entities do not match the query.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFetcher.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFetcher.html new file mode 100644 index 0000000000..5fcbfdc393 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFetcher.html @@ -0,0 +1,260 @@ + + + + + cubos::core::ecs::QueryFetcher class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::QueryFetcher class +

+

Type meant to be specialized which implements for each argument type the necessary logic to extract it from the tables.

+ + + + + + + + + + +
Template parameters
TArgument type.
+ +
+

Public static functions

+
+
+ static auto term(World& world) -> QueryTerm +
+
Creates a query term with unspecified targets for the argument type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ QueryFetcher(World& world, + const QueryTerm& term) +
+
Called when a query is constructed for the first time.
+
+
+
+

Public functions

+
+
+ void prepare(const ArchetypeId* targetArchetypes, + int depth) +
+
Called when iteration starts for the given archetypes. Always called before fetch(), which may be called multiple times after this.
+
+ auto fetch(std::size_t row) -> T +
+
Called to get the actual desired data for a specific match. Always called after prepare() has been called at least once.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ static QueryTerm cubos::core::ecs::QueryFetcher<T>::term(World& world) +

+

Creates a query term with unspecified targets for the argument type.

+ + + + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
ReturnsTerm information.
+
+
+

+
+ template<typename T> +
+ cubos::core::ecs::QueryFetcher<T>::QueryFetcher(World& world, + const QueryTerm& term) +

+

Called when a query is constructed for the first time.

+ + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
termTerm corresponding to the argument being fetched, with specified targets.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::QueryFetcher<T>::prepare(const ArchetypeId* targetArchetypes, + int depth) +

+

Called when iteration starts for the given archetypes. Always called before fetch(), which may be called multiple times after this.

+ + + + + + + + + + + + + + +
Parameters
targetArchetypesPointer to array with the archetype identifiers for the targets.
depthDepth of the sparse relation table, if applicable.
+
+
+

+
+ template<typename T> +
+ T cubos::core::ecs::QueryFetcher<T>::fetch(std::size_t row) +

+

Called to get the actual desired data for a specific match. Always called after prepare() has been called at least once.

+ + + + + + + + + + +
Parameters
rowRow to fetch.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFilter.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFilter.html new file mode 100644 index 0000000000..e29292f371 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryFilter.html @@ -0,0 +1,575 @@ + + + + + cubos::core::ecs::QueryFilter class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::QueryFilter class + +

+

Used to find matches for the given query terms. Essentially contains the non-templated part of the query logic.

+ +
+

Public types

+
+
+ struct Match +
+
Output structure of the iterator.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ QueryFilter(World& world, + const std::vector<QueryTerm>& terms) +
+
Constructs.
+
+ View(QueryFilter& filter, + QueryNode::TargetMask pinMask = 0) +
+
Constructs.
+
+ View(const View& view) defaulted +
+
Copy constructs.
+
+ Iterator(View& view, + bool end) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ auto cursorIndex(std::size_t termIndex) const -> std::size_t +
+
Gets the cursor index for the given term index.
+
+ void update() +
+
Fetches any new matching archetypes that have been added since the last call to this function.
+
+ auto view() -> View +
+
Returns a view which can be used to iterate over the matches.
+
+ auto targetCount() const -> int +
+
Gets the number of targets.
+
+ auto operator=(const View& view) -> View& +
+
Copy assigns.
+
+ auto pin(int target, + Entity entity) -> View +
+
Returns a new view equal to this one but with the given target pinned to the given entity.
+
+ auto begin() -> Iterator +
+
Returns an iterator pointing to the first query match.
+
+ auto end() -> Iterator +
+
Returns an out of bounds iterator representing the end of the query matches.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Match& +
+
Accesses the match referenced by this iterator.
+
+ auto operator->() const -> const Match* +
+
Accesses the match referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto targetArchetypes() const -> const ArchetypeId* +
+
Gets the archetype of each target.
+
+ auto cursorDepths() const -> const int* +
+
Gets the depth level for each cursor (used for relation terms).
+
+ auto cursorRows() const -> const std::size_t* +
+
Gets the row number for each cursor.
+
+ auto valid() const -> bool +
+
Checks if the iterator is out of bounds.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::QueryFilter::QueryFilter(World& world, + const std::vector<QueryTerm>& terms) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
termsQuery terms.
+
+
+

+ cubos::core::ecs::QueryFilter::View(QueryFilter& filter, + QueryNode::TargetMask pinMask = 0) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
filterQuery filter.
pinMaskMask with the targets which are pinned.
+
+
+

+ cubos::core::ecs::QueryFilter::View(const View& view) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
viewOther view.
+
+
+

+ cubos::core::ecs::QueryFilter::Iterator(View& view, + bool end) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
viewQuery filter view.
endWhether the iterator should point to the end of the matches.
+
+
+

+ cubos::core::ecs::QueryFilter::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ std::size_t cubos::core::ecs::QueryFilter::cursorIndex(std::size_t termIndex) const +

+

Gets the cursor index for the given term index.

+ + + + + + + + + + + + + + + + +
Parameters
termIndexTerm index.
ReturnsCursor index.
+
+
+

+ View cubos::core::ecs::QueryFilter::view() +

+

Returns a view which can be used to iterate over the matches.

+ + + + + + + +
ReturnsView.
+
+
+

+ int cubos::core::ecs::QueryFilter::targetCount() const +

+

Gets the number of targets.

+ + + + + + + +
ReturnsTarget count.
+
+
+

+ View& cubos::core::ecs::QueryFilter::operator=(const View& view) +

+

Copy assigns.

+ + + + + + + + + + +
Parameters
viewOther view.
+
+
+

+ View cubos::core::ecs::QueryFilter::pin(int target, + Entity entity) +

+

Returns a new view equal to this one but with the given target pinned to the given entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
targetTarget index.
entityEntity.
ReturnsView.
+

Effectively this filters out all matches where the given target isn't the given entity.

+
+
+

+ Iterator cubos::core::ecs::QueryFilter::begin() +

+

Returns an iterator pointing to the first query match.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::QueryFilter::end() +

+

Returns an out of bounds iterator representing the end of the query matches.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::ecs::QueryFilter::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same match.
+
+
+

+ const Match& cubos::core::ecs::QueryFilter::operator*() const +

+

Accesses the match referenced by this iterator.

+ + + + + + + +
ReturnsMatch.
+ +
+
+

+ const Match* cubos::core::ecs::QueryFilter::operator->() const +

+

Accesses the match referenced by this iterator.

+ + + + + + + +
ReturnsMatch.
+ +
+
+

+ Iterator& cubos::core::ecs::QueryFilter::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ const ArchetypeId* cubos::core::ecs::QueryFilter::targetArchetypes() const +

+

Gets the archetype of each target.

+ + + + + + + +
ReturnsTarget archetypes array.
+
+
+

+ const int* cubos::core::ecs::QueryFilter::cursorDepths() const +

+

Gets the depth level for each cursor (used for relation terms).

+ + + + + + + +
ReturnsCursor depth level array.
+
+
+

+ const std::size_t* cubos::core::ecs::QueryFilter::cursorRows() const +

+

Gets the row number for each cursor.

+ + + + + + + +
ReturnsCursor row number array.
+
+
+

+ bool cubos::core::ecs::QueryFilter::valid() const +

+

Checks if the iterator is out of bounds.

+ + + + + + + +
ReturnsWhether the iterator is valid.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryNode.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryNode.html new file mode 100644 index 0000000000..1324b4c1dc --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryNode.html @@ -0,0 +1,277 @@ + + + + + cubos::core::ecs::QueryNode class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::QueryNode class + +

+

Query filter step, which receives an iterator and advances it until it points to a valid match.

+ +
+

Derived classes

+
+
+ class QueryArchetypeNode final +
+
Node which forces a given target to belong to a set of archetypes.
+
+ class QueryRelatedNode final +
+
Node which forces two given targets to be related with a given relation.
+
+
+
+

Public types

+
+
+ using TargetMask = unsigned char +
+
Target mask type.
+
+
+
+

Public static variables

+
+
+ static int MaxTargetCount constexpr +
+
Maximum number of targets.
+
+ static int MaxCursorCount constexpr +
+
Maximum number of cursors.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ QueryNode(int cursor) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto cursor() const -> int +
+
Gets the cursor index of the node.
+
+ auto pins() const -> TargetMask +
+
Gets the mask which indicates which targets the node pins.
+
+ auto estimate() const -> std::size_t pure virtual +
+
Returns a rough estimate on how many matches this node produces by itself.
+
+ void update(World& world) pure virtual +
+
Updates the node with new data from the given world.
+
+ auto next(World& world, + TargetMask pins, + Iterator& iterator) const -> bool pure virtual +
+
Advances the iterator to the next valid match, or checks if the pinned targets are valid.
+
+
+
+

Protected functions

+
+
+ void pins(int target) +
+
Indicates that the node pins the given target.
+
+
+
+

Function documentation

+
+

+ std::size_t cubos::core::ecs::QueryNode::estimate() const pure virtual +

+

Returns a rough estimate on how many matches this node produces by itself.

+

Nodes are sorted by this value to minimize the number of iterations. It makes more sense to first run the node which produces the fewest matches, as it will be the most selective.

+
+
+

+ void cubos::core::ecs::QueryNode::update(World& world) pure virtual +

+

Updates the node with new data from the given world.

+ + + + + + + + + + +
Parameters
worldWorld.
+
+
+

+ bool cubos::core::ecs::QueryNode::next(World& world, + TargetMask pins, + Iterator& iterator) const pure virtual +

+

Advances the iterator to the next valid match, or checks if the pinned targets are valid.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
pinsWhether each target is pinned.
iteratorIterator.
ReturnsWhether a match was found.
+

Operates in two different modes:

  • Iterate: at least one of the node targets is not pinned.
  • Validate: all node targets are already pinned.

When iterating, this function should receive an iterator with the cursor index set to SIZE_MAX, or one previously returned by this function. It will update the iterator's cursor index and row to point to the first or next valid match. The relevant target archetypes and cursor rows will be set for any newly pinned targets.

When validating, the function will only check if the pinned targets match the requirements and return true or false without modifying the iterator. The passed iterator should have the pinned targets' archetypes and cursor rows set.

+
+
+

+ void cubos::core::ecs::QueryNode::pins(int target) protected +

+

Indicates that the node pins the given target.

+ + + + + + + + + + +
Parameters
targetTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryRelatedNode.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryRelatedNode.html new file mode 100644 index 0000000000..cff6677c3b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1QueryRelatedNode.html @@ -0,0 +1,267 @@ + + + + + cubos::core::ecs::QueryRelatedNode class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::QueryRelatedNode class final + +

+

Node which forces two given targets to be related with a given relation.

+ +
+

Base classes

+
+
+ class QueryNode +
+
Query filter step, which receives an iterator and advances it until it points to a valid match.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ QueryRelatedNode(int cursor, + DataTypeId dataType, + bool isSymmetric, + bool includeDuplicates, + Traversal traversal, + QueryArchetypeNode& fromNode, + QueryArchetypeNode& toNode) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto estimate() const -> std::size_t override +
+
Returns a rough estimate on how many matches this node produces by itself.
+
+ void update(World& world) override +
+
Updates the node with new data from the given world.
+
+ auto next(World& world, + TargetMask pins, + Iterator& iterator) const -> bool override +
+
Advances the iterator to the next valid match, or checks if the pinned targets are valid.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::QueryRelatedNode::QueryRelatedNode(int cursor, + DataTypeId dataType, + bool isSymmetric, + bool includeDuplicates, + Traversal traversal, + QueryArchetypeNode& fromNode, + QueryArchetypeNode& toNode) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
cursorCursor index.
dataTypeRelation data type.
isSymmetricWhether the relation is symmetric.
includeDuplicatesWhether, if the relation is symmetric, a relation may appear twice.
traversalTraversal type, in case we're filtering a tree relation.
fromNodeFrom target node.
toNodeTo target node.
+
+
+

+ std::size_t cubos::core::ecs::QueryRelatedNode::estimate() const override +

+

Returns a rough estimate on how many matches this node produces by itself.

+

Nodes are sorted by this value to minimize the number of iterations. It makes more sense to first run the node which produces the fewest matches, as it will be the most selective.

+
+
+

+ void cubos::core::ecs::QueryRelatedNode::update(World& world) override +

+

Updates the node with new data from the given world.

+ + + + + + + + + + +
Parameters
worldWorld.
+
+
+

+ bool cubos::core::ecs::QueryRelatedNode::next(World& world, + TargetMask pins, + Iterator& iterator) const override +

+

Advances the iterator to the next valid match, or checks if the pinned targets are valid.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
worldWorld being queried.
pinsWhether each target is pinned.
iteratorIterator.
ReturnsWhether a match was found.
+

Operates in two different modes:

  • Iterate: at least one of the node targets is not pinned.
  • Validate: all node targets are already pinned.

When iterating, this function should receive an iterator with the cursor index set to SIZE_MAX, or one previously returned by this function. It will update the iterator's cursor index and row to point to the first or next valid match. The relevant target archetypes and cursor rows will be set for any newly pinned targets.

When validating, the function will only check if the pinned targets match the requirements and return true or false without modifying the iterator. The passed iterator should have the pinned targets' archetypes and cursor rows set.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Schedule.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Schedule.html new file mode 100644 index 0000000000..361266dc2b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Schedule.html @@ -0,0 +1,369 @@ + + + + + cubos::core::ecs::Schedule class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Schedule class + +

+

Stores schedule nodes and the restrictions that must be met for them to run.

+ +

In short, the algorithm implemented here is based on a graph of dependencies. There are three types of nodes:

  • system nodes.
  • condition nodes;
  • repeat nodes;

Additionally, there are three types of constraints which can be applied to the flow:

  • ordering constraints, e.g., node 1 runs before node 2 - specified through order.
  • only if constraints, e.g., node 1 runs if condition node 2 returns true - specified through onlyIf.
  • repeat constraints, e.g., node 1 is part of repeat node 2 - specified during node creation time.

For a more in-depth and accurate analysis of the behavior of this class, take a look at its unit tests.

Execution

Each node stores its 'needed satisfaction', which represents how many nodes must mark it as 'satisfied' for it to be illegible to run. During execution, nodes keep the current satisfaction level as state. When that level reaches the level needed to run, the node is pushed to the execution queue.

System nodes are the most basic of the node types. When they execute, their respective system is run. All other nodes which have order constraints depending on it have their satisfaction increased.

Condition nodes which evaluate to true mark all dependents as satisfied. If they evaluate to false, they mark the dependents of the dependents as satisfied, effectively skipping these nodes.

Repeat nodes are the most complex of the nodes. Each node stores the identifier of the repeat node it belongs to (which may be none). All nodes belonging to one have a base satisfaction level of 1. When the repeat node evaluates to true, this level is increased, allowing their execution to start. Additionally, the repeat node's satisfaction is decreased by the number of belonging nodes. When each of those nodes finishes, it increments the satisfaction level of the repeat node. When all nodes are finished, the repeat node runs once again.

If a repeat node evaluates to false, it marks as satisfied all of its dependents, as only then it has finished.

The execution stops when the queue is emptied.

Constraint Specification

Any two nodes may constrained to run in a given order in relation to each other. If two nodes are part of different repeat nodes, the ordering is applied for their lowest ancestor repeat nodes which have the same parent repeat node. This means, that, if, for example, you have two systems A and B, each part of their own repeat node, if you force A to run before B, then A's repeat node will entirely run before B's repeat node. This is necessary as the number of times a repeat node executes is unknown - it may vary depending on the condition.

When only if constraints are applied between a node and a condition, the condition always runs before the system, but the system only runs if the condition evaluates to true. Only if constraints are only allowed when the condition doesn't repeat from the point of view of the node. More formally, the condition must be part of the node's repeat node or one of its ancestors.

Any operation which would introduce a cycle fails by returning false and logging an error.

Concurrency

This algorithm makes it easy to run systems concurrently. To do this, we just have to distribute the work between threads each time a node is popped from the queue. One thing to keep in mind is that this class by itself doesn't solve node conflicts. If two nodes write to the same resource, for example, and if they aren't ordered, an arbitrary order constraint should be added between them, to ensure that they won't run concurrently.

+
+

Public types

+
+
+ struct NodeId +
+
Identifies a node in the schedule.
+
+
+
+

Public functions

+
+
+ void clear() +
+
Removes all nodes from the schedule.
+
+ auto repeat(ConditionId conditionId, + const memory::Opt<NodeId>& repeatId = {}) -> memory::Opt<NodeId> +
+
Adds a repeat node to the schedule which repeats as long as the given condition evaluates to true.
+
+ auto system(SystemId systemId, + const memory::Opt<NodeId>& repeatId = {}) -> memory::Opt<NodeId> +
+
Adds a system node to the schedule.
+
+ auto condition(ConditionId conditionId, + const memory::Opt<NodeId>& repeatId = {}) -> memory::Opt<NodeId> +
+
Adds a condition node to the schedule.
+
+ auto onlyIf(NodeId node, + NodeId condition) -> bool +
+
Specifies that a node should only run if a given condition node returns true after finishing.
+
+ auto order(NodeId before, + NodeId after) -> bool +
+
Specifies that a node must run after another node finishes.
+
+ void run(SystemRegistry& registry, + SystemContext& context) +
+
Runs the systems in the schedule.
+
+ auto debug(const SystemRegistry& registry) const -> std::string +
+
Generates a multi-line string which represents the order in which the nodes will run.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::Schedule::clear() +

+

Removes all nodes from the schedule.

+

All previously returned node identifiers must no longer be used after this is called.

+
+
+

+ memory::Opt<NodeId> cubos::core::ecs::Schedule::repeat(ConditionId conditionId, + const memory::Opt<NodeId>& repeatId = {}) +

+

Adds a repeat node to the schedule which repeats as long as the given condition evaluates to true.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
conditionIdCondition identifier.
repeatIdRepeat node to become part of, if any.
ReturnsRepeat node identifier, or nothing if the given repeat node is not a repeat node.
+
+
+

+ memory::Opt<NodeId> cubos::core::ecs::Schedule::system(SystemId systemId, + const memory::Opt<NodeId>& repeatId = {}) +

+

Adds a system node to the schedule.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
systemIdSystem identifier.
repeatIdRepeat node to become part of, if any.
ReturnsSystem node identifier, or nothing if the given repeat node is not a repeat node.
+
+
+

+ memory::Opt<NodeId> cubos::core::ecs::Schedule::condition(ConditionId conditionId, + const memory::Opt<NodeId>& repeatId = {}) +

+

Adds a condition node to the schedule.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
conditionIdCondition identifier.
repeatIdRepeat node to become part of, if any.
ReturnsCondition node identifier, or nothing if the given repeat node is not a repeat node.
+
+
+

+ bool cubos::core::ecs::Schedule::onlyIf(NodeId node, + NodeId condition) +

+

Specifies that a node should only run if a given condition node returns true after finishing.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
nodeNode.
conditionCondition.
ReturnsWhether the operation was successful.
+

Implicitly enforces an ordering constraint, such that the condition always finishes before the node starts. Fails by returning false if the given condition node isn't a condition node.

+
+
+

+ bool cubos::core::ecs::Schedule::order(NodeId before, + NodeId after) +

+

Specifies that a node must run after another node finishes.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
beforeNode that must finish.
afterNode that must run after before finishes.
ReturnsWhether the restriction was successfully added.
+

If doing so would introduce a dependency cycle in the schedule, the operation is cancelled and the method returns false.

+
+
+

+ void cubos::core::ecs::Schedule::run(SystemRegistry& registry, + SystemContext& context) +

+

Runs the systems in the schedule.

+ + + + + + + + + + + + + + +
Parameters
registryRegistry containing the systems.
contextContext to run the systems with.
+
+
+

+ std::string cubos::core::ecs::Schedule::debug(const SystemRegistry& registry) const +

+

Generates a multi-line string which represents the order in which the nodes will run.

+ + + + + + + + + + + + + + + + +
Parameters
registryRegistry containing the systems, used to get the system names.
ReturnsString.
+

The obtained order is not necessarily the one in which the nodes will run. The only guarantee given, is that if an ordering constraint was specified, then this string will reflect it. Thus, if a system A appears before a system B, then there isn't a constraint 'B must run before A'.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTable.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTable.html new file mode 100644 index 0000000000..9b704abaa6 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTable.html @@ -0,0 +1,1174 @@ + + + + + cubos::core::ecs::SparseRelationTable class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SparseRelationTable class final + +

+

A table which stores relations. Allows for quick insertion, deletion and iteration.

+ +

Internally, the table is stored simply as a vector of relations and their data. Each row in this table stores:

  • the 'from' entity index;
  • the 'to' entity index;
  • the previous and next rows with the same 'from' index;
  • the previous and next rows with the same 'to' index;
  • the relation data itself.

To make random accesses more efficient, we also store an hashtable which maps entity index pairs to rows. This way, we can quickly check if a relation exists or where it's stored.

Additionally, we store two other hashtables, one which associate 'from' and 'to' indices to rows in the table which represent the first and last nodes of linked lists, where each node is a row with the same 'from' or 'to' index, depending on the list.

These linked lists are essential to provide fast query times, as instead of having to iterate over the entire table and filter for entity, we only need to follow the linked list chain.

+
+

Public types

+
+
+ struct Output +
+
Output structure for the iterator.
+
+ enum class Transformation { None, + Swap, + SwapIfGreater } +
+
Transformations to apply while moving relations between tables.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ SparseRelationTable(const reflection::Type& relationType) +
+
Constructs with the given relation type.
+
+ Iterator(const SparseRelationTable& table, + uint32_t row) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+ View(const SparseRelationTable& table, + uint32_t index, + bool isFrom) +
+
Constructs.
+
+ Iterator(const SparseRelationTable& table, + uint32_t row, + bool isFrom) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ void clear() +
+
Removes all relations from the table.
+
+ auto insert(uint32_t from, + uint32_t to, + void* value) -> bool +
+
Adds a relation between the given indices. If it already exists, overwrites it.
+
+ auto erase(uint32_t from, + uint32_t to) -> bool +
+
Removes a relation between the given indices. If it didn't exist, does nothing.
+
+ auto eraseFrom(uint32_t from) -> std::size_t +
+
Removes all relations from the given index.
+
+ auto moveFrom(uint32_t from, + SparseRelationTable& other, + Transformation transformation) -> std::size_t +
+
Moves all relations with the given from index to another table.
+
+ auto eraseTo(uint32_t to) -> std::size_t +
+
Removes all relations to the given index.
+
+ auto moveTo(uint32_t to, + SparseRelationTable& other, + Transformation transformation) -> std::size_t +
+
Moves all relations with the given to index to another table.
+
+ auto contains(uint32_t from, + uint32_t to) const -> bool +
+
Checks whether the given relation exists between the given indices.
+
+ auto row(uint32_t from, + uint32_t to) const -> std::size_t +
+
Gets the row of the relation with the given indices, or size() if there is none.
+
+ auto at(std::size_t row) -> void* +
+
Get the relation at the given row.
+
+ auto at(std::size_t row) const -> const void* +
+
Get the relation at the given row.
+
+ void indices(std::size_t row, + uint32_t& from, + uint32_t& to) const +
+
Get the entity indices at the given row.
+
+ auto from(std::size_t row) const -> uint32_t +
+
Get the 'from' entity index at the given row.
+
+ auto to(std::size_t row) const -> uint32_t +
+
Get the 'to' entity index at the given row.
+
+ auto firstFrom(uint32_t index) const -> std::size_t +
+
Gets the first row with the given from index, or size() if there is none.
+
+ auto firstTo(uint32_t index) const -> std::size_t +
+
Gets the first row with the given to index, or size() if there is none.
+
+ auto nextFrom(std::size_t row) const -> std::size_t +
+
Gets the next row with the same from index, or size() if there is none.
+
+ auto nextTo(std::size_t row) const -> std::size_t +
+
Gets the next row with the same to index, or size() if there is none.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first relation of the table.
+
+ auto end() const -> Iterator +
+
Gets an iterator which represents the end of the table.
+
+ auto viewFrom(uint32_t from) const -> View +
+
Returns a view of the relations with the given from index.
+
+ auto viewTo(uint32_t to) const -> View +
+
Returns a view of the relations with the given to index.
+
+ auto size() const -> std::size_t +
+
Returns the number of relations on the table.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Output& +
+
Accesses the relation referenced by this iterator.
+
+ auto operator->() const -> const Output* +
+
Accesses the relation referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first relation of the view.
+
+ auto end() const -> Iterator +
+
Gets an iterator which represents the end of the view.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Output& +
+
Accesses the relation referenced by this iterator.
+
+ auto operator->() const -> const Output* +
+
Accesses the relation referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::core::ecs::SparseRelationTable::Transformation +

+

Transformations to apply while moving relations between tables.

+ + + + + + + + + + + + + + + + +
Enumerators
None +

Keep the relations as they are.

+
Swap +

Flip the 'from' and 'to' indices.

+
SwapIfGreater +

Swap if the 'from' index is greater than the 'to' index.

+
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::SparseRelationTable::SparseRelationTable(const reflection::Type& relationType) +

+

Constructs with the given relation type.

+ + + + + + + + + + +
Parameters
relationTypeRelation type.
+ +
+
+

+ cubos::core::ecs::SparseRelationTable::Iterator(const SparseRelationTable& table, + uint32_t row) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
tableTable.
rowRow.
+
+
+

+ cubos::core::ecs::SparseRelationTable::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::ecs::SparseRelationTable::View(const SparseRelationTable& table, + uint32_t index, + bool isFrom) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
table
indexIndex being iterated over.
isFromIs the index a from index? If false, its a to index.
+
+
+

+ cubos::core::ecs::SparseRelationTable::Iterator(const SparseRelationTable& table, + uint32_t row, + bool isFrom) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
tableTable.
rowRow.
isFromAre we iterating over the same from index? If false, iterates over to.
+
+
+

+ cubos::core::ecs::SparseRelationTable::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ bool cubos::core::ecs::SparseRelationTable::insert(uint32_t from, + uint32_t to, + void* value) +

+

Adds a relation between the given indices. If it already exists, overwrites it.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
toTo index.
valueRelation value to move from.
ReturnsWhether the relation already existed.
+
+
+

+ bool cubos::core::ecs::SparseRelationTable::erase(uint32_t from, + uint32_t to) +

+

Removes a relation between the given indices. If it didn't exist, does nothing.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
toTo index.
ReturnsWhether the relation existed.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::eraseFrom(uint32_t from) +

+

Removes all relations from the given index.

+ + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
ReturnsHow many relations were erased.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::moveFrom(uint32_t from, + SparseRelationTable& other, + Transformation transformation) +

+

Moves all relations with the given from index to another table.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
otherOther table. Must have the same relation type.
transformationTransformation to apply to the relations.
ReturnsHow many relations were erased.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::eraseTo(uint32_t to) +

+

Removes all relations to the given index.

+ + + + + + + + + + + + + + + + +
Parameters
toTo index.
ReturnsHow many relations were moved.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::moveTo(uint32_t to, + SparseRelationTable& other, + Transformation transformation) +

+

Moves all relations with the given to index to another table.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
toTo index index.
otherOther table. Must have the same relation type.
transformationTransformation to apply to the relations.
ReturnsHow many relations were moved.
+
+
+

+ bool cubos::core::ecs::SparseRelationTable::contains(uint32_t from, + uint32_t to) const +

+

Checks whether the given relation exists between the given indices.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
toTo index.
ReturnsWhether the relation exists.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::row(uint32_t from, + uint32_t to) const +

+

Gets the row of the relation with the given indices, or size() if there is none.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
toTo index.
ReturnsRow of the data.
+
+
+

+ void* cubos::core::ecs::SparseRelationTable::at(std::size_t row) +

+

Get the relation at the given row.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow of the relation to get.
ReturnsPointer to the relation.
+ +
+
+

+ const void* cubos::core::ecs::SparseRelationTable::at(std::size_t row) const +

+

Get the relation at the given row.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow of the relation to get.
ReturnsPointer to the relation.
+ +
+
+

+ void cubos::core::ecs::SparseRelationTable::indices(std::size_t row, + uint32_t& from, + uint32_t& to) const +

+

Get the entity indices at the given row.

+ + + + + + + + + + + + + + + + + + +
Parameters
rowRow to get.
from outFrom index.
to outTo index.
+ +
+
+

+ uint32_t cubos::core::ecs::SparseRelationTable::from(std::size_t row) const +

+

Get the 'from' entity index at the given row.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow to get.
ReturnsFrom index.
+ +
+
+

+ uint32_t cubos::core::ecs::SparseRelationTable::to(std::size_t row) const +

+

Get the 'to' entity index at the given row.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow to get.
ReturnsFrom index.
+ +
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::firstFrom(uint32_t index) const +

+

Gets the first row with the given from index, or size() if there is none.

+ + + + + + + + + + + + + + + + +
Parameters
indexFrom index.
ReturnsFirst row with the given from index.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::firstTo(uint32_t index) const +

+

Gets the first row with the given to index, or size() if there is none.

+ + + + + + + + + + + + + + + + +
Parameters
indexTo index.
ReturnsFirst row with the given to index.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::nextFrom(std::size_t row) const +

+

Gets the next row with the same from index, or size() if there is none.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow to get the next from.
ReturnsNext row with the same from index.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::nextTo(std::size_t row) const +

+

Gets the next row with the same to index, or size() if there is none.

+ + + + + + + + + + + + + + + + +
Parameters
rowRow to get the next to.
ReturnsNext row with the same to index.
+
+
+

+ Iterator cubos::core::ecs::SparseRelationTable::begin() const +

+

Gets an iterator to the first relation of the table.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::SparseRelationTable::end() const +

+

Gets an iterator which represents the end of the table.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ View cubos::core::ecs::SparseRelationTable::viewFrom(uint32_t from) const +

+

Returns a view of the relations with the given from index.

+ + + + + + + + + + + + + + + + +
Parameters
fromFrom index.
ReturnsRelation view.
+
+
+

+ View cubos::core::ecs::SparseRelationTable::viewTo(uint32_t to) const +

+

Returns a view of the relations with the given to index.

+ + + + + + + + + + + + + + + + +
Parameters
toTo index.
ReturnsRelation view.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTable::size() const +

+

Returns the number of relations on the table.

+ + + + + + + +
ReturnsRelation count.
+
+
+

+ bool cubos::core::ecs::SparseRelationTable::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same relation.
+
+
+

+ const Output& cubos::core::ecs::SparseRelationTable::operator*() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ const Output* cubos::core::ecs::SparseRelationTable::operator->() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ Iterator& cubos::core::ecs::SparseRelationTable::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ Iterator cubos::core::ecs::SparseRelationTable::begin() const +

+

Gets an iterator to the first relation of the view.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::SparseRelationTable::end() const +

+

Gets an iterator which represents the end of the view.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::ecs::SparseRelationTable::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same relation.
+
+
+

+ const Output& cubos::core::ecs::SparseRelationTable::operator*() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ const Output* cubos::core::ecs::SparseRelationTable::operator->() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ Iterator& cubos::core::ecs::SparseRelationTable::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry.html new file mode 100644 index 0000000000..cd919f5430 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry.html @@ -0,0 +1,391 @@ + + + + + cubos::core::ecs::SparseRelationTableRegistry class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SparseRelationTableRegistry class + +

+

Stores all of the sparse relation tables.

+ +
+

Public types

+
+
+ class TypeIndex +
+
Stores the ids of tables of a given type.
+
+ using Iterator = std::unordered_map<DataTypeId, TypeIndex, DataTypeIdHash>::const_iterator +
+
Used to iterate over type indices in the registry.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ SparseRelationTableRegistry() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void reset() +
+
Resets the registry to its initial state.
+
+ auto contains(SparseRelationTableId id) const -> bool +
+
Checks if there's a table with the given identifier.
+
+ auto create(SparseRelationTableId id, + Types& types) -> SparseRelationTable& +
+
Returns a reference to the table with the given identifier.
+
+ auto at(SparseRelationTableId id) -> SparseRelationTable& +
+
Returns a reference to the table with the given identifier.
+
+ auto at(SparseRelationTableId id) const -> const SparseRelationTable& +
+
Returns a reference to the table with the given identifier.
+
+ auto type(DataTypeId type) const -> const TypeIndex& +
+
Returns the index used to search for tables of relations with a given type.
+
+ void erase(DataTypeId type) +
+
Removes all relations of the given type.
+
+ auto forEach(std::size_t counter, + auto func) const -> std::size_t +
+
Calls the given function for each new table.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the start of the type indices of this registry.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the end of the type indices of this registry.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::SparseRelationTableRegistry::reset() +

+

Resets the registry to its initial state.

+

Previously returned identifiers become invalid, as they might be reused.

+
+
+

+ bool cubos::core::ecs::SparseRelationTableRegistry::contains(SparseRelationTableId id) const +

+

Checks if there's a table with the given identifier.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier.
ReturnsWhether it contains the table or not.
+
+
+

+ SparseRelationTable& cubos::core::ecs::SparseRelationTableRegistry::create(SparseRelationTableId id, + Types& types) +

+

Returns a reference to the table with the given identifier.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier.
typesType registry used to initialize the table, if necessary.
ReturnsReference to table.
+

Creates the table if it doesn't exist already.

+
+
+

+ SparseRelationTable& cubos::core::ecs::SparseRelationTableRegistry::at(SparseRelationTableId id) +

+

Returns a reference to the table with the given identifier.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier.
ReturnsReference to table.
+

Aborts if the table doesn't exist.

+
+
+

+ const SparseRelationTable& cubos::core::ecs::SparseRelationTableRegistry::at(SparseRelationTableId id) const +

+

Returns a reference to the table with the given identifier.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier.
ReturnsReference to table.
+

Aborts if the table doesn't exist.

+
+
+

+ const TypeIndex& cubos::core::ecs::SparseRelationTableRegistry::type(DataTypeId type) const +

+

Returns the index used to search for tables of relations with a given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType identifier.
ReturnsType index.
+
+
+

+ void cubos::core::ecs::SparseRelationTableRegistry::erase(DataTypeId type) +

+

Removes all relations of the given type.

+ + + + + + + + + + +
Parameters
typeType identifier.
+
+
+

+ std::size_t cubos::core::ecs::SparseRelationTableRegistry::forEach(std::size_t counter, + auto func) const +

+

Calls the given function for each new table.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
counterCounter previously returned by this function. Zero should be used for the first call.
funcFunction which receives a table identifier.
ReturnsCounter to be passed to this function in a future call.
+
+
+

+ Iterator cubos::core::ecs::SparseRelationTableRegistry::begin() const +

+

Gets an iterator to the start of the type indices of this registry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::SparseRelationTableRegistry::end() const +

+

Gets an iterator to the end of the type indices of this registry.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry_1_1TypeIndex.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry_1_1TypeIndex.html new file mode 100644 index 0000000000..5bb88806fc --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SparseRelationTableRegistry_1_1TypeIndex.html @@ -0,0 +1,197 @@ + + + + + cubos::core::ecs::SparseRelationTableRegistry::TypeIndex class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SparseRelationTableRegistry::TypeIndex class + +

+

Stores the ids of tables of a given type.

+ +
+

Public functions

+
+
+ void insert(SparseRelationTableId id) +
+
Inserts a new table identifier into the index.
+
+ auto from() const -> const auto& +
+
Returns a reference to a map which maps archetypes to the tables where it is the 'from' archetype.
+
+ auto to() const -> const auto& +
+
Returns a reference to a map which maps archetypes to the tables where it is the 'to' archetype.
+
+ auto maxDepth() const -> int +
+
Returns the maximum depth of the tables in this index.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::SparseRelationTableRegistry::TypeIndex::insert(SparseRelationTableId id) +

+

Inserts a new table identifier into the index.

+ + + + + + + + + + +
Parameters
idTable identifier.
+
+
+

+ const auto& cubos::core::ecs::SparseRelationTableRegistry::TypeIndex::from() const +

+

Returns a reference to a map which maps archetypes to the tables where it is the 'from' archetype.

+ + + + + + + +
ReturnsMap from archetypes to vectors of table identifiers.
+
+
+

+ const auto& cubos::core::ecs::SparseRelationTableRegistry::TypeIndex::to() const +

+

Returns a reference to a map which maps archetypes to the tables where it is the 'to' archetype.

+ + + + + + + +
ReturnsMap from archetypes to vectors of table identifiers.
+
+
+

+ int cubos::core::ecs::SparseRelationTableRegistry::TypeIndex::maxDepth() const +

+

Returns the maximum depth of the tables in this index.

+ + + + + + + +
ReturnsMaximum depth.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1System.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1System.html new file mode 100644 index 0000000000..8f3eccb1d7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1System.html @@ -0,0 +1,258 @@ + + + + + cubos::core::ecs::System class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::System class +

+

Holds a system with a return type T.

+ + + + + + + + + + +
Template parameters
TSystem return type.
+ +
+

Public static functions

+
+
+ static auto make(World& world, + auto function, + const std::vector<SystemOptions>& options = {}) -> System +
+
Creates a new system for the given world with the given function and options.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ System(System&& system) defaulted noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto run(const SystemContext& ctx) -> T +
+
Runs the system.
+
+ auto access() const -> const SystemAccess& +
+
Gets a reference to the access patterns of the system.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ static System cubos::core::ecs::System<T>::make(World& world, + auto function, + const std::vector<SystemOptions>& options = {}) +

+

Creates a new system for the given world with the given function and options.

+ + + + + + + + + + + + + + + + + + +
Parameters
worldWorld the system will access.
functionSystem function, which should return T.
optionsOptions for the system arguments.
+

The first option is applied to the first argument which requests it, and the same for subsequent options. If there are more options than arguments which request them, aborts. Otherwise, if there are more arguments requesting options than supplied options, the remaining arguments are assigned default-value options.

+
+
+

+
+ template<typename T> +
+ cubos::core::ecs::System<T>::System(System&& system) defaulted noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
systemOther system.
+
+
+

+
+ template<typename T> +
+ T cubos::core::ecs::System<T>::run(const SystemContext& ctx) +

+

Runs the system.

+ + + + + + + + + + + + + + + + +
Parameters
ctxContext.
ReturnsReturn value.
+
+
+

+
+ template<typename T> +
+ const SystemAccess& cubos::core::ecs::System<T>::access() const +

+

Gets a reference to the access patterns of the system.

+ + + + + + + +
ReturnsAccess patterns.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemFetcher.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemFetcher.html new file mode 100644 index 0000000000..d724289c92 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemFetcher.html @@ -0,0 +1,228 @@ + + + + + cubos::core::ecs::SystemFetcher class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::SystemFetcher class +

+

Type meant to be specialized which implements for each argument type the necessary logic to extract it from the world.

+ + + + + + + + + + +
Template parameters
TArgument type.
+ +
+

Public static variables

+
+
+ static bool ConsumesOptions constexpr +
+
Indicates whether this argument type consumes system options.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ SystemFetcher(World& world, + const SystemOptions& options) +
+
Called when a system is constructed for the first time.
+
+
+
+

Public functions

+
+
+ void analyze(SystemAccess& access) const +
+
Called to determine the access patterns of the argument.
+
+ auto fetch(const SystemContext& ctx) -> T +
+
Called each system run to fetch the data from the world.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::ecs::SystemFetcher<T>::SystemFetcher(World& world, + const SystemOptions& options) +

+

Called when a system is constructed for the first time.

+ + + + + + + + + + + + + + +
Parameters
worldWorld to extract data from.
optionsArgument options.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::SystemFetcher<T>::analyze(SystemAccess& access) const +

+

Called to determine the access patterns of the argument.

+ + + + + + + + + + +
Parameters
access outAccess patterns to add info to.
+
+
+

+
+ template<typename T> +
+ T cubos::core::ecs::SystemFetcher<T>::fetch(const SystemContext& ctx) +

+

Called each system run to fetch the data from the world.

+ + + + + + + + + + +
Parameters
ctxContext.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemRegistry.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemRegistry.html new file mode 100644 index 0000000000..825a3a5d3d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1SystemRegistry.html @@ -0,0 +1,355 @@ + + + + + cubos::core::ecs::SystemRegistry class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SystemRegistry class + +

+

Stores known systems and conditions.

+ +
+

Constructors, destructors, conversion operators

+
+
+ SystemRegistry() defaulted +
+
Constructs.
+
+ SystemRegistry(const SystemRegistry&) deleted +
+
Forbid copying.
+
+
+
+

Public functions

+
+
+ auto operator=(const SystemRegistry&) -> SystemRegistry& deleted +
+
Forbid copy assignment.
+
+ void reset() +
+
Removes all systems and conditions.
+
+ auto add(std::string name, + System<void> system) -> SystemId +
+
Registers the given system.
+
+ auto add(std::string name, + System<bool> condition) -> ConditionId +
+
Registers the given condition.
+
+ void remove(SystemId id) +
+
Unregisters the given system.
+
+ void remove(ConditionId id) +
+
Unregisters the given condition.
+
+ auto name(SystemId id) const -> const std::string& +
+
Gets the debug name of the given system.
+
+ auto name(ConditionId id) const -> const std::string& +
+
Gets the debug name of the given condition.
+
+ auto system(SystemId id) -> System<void>& +
+
Gets the system with the given identifier.
+
+ auto condition(ConditionId id) -> System<bool>& +
+
Gets the condition with the given identifier.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::SystemRegistry::reset() +

+

Removes all systems and conditions.

+

Previously returned identifiers become invalid. This operation is equivalent to constructing a new registry.

+
+
+

+ SystemId cubos::core::ecs::SystemRegistry::add(std::string name, + System<void> system) +

+

Registers the given system.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
nameDebug name.
systemSystem.
ReturnsSystem identifier.
+
+
+

+ ConditionId cubos::core::ecs::SystemRegistry::add(std::string name, + System<bool> condition) +

+

Registers the given condition.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
nameDebug name.
condition
ReturnsCondition identifier.
+
+
+

+ void cubos::core::ecs::SystemRegistry::remove(SystemId id) +

+

Unregisters the given system.

+ + + + + + + + + + +
Parameters
idSystem identifier.
+
+
+

+ void cubos::core::ecs::SystemRegistry::remove(ConditionId id) +

+

Unregisters the given condition.

+ + + + + + + + + + +
Parameters
idCondition identifier.
+
+
+

+ const std::string& cubos::core::ecs::SystemRegistry::name(SystemId id) const +

+

Gets the debug name of the given system.

+ + + + + + + + + + + + + + + + +
Parameters
idSystem identifier.
ReturnsSystem name.
+
+
+

+ const std::string& cubos::core::ecs::SystemRegistry::name(ConditionId id) const +

+

Gets the debug name of the given condition.

+ + + + + + + + + + + + + + + + +
Parameters
idCondition identifier.
ReturnsCondition name.
+
+
+

+ System<void>& cubos::core::ecs::SystemRegistry::system(SystemId id) +

+

Gets the system with the given identifier.

+ + + + + + + + + + +
Parameters
idSystem identifier.
+
+
+

+ System<bool>& cubos::core::ecs::SystemRegistry::condition(ConditionId id) +

+

Gets the condition with the given identifier.

+ + + + + + + + + + +
Parameters
idCondition identifier.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tables.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tables.html new file mode 100644 index 0000000000..04809b02a2 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tables.html @@ -0,0 +1,215 @@ + + + + + cubos::core::ecs::Tables class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Tables class final + +

+

Stores the tables of a given world.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Tables() defaulted +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void reset() +
+
Resets the registry to its initial state.
+
+ auto dense() -> DenseTableRegistry& +
+
Gets a reference to the dense table registry.
+
+ auto dense() const -> const DenseTableRegistry& +
+
Gets a reference to the dense table registry.
+
+ auto sparseRelation() -> SparseRelationTableRegistry& +
+
Gets a reference to the sparse relation table registry.
+
+ auto sparseRelation() const -> const SparseRelationTableRegistry& +
+
Gets a reference to the sparse relation table registry.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::Tables::reset() +

+

Resets the registry to its initial state.

+

Previously returned identifiers become invalid, as they might be reused.

+
+
+

+ DenseTableRegistry& cubos::core::ecs::Tables::dense() +

+

Gets a reference to the dense table registry.

+ + + + + + + +
ReturnsReference to dense table registry.
+
+
+

+ const DenseTableRegistry& cubos::core::ecs::Tables::dense() const +

+

Gets a reference to the dense table registry.

+ + + + + + + +
ReturnsReference to dense table registry.
+
+
+

+ SparseRelationTableRegistry& cubos::core::ecs::Tables::sparseRelation() +

+

Gets a reference to the sparse relation table registry.

+ + + + + + + +
ReturnsReference to sparse relation table registry.
+
+
+

+ const SparseRelationTableRegistry& cubos::core::ecs::Tables::sparseRelation() const +

+

Gets a reference to the sparse relation table registry.

+ + + + + + + +
ReturnsReference to sparse relation table registry.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tag.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tag.html new file mode 100644 index 0000000000..60bd5f687f --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Tag.html @@ -0,0 +1,185 @@ + + + + + cubos::core::ecs::Tag class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Tag class + +

+

Represents a tag to be used with the Cubos class.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Tag(std::string name) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto name() const -> std::string +
+
Returns the tag's name.
+
+ auto id() const -> std::string +
+
Returns an unique name for the tag, which is generated from its name and memory address.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::Tag::Tag(std::string name) +

+

Constructs.

+ + + + + + + + + + +
Parameters
nameName.
+
+
+

+ std::string cubos::core::ecs::Tag::name() const +

+

Returns the tag's name.

+ + + + + + + +
ReturnsName.
+
+
+

+ std::string cubos::core::ecs::Tag::id() const +

+

Returns an unique name for the tag, which is generated from its name and memory address.

+ + + + + + + +
ReturnsUnique identifier.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1TypeBuilder.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1TypeBuilder.html new file mode 100644 index 0000000000..aa094c7594 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1TypeBuilder.html @@ -0,0 +1,296 @@ + + + + + cubos::core::ecs::TypeBuilder class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::ecs::TypeBuilder class +

+

Builder for reflection::Type objects which represent ECS types.

+ + + + + + + + + + +
Template parameters
TRelation type.
+ +

Used to reduce the amount of boilerplate code required to define a ECS types. Automatically adds the reflection::ConstructibleTrait and reflection::FieldsTrait. The type T must be default-constructible, copy-constructible and move-constructible.

+
+

Constructors, destructors, conversion operators

+
+
+ TypeBuilder(std::string name) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto symmetric() && -> TypeBuilder&& +
+
Makes the type symmetric. Only used by relation types.
+
+ auto tree() && -> TypeBuilder&& +
+
Makes the type a tree relation. Only used by relation types.
+
+ auto ephemeral() && -> TypeBuilder&& +
+
Makes the type ephemeral.
+
+
template<typename F>
+ auto withField(std::string name, + F T::* pointer) && -> TypeBuilder&& +
+
Adds a field to the type.
+
+ auto build() && -> reflection::Type& +
+
Builds the type.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::ecs::TypeBuilder<T>::TypeBuilder(std::string name) +

+

Constructs.

+ + + + + + + + + + +
Parameters
nameType name, including namespace.
+
+
+

+
+ template<typename T> +
+ TypeBuilder&& cubos::core::ecs::TypeBuilder<T>::symmetric() && +

+

Makes the type symmetric. Only used by relation types.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ TypeBuilder&& cubos::core::ecs::TypeBuilder<T>::tree() && +

+

Makes the type a tree relation. Only used by relation types.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ TypeBuilder&& cubos::core::ecs::TypeBuilder<T>::ephemeral() && +

+

Makes the type ephemeral.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> + template<typename F> +
+ TypeBuilder&& cubos::core::ecs::TypeBuilder<T>::withField(std::string name, + F T::* pointer) && +

+

Adds a field to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
FField type.
Parameters
nameField name.
pointerField pointer.
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ reflection::Type& cubos::core::ecs::TypeBuilder<T>::build() && +

+

Builds the type.

+ + + + + + + +
ReturnsRelation type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Types.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Types.html new file mode 100644 index 0000000000..766176c8e9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1Types.html @@ -0,0 +1,575 @@ + + + + + cubos::core::ecs::Types class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Types class final + +

+

Registry of all data types used in an ECS world.

+ +
+

Public functions

+
+
+ void reset() +
+
Resets the registry to its initial state.
+
+ void addResource(const reflection::Type& type) +
+
Registers a resource type.
+
+ void addComponent(const reflection::Type& type) +
+
Registers a component type.
+
+ void addRelation(const reflection::Type& type) +
+
Registers a relation type.
+
+ void remove(const reflection::Type& type) +
+
Unregisters a data type.
+
+ auto id(const reflection::Type& type) const -> DataTypeId +
+
Gets the identifier of a data type.
+
+
template<typename T>
+ auto id() const -> DataTypeId +
+
Gets the identifier of a data type.
+
+ auto id(const std::string& name) const -> DataTypeId +
+
Gets the identifier of a data type.
+
+ auto type(DataTypeId id) const -> const reflection::Type& +
+
Gets a data type from its identifier.
+
+ auto contains(const reflection::Type& type) const -> bool +
+
Checks if a data type is registered.
+
+ auto contains(const std::string& name) const -> bool +
+
Checks if a data type is registered.
+
+ auto isResource(DataTypeId id) const -> bool +
+
Checks if the given data type is a resource.
+
+ auto isComponent(DataTypeId id) const -> bool +
+
Checks if the given data type is a component.
+
+ auto isRelation(DataTypeId id) const -> bool +
+
Checks if the given data type is a relation.
+
+ auto isSymmetricRelation(DataTypeId id) const -> bool +
+
Checks if the given data type is a symmetric relation.
+
+ auto isTreeRelation(DataTypeId id) const -> bool +
+
Checks if the given data type is a tree relation.
+
+ auto resources() const -> reflection::TypeRegistry +
+
Gets a type registry with only the resource types.
+
+ auto components() const -> reflection::TypeRegistry +
+
Gets a type registry with only the component types.
+
+ auto relations() const -> reflection::TypeRegistry +
+
Gets a type registry with only the relation types.
+
+
+
+

Function documentation

+
+

+ void cubos::core::ecs::Types::reset() +

+

Resets the registry to its initial state.

+

Previously returned identifiers become invalid, as they might be reused.

+
+
+

+ void cubos::core::ecs::Types::addResource(const reflection::Type& type) +

+

Registers a resource type.

+ + + + + + + + + + +
Parameters
typeResource type.
+
+
+

+ void cubos::core::ecs::Types::addComponent(const reflection::Type& type) +

+

Registers a component type.

+ + + + + + + + + + +
Parameters
typeComponent type.
+
+
+

+ void cubos::core::ecs::Types::addRelation(const reflection::Type& type) +

+

Registers a relation type.

+ + + + + + + + + + +
Parameters
typeRelation type.
+
+
+

+ void cubos::core::ecs::Types::remove(const reflection::Type& type) +

+

Unregisters a data type.

+ + + + + + + + + + +
Parameters
typeData type.
+
+
+

+ DataTypeId cubos::core::ecs::Types::id(const reflection::Type& type) const +

+

Gets the identifier of a data type.

+ + + + + + + + + + + + + + + + +
Parameters
typeData type.
ReturnsData type identifier.
+

Aborts if the data type is not registered.

+
+
+

+
+ template<typename T> +
+ DataTypeId cubos::core::ecs::Types::id() const +

+

Gets the identifier of a data type.

+ + + + + + + + + + + + + + + + +
Template parameters
TData type.
ReturnsData type identifier.
+

Aborts if the data type is not registered.

+
+
+

+ DataTypeId cubos::core::ecs::Types::id(const std::string& name) const +

+

Gets the identifier of a data type.

+ + + + + + + + + + + + + + + + +
Parameters
nameData type name.
ReturnsData type identifier.
+

Aborts if the data type is not registered.

+
+
+

+ const reflection::Type& cubos::core::ecs::Types::type(DataTypeId id) const +

+

Gets a data type from its identifier.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsData type.
+
+
+

+ bool cubos::core::ecs::Types::contains(const reflection::Type& type) const +

+

Checks if a data type is registered.

+ + + + + + + + + + + + + + + + +
Parameters
typeData type.
ReturnsWhether the data type is registered.
+
+
+

+ bool cubos::core::ecs::Types::contains(const std::string& name) const +

+

Checks if a data type is registered.

+ + + + + + + + + + + + + + + + +
Parameters
nameData type name.
ReturnsWhether the data type is registered.
+
+
+

+ bool cubos::core::ecs::Types::isResource(DataTypeId id) const +

+

Checks if the given data type is a resource.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsWhether the identifier refers to a resource.
+
+
+

+ bool cubos::core::ecs::Types::isComponent(DataTypeId id) const +

+

Checks if the given data type is a component.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsWhether the identifier refers to a component.
+
+
+

+ bool cubos::core::ecs::Types::isRelation(DataTypeId id) const +

+

Checks if the given data type is a relation.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsWhether the identifier refers to a relation.
+
+
+

+ bool cubos::core::ecs::Types::isSymmetricRelation(DataTypeId id) const +

+

Checks if the given data type is a symmetric relation.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsWhether the identifier refers to a symmetric relation.
+
+
+

+ bool cubos::core::ecs::Types::isTreeRelation(DataTypeId id) const +

+

Checks if the given data type is a tree relation.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsWhether the identifier refers to a tree relation.
+
+
+

+ reflection::TypeRegistry cubos::core::ecs::Types::resources() const +

+

Gets a type registry with only the resource types.

+ + + + + + + +
ReturnsResource type registry.
+
+
+

+ reflection::TypeRegistry cubos::core::ecs::Types::components() const +

+

Gets a type registry with only the component types.

+ + + + + + + +
ReturnsComponent type registry.
+
+
+

+ reflection::TypeRegistry cubos::core::ecs::Types::relations() const +

+

Gets a type registry with only the relation types.

+ + + + + + + +
ReturnsRelation type registry.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1World.html b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1World.html new file mode 100644 index 0000000000..dfe25c35d4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1ecs_1_1World.html @@ -0,0 +1,2980 @@ + + + + + cubos::core::ecs::World class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::World class + +

+

Holds entities, their components and resources.

+ + +
+

Public types

+
+
+ struct Component +
+
Output structure for the iterator.
+
+ struct Relation +
+
Output structure for the iterator.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ World() +
+
Constructs.
+
+ Components(World& world, + Entity entity) +
+
Constructs.
+
+ ConstComponents(const World& world, + Entity entity) +
+
Constructs.
+
+ Relations(World& world, + Entity entity, + bool from) +
+
Constructs.
+
+ ConstRelations(const World& world, + Entity entity, + bool from) +
+
Constructs.
+
+ Iterator(Components& components, + bool end) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+ Iterator(const ConstComponents& components, + bool end) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+ Iterator(Relations& relations, + bool end) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+ Iterator(ConstRelations& relations, + bool end) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ void reset() +
+
Resets the world to its initial state.
+
+ void registerResource(const reflection::Type& type) +
+
Registers a resource type.
+
+
template<typename T>
+ void registerResource() +
+
Registers a resource type.
+
+ void registerComponent(const reflection::Type& type) +
+
Registers a component type.
+
+
template<typename T>
+ void registerComponent() +
+
Registers a component type.
+
+ void registerRelation(const reflection::Type& type) +
+
Registers a relation type.
+
+
template<typename T>
+ void registerRelation() +
+
Registers a relation type.
+
+ void unregister(const reflection::Type& type) +
+
Unregisters a type.
+
+ auto types() -> Types& +
+
Returns the types registry of the world.
+
+ auto types() const -> const Types& +
+
Returns the types registry of the world.
+
+ auto tables() -> Tables& +
+
Returns the tables of the world.
+
+ auto tables() const -> const Tables& +
+
Returns the tables of the world.
+
+ auto archetypeGraph() -> ArchetypeGraph& +
+
Returns the archetype graph of the world.
+
+ auto archetypeGraph() const -> const ArchetypeGraph& +
+
Returns the archetype graph of the world.
+
+ auto observers() -> Observers& +
+
Returns the observers of the world.
+
+ auto observers() const -> const Observers& +
+
Returns the observers of the world.
+
+ void insertResource(memory::AnyValue value) +
+
Inserts a new resource into the world.
+
+
template<typename T>
+ void insertResource(T value) +
+
Inserts a new resource into the world.
+
+ auto eraseResource(const reflection::Type& type) -> bool +
+
Erases a new resource from the world.
+
+
template<typename T>
+ auto eraseResource() -> bool +
+
Erases a new resource from the world.
+
+ auto hasResource(const reflection::Type& type) const -> bool +
+
Checks if a resource is present.
+
+
template<typename T>
+ auto hasResource() const -> bool +
+
Checks if a resource is present.
+
+ auto resource(const reflection::Type& type) -> void* +
+
Returns a pointer to a resource.
+
+
template<typename T>
+ auto resource() -> T& +
+
Returns a reference to a resource.
+
+ auto resource(const reflection::Type& type) const -> const void* +
+
Returns a pointer to a resource.
+
+
template<typename T>
+ auto resource() const -> const T& +
+
Returns a reference to a resource.
+
+ auto create() -> Entity +
+
Creates a new entity.
+
+ void createAt(Entity entity) +
+
Creates a new entity with the given identifier.
+
+ auto reserve() -> Entity +
+
Reserves an entity identifier, without actually creating an entity.
+
+ void destroy(Entity entity) +
+
Destroys an entity.
+
+ auto generation(uint32_t index) const -> uint32_t +
+
Gets the generation of the entity with the given index.
+
+ auto archetype(Entity entity) const -> ArchetypeId +
+
Gets the archetype of the given entity.
+
+ auto isAlive(Entity entity) const -> bool +
+
Checks if an entity is still alive.
+
+ auto components(Entity entity) -> Components +
+
Creates a components view for the given entity.
+
+ auto components(Entity entity) const -> ConstComponents +
+
Creates a components view for the given entity.
+
+ auto relationsFrom(Entity entity) -> Relations +
+
Creates a view for relations coming from the given entity.
+
+ auto relationsFrom(Entity entity) const -> ConstRelations +
+
Creates a view for relations coming from the given entity.
+
+ auto relationsTo(Entity entity) -> Relations +
+
Creates a view for relations going into the given entity.
+
+ auto relationsTo(Entity entity) const -> ConstRelations +
+
Creates a view for relations going into the given entity.
+
+ void relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) +
+
Inserts a relation between the two given entities.
+
+
template<typename T>
+ void relate(Entity from, + Entity to, + T value) +
+
Inserts a relation between the two given entities.
+
+ void unrelate(Entity from, + Entity to, + const reflection::Type& type) +
+
Removes the relation, if there's any, between the two given entities.
+
+
template<typename T>
+ void unrelate(Entity from, + Entity to) +
+
Removes the relation, if there's any, between the two given entities.
+
+ auto related(Entity from, + Entity to, + const reflection::Type& type) const -> bool +
+
Checks if there's a relation of the given type between the two given entities.
+
+
template<typename T>
+ auto related(Entity from, + Entity to) const -> bool +
+
Checks if there's a relation of the given type between the two given entities.
+
+ auto relation(Entity from, + Entity to, + const reflection::Type& type) -> void* +
+
Gets a pointer to the relation value between the two given entities.
+
+ auto relation(Entity from, + Entity to, + const reflection::Type& type) const -> const void* +
+
Gets a pointer to the relation value between the two given entities.
+
+
template<typename T>
+ auto relation(Entity from, + Entity to) -> T& +
+
Gets a reference to the relation value between the two given entities.
+
+
template<typename T>
+ auto relation(Entity from, + Entity to) const -> const T& +
+
Gets a reference to the relation value between the two given entities.
+
+ auto entityCount() const -> std::size_t +
+
Gets the number of alive entities.
+
+ auto has(const reflection::Type& type) const -> bool +
+
Checks if the given component is present.
+
+
template<typename T>
+ auto has() const -> bool +
+
Checks if the given component is present.
+
+ auto get(const reflection::Type& type) -> void* +
+
Returns a pointer to the component with the given type.
+
+
template<typename T>
+ auto get() -> T& +
+
Returns a pointer to the component with the given type.
+
+ auto begin() -> Iterator +
+
Returns an iterator to the first component.
+
+ auto end() -> Iterator +
+
Returns an iterator to the entry after the last component.
+
+ auto add(const reflection::Type& type, + void* value) -> Components& +
+
Adds a component to the entity.
+
+
template<typename T>
+ auto add(T&& value) -> Components& +
+
Adds a component to the entity.
+
+ auto remove(const reflection::Type& type) -> Components& +
+
Removes a component from the entity.
+
+
template<typename T>
+ auto remove() -> Components& +
+
Removes a component from the entity.
+
+ auto has(const reflection::Type& type) const -> bool +
+
Checks if the given component is present.
+
+
template<typename T>
+ auto has() const -> bool +
+
Checks if the given component is present.
+
+ auto get(const reflection::Type& type) const -> const void* +
+
Returns a pointer to the component with the given type.
+
+
template<typename T>
+ auto get() const -> const T& +
+
Returns a pointer to the component with the given type.
+
+ auto begin() const -> Iterator +
+
Returns an iterator to the first component.
+
+ auto end() const -> Iterator +
+
Returns an iterator to the entry after the last component.
+
+ auto has(const reflection::Type& type, + Entity entity) const -> bool +
+
Checks if the entity is related to another entity with the given type.
+
+
template<typename T>
+ auto has(Entity entity) const -> bool +
+
Checks if the entity is related to another entity with the given type.
+
+ auto get(const reflection::Type& type, + Entity entity) -> void* +
+
Returns a pointer to the given relation.
+
+
template<typename T>
+ auto get(Entity entity) -> T& +
+
Returns a pointer to the given relation.
+
+ auto begin() -> Iterator +
+
Returns an iterator to the first relation.
+
+ auto end() -> Iterator +
+
Returns an iterator to the entry after the last relation.
+
+ auto has(const reflection::Type& type, + Entity entity) const -> bool +
+
Checks if the entity is related to another entity with the given type.
+
+
template<typename T>
+ auto has(Entity entity) const -> bool +
+
Checks if the entity is related to another entity with the given type.
+
+ auto get(const reflection::Type& type, + Entity entity) -> const void* +
+
Returns a pointer to the given relation.
+
+
template<typename T>
+ auto get(Entity entity) -> const T& +
+
Returns a pointer to the given relation.
+
+ auto begin() -> Iterator +
+
Returns an iterator to the first relation.
+
+ auto end() -> Iterator +
+
Returns an iterator to the entry after the last relation.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Component& +
+
Accesses the component referenced by this iterator.
+
+ auto operator->() const -> const Component* +
+
Accesses the component referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Component& +
+
Accesses the component referenced by this iterator.
+
+ auto operator->() const -> const Component* +
+
Accesses the component referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Relation& +
+
Accesses the relation referenced by this iterator.
+
+ auto operator->() const -> const Relation* +
+
Accesses the relation referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Relation& +
+
Accesses the relation referenced by this iterator.
+
+ auto operator->() const -> const Relation* +
+
Accesses the relation referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::World::Components(World& world, + Entity entity) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
worldWorld.
entityEntity.
+
+
+

+ cubos::core::ecs::World::ConstComponents(const World& world, + Entity entity) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
worldWorld.
entityEntity.
+
+
+

+ cubos::core::ecs::World::Relations(World& world, + Entity entity, + bool from) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
worldWorld.
entityEntity.
fromWhether the relations are from or to the entity.
+
+
+

+ cubos::core::ecs::World::ConstRelations(const World& world, + Entity entity, + bool from) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
worldWorld.
entityEntity.
fromWhether the relations are from or to the entity.
+
+
+

+ cubos::core::ecs::World::Iterator(Components& components, + bool end) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
componentsComponents view.
endWhether the iterator represents the end or the beginning.
+
+
+

+ cubos::core::ecs::World::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::ecs::World::Iterator(const ConstComponents& components, + bool end) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
componentsComponents view.
endWhether the iterator represents the end or the beginning.
+
+
+

+ cubos::core::ecs::World::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::ecs::World::Iterator(Relations& relations, + bool end) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
relationsRelations view.
endWhether the iterator represents the end or the beginning.
+
+
+

+ cubos::core::ecs::World::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::ecs::World::Iterator(ConstRelations& relations, + bool end) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
relationsRelations view.
endWhether the iterator represents the end or the beginning.
+
+
+

+ cubos::core::ecs::World::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ void cubos::core::ecs::World::reset() +

+

Resets the world to its initial state.

+

Equivalent to constructing a new world. Previously returned entity identifiers become invalid, as they might be reused.

+
+
+

+ void cubos::core::ecs::World::registerResource(const reflection::Type& type) +

+

Registers a resource type.

+ + + + + + + + + + +
Parameters
typeResource type.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::registerResource() +

+

Registers a resource type.

+ + + + + + + + + + +
Template parameters
TResource type.
+
+
+

+ void cubos::core::ecs::World::registerComponent(const reflection::Type& type) +

+

Registers a component type.

+ + + + + + + + + + +
Parameters
typeComponent type.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::registerComponent() +

+

Registers a component type.

+ + + + + + + + + + +
Template parameters
TComponent type.
+
+
+

+ void cubos::core::ecs::World::registerRelation(const reflection::Type& type) +

+

Registers a relation type.

+ + + + + + + + + + +
Parameters
typeRelation type.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::registerRelation() +

+

Registers a relation type.

+ + + + + + + + + + +
Template parameters
TRelation type.
+
+
+

+ void cubos::core::ecs::World::unregister(const reflection::Type& type) +

+

Unregisters a type.

+ + + + + + + + + + +
Parameters
typeRype
+
+
+

+ Types& cubos::core::ecs::World::types() +

+

Returns the types registry of the world.

+ + + + + + + +
ReturnsTypes registry.
+
+
+

+ const Types& cubos::core::ecs::World::types() const +

+

Returns the types registry of the world.

+ + + + + + + +
ReturnsTypes registry.
+
+
+

+ Tables& cubos::core::ecs::World::tables() +

+

Returns the tables of the world.

+ + + + + + + +
ReturnsTables.
+
+
+

+ const Tables& cubos::core::ecs::World::tables() const +

+

Returns the tables of the world.

+ + + + + + + +
ReturnsTables.
+
+
+

+ ArchetypeGraph& cubos::core::ecs::World::archetypeGraph() +

+

Returns the archetype graph of the world.

+ + + + + + + +
ReturnsArchetype graph.
+
+
+

+ const ArchetypeGraph& cubos::core::ecs::World::archetypeGraph() const +

+

Returns the archetype graph of the world.

+ + + + + + + +
ReturnsArchetype graph.
+
+
+

+ Observers& cubos::core::ecs::World::observers() +

+

Returns the observers of the world.

+ + + + + + + +
ReturnsObservers.
+
+
+

+ const Observers& cubos::core::ecs::World::observers() const +

+

Returns the observers of the world.

+ + + + + + + +
ReturnsObservers.
+
+
+

+ void cubos::core::ecs::World::insertResource(memory::AnyValue value) +

+

Inserts a new resource into the world.

+ + + + + + + + + + +
Parameters
valueResource value.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::insertResource(T value) +

+

Inserts a new resource into the world.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
TResource type.
Parameters
valueResource value.
+
+
+

+ bool cubos::core::ecs::World::eraseResource(const reflection::Type& type) +

+

Erases a new resource from the world.

+ + + + + + + + + + + + + + + + +
Parameters
typeResource type.
ReturnsWhether there was such a resource.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::eraseResource() +

+

Erases a new resource from the world.

+ + + + + + + + + + + + + + + + +
Template parameters
TResource type.
ReturnsWhether there was such a resource.
+
+
+

+ bool cubos::core::ecs::World::hasResource(const reflection::Type& type) const +

+

Checks if a resource is present.

+ + + + + + + + + + + + + + + + +
Parameters
typeResource type.
ReturnsWhether the resource is present.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::hasResource() const +

+

Checks if a resource is present.

+ + + + + + + + + + + + + + + + +
Template parameters
TResource type.
ReturnsWhether the resource is present.
+
+
+

+ void* cubos::core::ecs::World::resource(const reflection::Type& type) +

+

Returns a pointer to a resource.

+ + + + + + + + + + + + + + + + +
Parameters
typeResource type.
ReturnsResource.
+
+
+

+
+ template<typename T> +
+ T& cubos::core::ecs::World::resource() +

+

Returns a reference to a resource.

+ + + + + + + + + + + + + + + + +
Template parameters
TResource type.
ReturnsResource.
+
+
+

+ const void* cubos::core::ecs::World::resource(const reflection::Type& type) const +

+

Returns a pointer to a resource.

+ + + + + + + + + + + + + + + + +
Parameters
typeResource type.
ReturnsResource.
+
+
+

+
+ template<typename T> +
+ const T& cubos::core::ecs::World::resource() const +

+

Returns a reference to a resource.

+ + + + + + + + + + + + + + + + +
Template parameters
TResource type.
ReturnsResource.
+
+
+

+ Entity cubos::core::ecs::World::create() +

+

Creates a new entity.

+ + + + + + + +
ReturnsEntity identifier.
+
+
+

+ void cubos::core::ecs::World::createAt(Entity entity) +

+

Creates a new entity with the given identifier.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity identifier.
ReturnsEntity.
+

Aborts if the entity already exists.

+
+
+

+ Entity cubos::core::ecs::World::reserve() +

+

Reserves an entity identifier, without actually creating an entity.

+ + + + + + + +
ReturnsEntity identifier.
+

The entity can be later created with a call to createAt().

+
+
+

+ void cubos::core::ecs::World::destroy(Entity entity) +

+

Destroys an entity.

+ + + + + + + + + + +
Parameters
entityEntity identifier.
+

If an entity has already been destroyed, this function does nothing.

+
+
+

+ uint32_t cubos::core::ecs::World::generation(uint32_t index) const +

+

Gets the generation of the entity with the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexEntity index.
ReturnsEntity generation.
+
+
+

+ ArchetypeId cubos::core::ecs::World::archetype(Entity entity) const +

+

Gets the archetype of the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsArchetype identifier.
+
+
+

+ bool cubos::core::ecs::World::isAlive(Entity entity) const +

+

Checks if an entity is still alive.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsWhether the entity is alive.
+
+
+

+ Components cubos::core::ecs::World::components(Entity entity) +

+

Creates a components view for the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsComponents view.
+

The given entity must be alive.

+
+
+

+ ConstComponents cubos::core::ecs::World::components(Entity entity) const +

+

Creates a components view for the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity.
ReturnsComponents view.
+

The given entity must be alive.

+
+
+

+ Relations cubos::core::ecs::World::relationsFrom(Entity entity) +

+

Creates a view for relations coming from the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityFrom entity.
ReturnsRelations view.
+

The given entity must be alive.

+
+
+

+ ConstRelations cubos::core::ecs::World::relationsFrom(Entity entity) const +

+

Creates a view for relations coming from the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityFrom entity.
ReturnsRelations view.
+

The given entity must be alive.

+
+
+

+ Relations cubos::core::ecs::World::relationsTo(Entity entity) +

+

Creates a view for relations going into the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityTo entity.
ReturnsRelations view.
+

The given entity must be alive.

+
+
+

+ ConstRelations cubos::core::ecs::World::relationsTo(Entity entity) const +

+

Creates a view for relations going into the given entity.

+ + + + + + + + + + + + + + + + +
Parameters
entityTo entity.
ReturnsRelations view.
+

The given entity must be alive.

+
+
+

+ void cubos::core::ecs::World::relate(Entity from, + Entity to, + const reflection::Type& type, + void* value) +

+

Inserts a relation between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
valueRelation value to move.
+

If the relation already exists, it is overwritten.

+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::relate(Entity from, + Entity to, + T value) +

+

Inserts a relation between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
valueRelation value.
+

If the relation already exists, it is overwritten.

+
+
+

+ void cubos::core::ecs::World::unrelate(Entity from, + Entity to, + const reflection::Type& type) +

+

Removes the relation, if there's any, between the two given entities.

+ + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
+
+
+

+
+ template<typename T> +
+ void cubos::core::ecs::World::unrelate(Entity from, + Entity to) +

+

Removes the relation, if there's any, between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
+
+
+

+ bool cubos::core::ecs::World::related(Entity from, + Entity to, + const reflection::Type& type) const +

+

Checks if there's a relation of the given type between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
ReturnsWhether the relation exists.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::related(Entity from, + Entity to) const +

+

Checks if there's a relation of the given type between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
ReturnsWhether the relation exists.
+
+
+

+ void* cubos::core::ecs::World::relation(Entity from, + Entity to, + const reflection::Type& type) +

+

Gets a pointer to the relation value between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
ReturnsPointer to relation value.
+

The relation must exist.

+
+
+

+ const void* cubos::core::ecs::World::relation(Entity from, + Entity to, + const reflection::Type& type) const +

+

Gets a pointer to the relation value between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
fromFrom entity.
toTo entity.
typeRelation type.
ReturnsPointer to relation value.
+

The relation must exist.

+
+
+

+
+ template<typename T> +
+ T& cubos::core::ecs::World::relation(Entity from, + Entity to) +

+

Gets a reference to the relation value between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
ReturnsReference to relation value.
+

The relation must exist.

+
+
+

+
+ template<typename T> +
+ const T& cubos::core::ecs::World::relation(Entity from, + Entity to) const +

+

Gets a reference to the relation value between the two given entities.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
fromFrom entity.
toTo entity.
ReturnsReference to relation value.
+

The relation must exist.

+
+
+

+ std::size_t cubos::core::ecs::World::entityCount() const +

+

Gets the number of alive entities.

+ + + + + + + +
ReturnsNumber of alive entities.
+
+
+

+ bool cubos::core::ecs::World::has(const reflection::Type& type) const +

+

Checks if the given component is present.

+ + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
ReturnsWhether the component is present.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::has() const +

+

Checks if the given component is present.

+ + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
ReturnsWhether the component is present.
+
+
+

+ void* cubos::core::ecs::World::get(const reflection::Type& type) +

+

Returns a pointer to the component with the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
ReturnsPointer to component.
+

The entity must have a component with the given type.

+
+
+

+
+ template<typename T> +
+ T& cubos::core::ecs::World::get() +

+

Returns a pointer to the component with the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
ReturnsReference to component.
+

The entity must have a component of the type T.

+
+
+

+ Iterator cubos::core::ecs::World::begin() +

+

Returns an iterator to the first component.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::World::end() +

+

Returns an iterator to the entry after the last component.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Components& cubos::core::ecs::World::add(const reflection::Type& type, + void* value) +

+

Adds a component to the entity.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
valueComponent value to move.
ReturnsReference to this.
+

If the entity already has the component, its value is overwritten.

+
+
+

+
+ template<typename T> +
+ Components& cubos::core::ecs::World::add(T&& value) +

+

Adds a component to the entity.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
Parameters
valueComponent value to move.
ReturnsReference to this.
+

If the entity already has the component, its value is overwritten.

+
+
+

+ Components& cubos::core::ecs::World::remove(const reflection::Type& type) +

+

Removes a component from the entity.

+ + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
ReturnsReference to this.
+

If the entity doesn't have the component, nothing happens.

+
+
+

+
+ template<typename T> +
+ Components& cubos::core::ecs::World::remove() +

+

Removes a component from the entity.

+ + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
ReturnsReference to this.
+

If the entity doesn't have the component, nothing happens.

+
+
+

+ bool cubos::core::ecs::World::has(const reflection::Type& type) const +

+

Checks if the given component is present.

+ + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
ReturnsWhether the component is present.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::has() const +

+

Checks if the given component is present.

+ + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
ReturnsWhether the component is present.
+
+
+

+ const void* cubos::core::ecs::World::get(const reflection::Type& type) const +

+

Returns a pointer to the component with the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
ReturnsPointer to component.
+

The entity must have a component with the given type.

+
+
+

+
+ template<typename T> +
+ const T& cubos::core::ecs::World::get() const +

+

Returns a pointer to the component with the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
TComponent type.
ReturnsReference to component.
+

The entity must have a component of the type T.

+
+
+

+ Iterator cubos::core::ecs::World::begin() const +

+

Returns an iterator to the first component.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::World::end() const +

+

Returns an iterator to the entry after the last component.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::ecs::World::has(const reflection::Type& type, + Entity entity) const +

+

Checks if the entity is related to another entity with the given type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
entityEntity.
ReturnsWhether the relation is present.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::has(Entity entity) const +

+

Checks if the entity is related to another entity with the given type.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
ReturnsWhether the relation is present.
+
+
+

+ void* cubos::core::ecs::World::get(const reflection::Type& type, + Entity entity) +

+

Returns a pointer to the given relation.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
entityEntity.
ReturnsPointer to relation.
+

The entity must be related with the given entity and with the given type.

+
+
+

+
+ template<typename T> +
+ T& cubos::core::ecs::World::get(Entity entity) +

+

Returns a pointer to the given relation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
ReturnsRelation.
+

The entity must be related with the given entity and with the given type.

+
+
+

+ Iterator cubos::core::ecs::World::begin() +

+

Returns an iterator to the first relation.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::World::end() +

+

Returns an iterator to the entry after the last relation.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::ecs::World::has(const reflection::Type& type, + Entity entity) const +

+

Checks if the entity is related to another entity with the given type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
entityEntity.
ReturnsWhether the relation is present.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::ecs::World::has(Entity entity) const +

+

Checks if the entity is related to another entity with the given type.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
ReturnsWhether the relation is present.
+
+
+

+ const void* cubos::core::ecs::World::get(const reflection::Type& type, + Entity entity) +

+

Returns a pointer to the given relation.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
entityEntity.
ReturnsPointer to relation.
+

The entity must be related with the given entity and with the given type.

+
+
+

+
+ template<typename T> +
+ const T& cubos::core::ecs::World::get(Entity entity) +

+

Returns a pointer to the given relation.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TRelation type.
Parameters
entityEntity.
ReturnsRelation.
+

The entity must be related with the given entity and with the given type.

+
+
+

+ Iterator cubos::core::ecs::World::begin() +

+

Returns an iterator to the first relation.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::ecs::World::end() +

+

Returns an iterator to the entry after the last relation.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::ecs::World::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same component.
+
+
+

+ const Component& cubos::core::ecs::World::operator*() const +

+

Accesses the component referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Component* cubos::core::ecs::World::operator->() const +

+

Accesses the component referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::ecs::World::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::ecs::World::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same component.
+
+
+

+ const Component& cubos::core::ecs::World::operator*() const +

+

Accesses the component referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Component* cubos::core::ecs::World::operator->() const +

+

Accesses the component referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::ecs::World::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::ecs::World::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same relation.
+
+
+

+ const Relation& cubos::core::ecs::World::operator*() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Relation* cubos::core::ecs::World::operator->() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::ecs::World::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::ecs::World::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same relation.
+
+
+

+ const Relation& cubos::core::ecs::World::operator*() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Relation* cubos::core::ecs::World::operator->() const +

+

Accesses the relation referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::ecs::World::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1RenderDevice.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1RenderDevice.html new file mode 100644 index 0000000000..09f8c74a67 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1RenderDevice.html @@ -0,0 +1,1386 @@ + + + + + cubos::core::gl::RenderDevice class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::RenderDevice class + +

+

Interface used to wrap low-level rendering APIs such as OpenGL.

+ +

Using this interface, the engine never directly interacts with OpenGL or any other low-level rendering API. This allows use to use different rendering APIs without having to change the engine code, which is useful for porting the engine to different platforms.

+
+

Public functions

+
+
+ auto createFramebuffer(const FramebufferDesc& desc) -> Framebuffer pure virtual +
+
Creates a new framebuffer.
+
+ void setFramebuffer(Framebuffer fb) pure virtual +
+
Sets the current framebuffer.
+
+ auto createRasterState(const RasterStateDesc& desc) -> RasterState pure virtual +
+
Creates a new rasterizer state.
+
+ void setRasterState(RasterState rs) pure virtual +
+
Sets the current rasterizer state.
+
+ auto createDepthStencilState(const DepthStencilStateDesc& desc) -> DepthStencilState pure virtual +
+
Creates a new depth stencil state.
+
+ void setDepthStencilState(DepthStencilState dss) pure virtual +
+
Sets the current depth stencil state.
+
+ auto createBlendState(const BlendStateDesc& desc) -> BlendState pure virtual +
+
Creates a new blend state.
+
+ void setBlendState(BlendState bs) pure virtual +
+
Sets the current blend state.
+
+ auto createPixelPackBuffer(std::size_t size) -> PixelPackBuffer pure virtual +
+
Creates a new pixel pack buffer.
+
+ auto createSampler(const SamplerDesc& desc) -> Sampler pure virtual +
+
Creates a new texture sampler.
+
+ auto createTexture1D(const Texture1DDesc& desc) -> Texture1D pure virtual +
+
Creates a new 1D texture.
+
+ auto createTexture2D(const Texture2DDesc& desc) -> Texture2D pure virtual +
+
Creates a new 2D texture.
+
+ auto createTexture2DArray(const Texture2DArrayDesc& desc) -> Texture2DArray pure virtual +
+
Creates a new 2D texture array.
+
+ auto createTexture3D(const Texture3DDesc& desc) -> Texture3D pure virtual +
+
Creates a new 3D texture.
+
+ auto createCubeMap(const CubeMapDesc& desc) -> CubeMap pure virtual +
+
Creates a new cube map.
+
+ auto createCubeMapArray(const CubeMapArrayDesc& desc) -> CubeMapArray pure virtual +
+
Creates a new cube map array.
+
+ auto createConstantBuffer(std::size_t size, + const void* data, + Usage usage) -> ConstantBuffer pure virtual +
+
Creates a new constant buffer.
+
+ auto createIndexBuffer(std::size_t size, + const void* data, + IndexFormat format, + Usage usage) -> IndexBuffer pure virtual +
+
Creates a new index buffer.
+
+ void setIndexBuffer(IndexBuffer ib) pure virtual +
+
Sets the current index buffer.
+
+ auto createVertexBuffer(std::size_t size, + const void* data, + Usage usage) -> VertexBuffer pure virtual +
+
Creates a new vertex buffer.
+
+ auto createVertexArray(const VertexArrayDesc& desc) -> VertexArray pure virtual +
+
Creates a new vertex array.
+
+ void setVertexArray(VertexArray va) pure virtual +
+
Sets the current vertex array.
+
+ auto createShaderStage(Stage stage, + const char* src) -> ShaderStage pure virtual +
+
Creates a new shader stage from GLSL source code.
+
+ auto createShaderPipeline(ShaderStage vs, + ShaderStage ps) -> ShaderPipeline pure virtual +
+
Creates a new shader pipeline from vertex and pixel shaders.
+
+ auto createShaderPipeline(ShaderStage vs, + ShaderStage gs, + ShaderStage ps) -> ShaderPipeline pure virtual +
+
Creates a new shader pipeline from vertex, pixel and geometry shaders.
+
+ auto createShaderPipeline(ShaderStage cs) -> ShaderPipeline pure virtual +
+
Creates a new shader pipeline from a compute shader. Unsupported on some platforms.
+
+ void setShaderPipeline(ShaderPipeline pipeline) pure virtual +
+
Sets the current shader pipeline used for rendering.
+
+ auto createTimer() -> Timer pure virtual +
+
Creates a new timer.
+
+ auto createPipelinedTimer() -> PipelinedTimer +
+
Creates a new pipelined timer.
+
+ void clearColor(float r, + float g, + float b, + float a) pure virtual +
+
Clears the color buffer bit on the current framebuffer to a specific color.
+
+ void clearTargetColor(std::size_t target, + float r, + float g, + float b, + float a) pure virtual +
+
Clears the color buffer of a specific target on the current framebuffer to a specific color.
+
+ void clearTargetColor(std::size_t target, + int r, + int g, + int b, + int a) pure virtual +
+
Clear the color buffer of a specific target on the current framebuffer to a specific color using integer values.
+
+ void clearDepth(float depth) pure virtual +
+
Clears the depth buffer bit on the current framebuffer to a specific value.
+
+ void clearStencil(int stencil) pure virtual +
+
Clears the stencil buffer bit on the current framebuffer to a specific value.
+
+ void drawLines(std::size_t offset, + std::size_t count) pure virtual +
+
Draws lines.
+
+ void drawTriangles(std::size_t offset, + std::size_t count) pure virtual +
+
Draws tringles.
+
+ void drawTrianglesIndexed(std::size_t offset, + std::size_t count) pure virtual +
+
Draws tringles with an index buffer.
+
+ void drawTrianglesInstanced(std::size_t offset, + std::size_t count, + std::size_t instanceCount) pure virtual +
+
Draws tringles multiple times.
+
+ void drawTrianglesIndexedInstanced(std::size_t offset, + std::size_t count, + std::size_t instanceCount) pure virtual +
+
Draws tringles multiple times with an index buffer.
+
+ void dispatchCompute(std::size_t x, + std::size_t y, + std::size_t z) pure virtual +
+
Dispatches a compute pipeline.
+
+ void memoryBarrier(MemoryBarriers barriers) pure virtual +
+
Defines a barrier ordering memory transactions. Unsupported on some platforms.
+
+ void setViewport(int x, + int y, + int w, + int h) pure virtual +
+
Sets the current viewport.
+
+ void setScissor(int x, + int y, + int w, + int h) pure virtual +
+
Sets the current scissor rectangle.
+
+ auto getProperty(Property prop) -> int pure virtual +
+
Gets a runtime property of the render device.
+
+
+
+

Function documentation

+
+

+ Framebuffer cubos::core::gl::RenderDevice::createFramebuffer(const FramebufferDesc& desc) pure virtual +

+

Creates a new framebuffer.

+ + + + + + + + + + + + + + + + +
Parameters
descFramebuffer description.
ReturnsFramebuffer handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setFramebuffer(Framebuffer fb) pure virtual +

+

Sets the current framebuffer.

+ + + + + + + + + + +
Parameters
fbFramebuffer handle.
+
+
+

+ RasterState cubos::core::gl::RenderDevice::createRasterState(const RasterStateDesc& desc) pure virtual +

+

Creates a new rasterizer state.

+ + + + + + + + + + + + + + + + +
Parameters
descRasterizer state description.
ReturnsRasterizer state handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setRasterState(RasterState rs) pure virtual +

+

Sets the current rasterizer state.

+ + + + + + + + + + +
Parameters
rsRasterizer state handle.
+
+
+

+ DepthStencilState cubos::core::gl::RenderDevice::createDepthStencilState(const DepthStencilStateDesc& desc) pure virtual +

+

Creates a new depth stencil state.

+ + + + + + + + + + + + + + + + +
Parameters
descDepth stencil state description.
ReturnsDepth stencil state handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setDepthStencilState(DepthStencilState dss) pure virtual +

+

Sets the current depth stencil state.

+ + + + + + + + + + +
Parameters
dssDepth stencil state handle.
+
+
+

+ BlendState cubos::core::gl::RenderDevice::createBlendState(const BlendStateDesc& desc) pure virtual +

+

Creates a new blend state.

+ + + + + + + + + + + + + + + + +
Parameters
descBlend state description.
ReturnsBlend state handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setBlendState(BlendState bs) pure virtual +

+

Sets the current blend state.

+ + + + + + + + + + +
Parameters
bsBlend state handle.
+
+
+

+ PixelPackBuffer cubos::core::gl::RenderDevice::createPixelPackBuffer(std::size_t size) pure virtual +

+

Creates a new pixel pack buffer.

+ + + + + + + + + + + + + + + + +
Parameters
sizeBuffer size in bytes.
ReturnsPixel pack buffer handle, or nullptr on failure.
+
+
+

+ Sampler cubos::core::gl::RenderDevice::createSampler(const SamplerDesc& desc) pure virtual +

+

Creates a new texture sampler.

+ + + + + + + + + + + + + + + + +
Parameters
descSampler description.
ReturnsSampler handle, or nullptr on failure.
+
+
+

+ Texture1D cubos::core::gl::RenderDevice::createTexture1D(const Texture1DDesc& desc) pure virtual +

+

Creates a new 1D texture.

+ + + + + + + + + + + + + + + + +
Parameters
desc1D texture description.
ReturnsTexture handle, or nullptr on failure.
+
+
+

+ Texture2D cubos::core::gl::RenderDevice::createTexture2D(const Texture2DDesc& desc) pure virtual +

+

Creates a new 2D texture.

+ + + + + + + + + + + + + + + + +
Parameters
desc2D texture description.
ReturnsTexture handle, or nullptr on failure.
+
+
+

+ Texture2DArray cubos::core::gl::RenderDevice::createTexture2DArray(const Texture2DArrayDesc& desc) pure virtual +

+

Creates a new 2D texture array.

+ + + + + + + + + + + + + + + + +
Parameters
desc2D texture array description.
ReturnsTexture array handle, or nullptr on failure.
+
+
+

+ Texture3D cubos::core::gl::RenderDevice::createTexture3D(const Texture3DDesc& desc) pure virtual +

+

Creates a new 3D texture.

+ + + + + + + + + + + + + + + + +
Parameters
desc3D texture description.
ReturnsTexture handle, or nullptr on failure.
+
+
+

+ CubeMap cubos::core::gl::RenderDevice::createCubeMap(const CubeMapDesc& desc) pure virtual +

+

Creates a new cube map.

+ + + + + + + + + + + + + + + + +
Parameters
descCube map description.
ReturnsCube map handle, or nullptr on failure.
+
+
+

+ CubeMapArray cubos::core::gl::RenderDevice::createCubeMapArray(const CubeMapArrayDesc& desc) pure virtual +

+

Creates a new cube map array.

+ + + + + + + + + + + + + + + + +
Parameters
descCube map array description.
ReturnsCube map array handle, or nullptr on failure.
+
+
+

+ ConstantBuffer cubos::core::gl::RenderDevice::createConstantBuffer(std::size_t size, + const void* data, + Usage usage) pure virtual +

+

Creates a new constant buffer.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
sizeSize in bytes.
dataInitial data, can be nullptr.
usageUsage which the buffer will have.
ReturnsConstant buffer handle, or nullptr on failure.
+
+
+

+ IndexBuffer cubos::core::gl::RenderDevice::createIndexBuffer(std::size_t size, + const void* data, + IndexFormat format, + Usage usage) pure virtual +

+

Creates a new index buffer.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
sizeSize in bytes.
dataInitial data, can be nullptr.
formatIndex format.
usageUsage which the buffer will have.
ReturnsIndex buffer handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setIndexBuffer(IndexBuffer ib) pure virtual +

+

Sets the current index buffer.

+ + + + + + + + + + +
Parameters
ibIndex buffer handle.
+
+
+

+ VertexBuffer cubos::core::gl::RenderDevice::createVertexBuffer(std::size_t size, + const void* data, + Usage usage) pure virtual +

+

Creates a new vertex buffer.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
sizeSize in bytes.
dataInitial data, can be nullptr.
usageUsage which the buffer will have.
ReturnsVertex buffer handle, or nullptr on failure.
+
+
+

+ VertexArray cubos::core::gl::RenderDevice::createVertexArray(const VertexArrayDesc& desc) pure virtual +

+

Creates a new vertex array.

+ + + + + + + + + + + + + + + + +
Parameters
descVertex array description.
ReturnsVertex array handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::setVertexArray(VertexArray va) pure virtual +

+

Sets the current vertex array.

+ + + + + + + + + + +
Parameters
vaVertex array handle.
+
+
+

+ ShaderStage cubos::core::gl::RenderDevice::createShaderStage(Stage stage, + const char* src) pure virtual +

+

Creates a new shader stage from GLSL source code.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
stageShader stage.
srcGLSL source code.
ReturnsShader stage handle, or nullptr on failure.
+ +
+
+

+ ShaderPipeline cubos::core::gl::RenderDevice::createShaderPipeline(ShaderStage vs, + ShaderStage ps) pure virtual +

+

Creates a new shader pipeline from vertex and pixel shaders.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
vsVertex shader stage.
psPixel shader stage.
ReturnsShader pipeline handle, or nullptr on failure.
+
+
+

+ ShaderPipeline cubos::core::gl::RenderDevice::createShaderPipeline(ShaderStage vs, + ShaderStage gs, + ShaderStage ps) pure virtual +

+

Creates a new shader pipeline from vertex, pixel and geometry shaders.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
vsVertex shader stage.
gsGeometry shader stage.
psPixel shader stage.
ReturnsShader pipeline handle, or nullptr on failure.
+
+
+

+ ShaderPipeline cubos::core::gl::RenderDevice::createShaderPipeline(ShaderStage cs) pure virtual +

+

Creates a new shader pipeline from a compute shader. Unsupported on some platforms.

+ + + + + + + + + + + + + + + + +
Parameters
csCompute shader stage.
ReturnsShader pipeline handle, or nullptr on failure.
+ +
+
+

+ void cubos::core::gl::RenderDevice::setShaderPipeline(ShaderPipeline pipeline) pure virtual +

+

Sets the current shader pipeline used for rendering.

+ + + + + + + + + + +
Parameters
pipelineShader pipeline handle.
+
+
+

+ Timer cubos::core::gl::RenderDevice::createTimer() pure virtual +

+

Creates a new timer.

+ + + + + + + +
ReturnsTimer handle, or nullptr on failure.
+
+
+

+ PipelinedTimer cubos::core::gl::RenderDevice::createPipelinedTimer() +

+

Creates a new pipelined timer.

+ + + + + + + +
ReturnsPipelined timer handle, or nullptr on failure.
+
+
+

+ void cubos::core::gl::RenderDevice::clearColor(float r, + float g, + float b, + float a) pure virtual +

+

Clears the color buffer bit on the current framebuffer to a specific color.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
rRed component.
gGreen component.
bBlue component.
aAlpha component.
+
+
+

+ void cubos::core::gl::RenderDevice::clearTargetColor(std::size_t target, + float r, + float g, + float b, + float a) pure virtual +

+

Clears the color buffer of a specific target on the current framebuffer to a specific color.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
targetTarget index.
rRed component.
gGreen component.
bBlue component.
aAlpha component.
+
+
+

+ void cubos::core::gl::RenderDevice::clearTargetColor(std::size_t target, + int r, + int g, + int b, + int a) pure virtual +

+

Clear the color buffer of a specific target on the current framebuffer to a specific color using integer values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
targetTarget index.
rRed component.
gGreen component.
bBlue component.
aAlpha component.
+
+
+

+ void cubos::core::gl::RenderDevice::clearDepth(float depth) pure virtual +

+

Clears the depth buffer bit on the current framebuffer to a specific value.

+ + + + + + + + + + +
Parameters
depthDepth value.
+
+
+

+ void cubos::core::gl::RenderDevice::clearStencil(int stencil) pure virtual +

+

Clears the stencil buffer bit on the current framebuffer to a specific value.

+ + + + + + + + + + +
Parameters
stencilStencil value.
+
+
+

+ void cubos::core::gl::RenderDevice::drawLines(std::size_t offset, + std::size_t count) pure virtual +

+

Draws lines.

+ + + + + + + + + + + + + + +
Parameters
offsetIndex of the first vertex to be drawn.
countNumber of vertices that will be drawn.
+
+
+

+ void cubos::core::gl::RenderDevice::drawTriangles(std::size_t offset, + std::size_t count) pure virtual +

+

Draws tringles.

+ + + + + + + + + + + + + + +
Parameters
offsetIndex of the first vertex to be drawn.
countNumber of vertices that will be drawn.
+
+
+

+ void cubos::core::gl::RenderDevice::drawTrianglesIndexed(std::size_t offset, + std::size_t count) pure virtual +

+

Draws tringles with an index buffer.

+ + + + + + + + + + + + + + +
Parameters
offsetIndex of the first indice to be drawn.
countNumber of indices that will be drawn.
+
+
+

+ void cubos::core::gl::RenderDevice::drawTrianglesInstanced(std::size_t offset, + std::size_t count, + std::size_t instanceCount) pure virtual +

+

Draws tringles multiple times.

+ + + + + + + + + + + + + + + + + + +
Parameters
offsetIndex of the first vertex to be drawn.
countNumber of vertices that will be drawn.
instanceCountNumber of instances drawn.
+
+
+

+ void cubos::core::gl::RenderDevice::drawTrianglesIndexedInstanced(std::size_t offset, + std::size_t count, + std::size_t instanceCount) pure virtual +

+

Draws tringles multiple times with an index buffer.

+ + + + + + + + + + + + + + + + + + +
Parameters
offsetIndex of the first indice to be drawn.
countNumber of indices that will be drawn.
instanceCountNumber of instances drawn.
+
+
+

+ void cubos::core::gl::RenderDevice::dispatchCompute(std::size_t x, + std::size_t y, + std::size_t z) pure virtual +

+

Dispatches a compute pipeline.

+ + + + + + + + + + + + + + + + + + +
Parameters
xX dimension of the work group.
yY dimension of the work group.
zZ dimension of the work group.
+
+
+

+ void cubos::core::gl::RenderDevice::memoryBarrier(MemoryBarriers barriers) pure virtual +

+

Defines a barrier ordering memory transactions. Unsupported on some platforms.

+ + + + + + + + + + +
Parameters
barriersBarriers to apply.
+

This ensure that all memory transactions before the barrier are completed before the barrier is executed.

+
+
+

+ void cubos::core::gl::RenderDevice::setViewport(int x, + int y, + int w, + int h) pure virtual +

+

Sets the current viewport.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
xBottom left viewport corner X coordinate.
yBottom left viewport corner Y coordinate.
wViewport width.
hViewport height.
+
+
+

+ void cubos::core::gl::RenderDevice::setScissor(int x, + int y, + int w, + int h) pure virtual +

+

Sets the current scissor rectangle.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
xBottom left scissor rectangle corner X coordinate.
yBottom left scissor rectangle corner Y coordinate.
wScissor rectangle width.
hScissor rectangle height.
+
+
+

+ int cubos::core::gl::RenderDevice::getProperty(Property prop) pure virtual +

+

Gets a runtime property of the render device.

+ + + + + + + + + + +
Parameters
propProperty name.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1BlendState.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1BlendState.html new file mode 100644 index 0000000000..0da42ce890 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1BlendState.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::BlendState class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::BlendState class + +

+

Abstract blend state.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ConstantBuffer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ConstantBuffer.html new file mode 100644 index 0000000000..234471acf8 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ConstantBuffer.html @@ -0,0 +1,171 @@ + + + + + cubos::core::gl::impl::ConstantBuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::ConstantBuffer class + +

+

Abstract constant buffer.

+ +
+

Public functions

+
+
+ auto map() -> void* pure virtual +
+
Maps the constant buffer to a region in memory. Must be matched with a call to unmap().
+
+ void unmap() pure virtual +
+
Unmaps the constant buffer, updating it with data written to the mapped region.
+
+ void fill(const void* data, + std::size_t size) pure virtual +
+
Fills the buffer with the given data.
+
+
+
+

Function documentation

+
+

+ void* cubos::core::gl::impl::ConstantBuffer::map() pure virtual +

+

Maps the constant buffer to a region in memory. Must be matched with a call to unmap().

+ + + + + + + +
ReturnsPointer to the memory region.
+
+
+

+ void cubos::core::gl::impl::ConstantBuffer::fill(const void* data, + std::size_t size) pure virtual +

+

Fills the buffer with the given data.

+ + + + + + + + + + + + + + +
Parameters
dataPointer to data.
sizeData size in bytes.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMap.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMap.html new file mode 100644 index 0000000000..896c80227f --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMap.html @@ -0,0 +1,183 @@ + + + + + cubos::core::gl::impl::CubeMap class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::CubeMap class + +

+

Abstract cube map.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t y, + std::size_t width, + std::size_t height, + const void* data, + CubeFace face, + std::size_t level = 0) pure virtual +
+
Updates a cube map's face with new data, which must have the same format used when the cube map was created.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this cube map.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::CubeMap::update(std::size_t x, + std::size_t y, + std::size_t width, + std::size_t height, + const void* data, + CubeFace face, + std::size_t level = 0) pure virtual +

+

Updates a cube map's face with new data, which must have the same format used when the cube map was created.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
yDestination Y coordinate.
widthWidth of the section which will be updated.
heightHeight of the section which will be updated.
dataPointer to the new data.
faceFace to update.
levelMip level to update.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMapArray.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMapArray.html new file mode 100644 index 0000000000..78b8180771 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1CubeMapArray.html @@ -0,0 +1,189 @@ + + + + + cubos::core::gl::impl::CubeMapArray class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::CubeMapArray class + +

+

Abstract cube map.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t y, + std::size_t i, + std::size_t width, + std::size_t height, + const void* data, + CubeFace face, + std::size_t level = 0) pure virtual +
+
Updates a cube map's face with new data, which must have the same format used when the cube map was created.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this cube map.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::CubeMapArray::update(std::size_t x, + std::size_t y, + std::size_t i, + std::size_t width, + std::size_t height, + const void* data, + CubeFace face, + std::size_t level = 0) pure virtual +

+

Updates a cube map's face with new data, which must have the same format used when the cube map was created.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
yDestination Y coordinate.
iIndex of the destination texture within the array.
widthWidth of the section which will be updated.
heightHeight of the section which will be updated.
dataPointer to the new data.
faceFace to update.
levelMip level to update.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1DepthStencilState.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1DepthStencilState.html new file mode 100644 index 0000000000..413122e3aa --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1DepthStencilState.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::DepthStencilState class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::DepthStencilState class + +

+

Abstract depth stencil state.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Framebuffer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Framebuffer.html new file mode 100644 index 0000000000..4f34579ee6 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Framebuffer.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::Framebuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Framebuffer class + +

+

Abstract framebuffer.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1IndexBuffer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1IndexBuffer.html new file mode 100644 index 0000000000..1d5b29cb40 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1IndexBuffer.html @@ -0,0 +1,144 @@ + + + + + cubos::core::gl::impl::IndexBuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::IndexBuffer class + +

+

Abstract index buffer.

+ +
+

Public functions

+
+
+ auto map() -> void* pure virtual +
+
Maps the index buffer to a region in memory. Must be matched with a call to unmap().
+
+ void unmap() pure virtual +
+
Unmaps the index buffer, updating it with data written to the mapped region.
+
+
+
+

Function documentation

+
+

+ void* cubos::core::gl::impl::IndexBuffer::map() pure virtual +

+

Maps the index buffer to a region in memory. Must be matched with a call to unmap().

+ + + + + + + +
ReturnsPointer to the memory region.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PipelinedTimer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PipelinedTimer.html new file mode 100644 index 0000000000..992fa32a20 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PipelinedTimer.html @@ -0,0 +1,144 @@ + + + + + cubos::core::gl::impl::PipelinedTimer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::PipelinedTimer class + +

+

Pipelined timer.

+ +
+

Public functions

+
+
+ void begin() +
+
Starts a region to be timed.
+
+ auto end() -> Result +
+
Ends a region.
+
+
+
+

Function documentation

+
+

+ Result cubos::core::gl::impl::PipelinedTimer::end() +

+

Ends a region.

+ + + + + + + +
ReturnsTime spent in region in the latest frame that finished rendering, in nanoseconds (-1 if no frame has finished yet), and how many frames behind the CPU this frame lags.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PixelPackBuffer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PixelPackBuffer.html new file mode 100644 index 0000000000..04e8415800 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1PixelPackBuffer.html @@ -0,0 +1,144 @@ + + + + + cubos::core::gl::impl::PixelPackBuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::PixelPackBuffer class + +

+

Abstract pixel pack buffer.

+ +
+

Public functions

+
+
+ auto map() -> const void* pure virtual +
+
Maps the pixel buffer to a region in memory. Must be matched with a call to unmap().
+
+ void unmap() pure virtual +
+
Unmaps the pixel buffer.
+
+
+
+

Function documentation

+
+

+ const void* cubos::core::gl::impl::PixelPackBuffer::map() pure virtual +

+

Maps the pixel buffer to a region in memory. Must be matched with a call to unmap().

+ + + + + + + +
ReturnsPointer to the memory region.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1RasterState.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1RasterState.html new file mode 100644 index 0000000000..1c511cf680 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1RasterState.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::RasterState class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::RasterState class + +

+

Abstract rasterizer state.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Sampler.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Sampler.html new file mode 100644 index 0000000000..497453b1fa --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Sampler.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::Sampler class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Sampler class + +

+

Abstract sampler.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderBindingPoint.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderBindingPoint.html new file mode 100644 index 0000000000..6d6d992e24 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderBindingPoint.html @@ -0,0 +1,624 @@ + + + + + cubos::core::gl::impl::ShaderBindingPoint class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::ShaderBindingPoint class + +

+

Abstract shader binding point.

+ +
+

Public functions

+
+
+ void bind(gl::Sampler sampler) pure virtual +
+
Binds a sampler to the binding point.
+
+ void bind(gl::Texture1D tex) pure virtual +
+
Binds a 1D texture to the binding point.
+
+ void bind(gl::Texture2D tex) pure virtual +
+
Binds a 2D texture to the binding point.
+
+ void bind(gl::Texture2DArray tex) pure virtual +
+
Binds a 2D texture array to the binding point.
+
+ void bind(gl::Texture3D tex) pure virtual +
+
Binds a 3D texture to the binding point.
+
+ void bind(gl::CubeMap cubeMap) pure virtual +
+
Binds a cube map to the binding point.
+
+ void bind(gl::CubeMapArray cubeMap) pure virtual +
+
Binds a cube map array to the binding point.
+
+ void bind(gl::ConstantBuffer cb) pure virtual +
+
Binds a constant buffer to the binding point.
+
+ void bind(gl::Texture2D tex, + int level, + Access access) pure virtual +
+
Binds a level of a 2D texture to an image unit.
+
+ void setConstant(glm::vec2 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided vec2 value.
+
+ void setConstant(glm::vec3 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided vec3 value.
+
+ void setConstant(glm::vec4 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided vec4 value.
+
+ void setConstant(glm::ivec2 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided integer vec2 value.
+
+ void setConstant(glm::ivec3 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided integer vec3 value.
+
+ void setConstant(glm::ivec4 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided integer vec4 value.
+
+ void setConstant(glm::uvec2 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided unsigned integer vec2 value.
+
+ void setConstant(glm::uvec3 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided unsigned integer vec3 value.
+
+ void setConstant(glm::uvec4 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided unsigned integer vec4 value.
+
+ void setConstant(glm::mat4 val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided mat4 value.
+
+ void setConstant(float val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided float value.
+
+ void setConstant(int val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided int value.
+
+ void setConstant(unsigned int val) pure virtual +
+
Sets the value of the uniform tied to the binding point to the provided unsigned int value.
+
+ auto queryConstantBufferStructure(ConstantBufferStructure* structure) -> bool pure virtual +
+
Gets the constant buffer structure of this binding point.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Sampler sampler) pure virtual +

+

Binds a sampler to the binding point.

+ + + + + + + + + + +
Parameters
samplerSampler to bind.
+

If this binding point doesn't support a sampler, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Texture1D tex) pure virtual +

+

Binds a 1D texture to the binding point.

+ + + + + + + + + + +
Parameters
texTexture to bind.
+

If this binding point doesn't support a 1D texture, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Texture2D tex) pure virtual +

+

Binds a 2D texture to the binding point.

+ + + + + + + + + + +
Parameters
texTexture to bind.
+

If this binding point doesn't support a 2D texture, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Texture2DArray tex) pure virtual +

+

Binds a 2D texture array to the binding point.

+ + + + + + + + + + +
Parameters
texTexture array to bind.
+

If this binding point doesn't support a 2D texture array, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Texture3D tex) pure virtual +

+

Binds a 3D texture to the binding point.

+ + + + + + + + + + +
Parameters
texTexture to bind.
+

If this binding point doesn't support a 3D texture, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::CubeMap cubeMap) pure virtual +

+

Binds a cube map to the binding point.

+ + + + + + + + + + +
Parameters
cubeMapCube map to bind.
+

If this binding point doesn't support a cube map, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::CubeMapArray cubeMap) pure virtual +

+

Binds a cube map array to the binding point.

+ + + + + + + + + + +
Parameters
cubeMapCube map to bind.
+

If this binding point doesn't support a cube map array, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::ConstantBuffer cb) pure virtual +

+

Binds a constant buffer to the binding point.

+ + + + + + + + + + +
Parameters
cbConstant buffer to bind.
+

If this binding point doesn't support a constant buffer, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::bind(gl::Texture2D tex, + int level, + Access access) pure virtual +

+

Binds a level of a 2D texture to an image unit.

+ + + + + + + + + + + + + + + + + + +
Parameters
texTexture to bind.
levelMip level to bind.
accessAccess mode.
+

If this binding point doesn't support an image unit, an error is logged.

+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::vec2 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided vec2 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::vec3 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided vec3 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::vec4 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided vec4 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::ivec2 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided integer vec2 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::ivec3 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided integer vec3 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::ivec4 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided integer vec4 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::uvec2 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided unsigned integer vec2 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::uvec3 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided unsigned integer vec3 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::uvec4 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided unsigned integer vec4 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(glm::mat4 val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided mat4 value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(float val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided float value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(int val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided int value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ void cubos::core::gl::impl::ShaderBindingPoint::setConstant(unsigned int val) pure virtual +

+

Sets the value of the uniform tied to the binding point to the provided unsigned int value.

+ + + + + + + + + + +
Parameters
valValue to set.
+
+
+

+ bool cubos::core::gl::impl::ShaderBindingPoint::queryConstantBufferStructure(ConstantBufferStructure* structure) pure virtual +

+

Gets the constant buffer structure of this binding point.

+ + + + + + + +
ReturnsWhether the query was successful.
+

If this binding point doesn't support a constant buffer, an error is logged.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderPipeline.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderPipeline.html new file mode 100644 index 0000000000..98385ae430 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderPipeline.html @@ -0,0 +1,140 @@ + + + + + cubos::core::gl::impl::ShaderPipeline class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::ShaderPipeline class + +

+

Abstract shader pipeline.

+ +
+

Public functions

+
+
+ auto getBindingPoint(const char* name) -> gl::ShaderBindingPoint pure virtual +
+
Gets a binding point from its name.
+
+
+
+

Function documentation

+
+

+ gl::ShaderBindingPoint cubos::core::gl::impl::ShaderPipeline::getBindingPoint(const char* name) pure virtual +

+

Gets a binding point from its name.

+ + + + + + + +
ReturnsBinding point, or nullptr if no binding point is found.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderStage.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderStage.html new file mode 100644 index 0000000000..048ec466c4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1ShaderStage.html @@ -0,0 +1,140 @@ + + + + + cubos::core::gl::impl::ShaderStage class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::ShaderStage class + +

+

Abstract shader stage.

+ +
+

Public functions

+
+
+ auto getType() -> Stage pure virtual +
+
Gets the shader stage type.
+
+
+
+

Function documentation

+
+

+ Stage cubos::core::gl::impl::ShaderStage::getType() pure virtual +

+

Gets the shader stage type.

+ + + + + + + +
ReturnsShader stage type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture1D.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture1D.html new file mode 100644 index 0000000000..ef8419e8a2 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture1D.html @@ -0,0 +1,165 @@ + + + + + cubos::core::gl::impl::Texture1D class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Texture1D class + +

+

Abstract 1D texture.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t width, + const void* data, + std::size_t level = 0) pure virtual +
+
Updates the texture with new data, which must have the same format used when the texture was created.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this texture.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::Texture1D::update(std::size_t x, + std::size_t width, + const void* data, + std::size_t level = 0) pure virtual +

+

Updates the texture with new data, which must have the same format used when the texture was created.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
widthWidth of the section which will be updated.
dataPointer to the new data.
levelMip level to update.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2D.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2D.html new file mode 100644 index 0000000000..56e348009a --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2D.html @@ -0,0 +1,231 @@ + + + + + cubos::core::gl::impl::Texture2D class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Texture2D class + +

+

Abstract 2D texture.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t y, + std::size_t width, + std::size_t height, + const void* data, + std::size_t level = 0) pure virtual +
+
Updates the texture with new data, which must have the same format used when the texture was created.
+
+ void read(void* outputBuffer, + std::size_t level = 0) pure virtual +
+
Reads texture data into a buffer, which must have the same format used when the texture was created.
+
+ void copyTo(gl::PixelPackBuffer buffer, + std::size_t level = 0) pure virtual +
+
Copies part of the texture data into a pixel pack buffer.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this texture.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::Texture2D::update(std::size_t x, + std::size_t y, + std::size_t width, + std::size_t height, + const void* data, + std::size_t level = 0) pure virtual +

+

Updates the texture with new data, which must have the same format used when the texture was created.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
yDestination Y coordinate.
widthWidth of the section which will be updated.
heightHeight of the section which will be updated.
dataPointer to the new data.
levelMip level to update.
+
+
+

+ void cubos::core::gl::impl::Texture2D::read(void* outputBuffer, + std::size_t level = 0) pure virtual +

+

Reads texture data into a buffer, which must have the same format used when the texture was created.

+ + + + + + + + + + + + + + +
Parameters
outputBufferBuffer to write the data to.
levelMip level to read.
+
+
+

+ void cubos::core::gl::impl::Texture2D::copyTo(gl::PixelPackBuffer buffer, + std::size_t level = 0) pure virtual +

+

Copies part of the texture data into a pixel pack buffer.

+ + + + + + + + + + + + + + +
Parameters
bufferBuffer to copy into.
levelMip level to copy.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2DArray.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2DArray.html new file mode 100644 index 0000000000..d94f44b2e7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture2DArray.html @@ -0,0 +1,183 @@ + + + + + cubos::core::gl::impl::Texture2DArray class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Texture2DArray class + +

+

Abstract 2D texture array.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t y, + std::size_t i, + std::size_t width, + std::size_t height, + const void* data, + std::size_t level = 0) pure virtual +
+
Updates the texture with new data, which must have the same format used when the texture was created.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this texture.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::Texture2DArray::update(std::size_t x, + std::size_t y, + std::size_t i, + std::size_t width, + std::size_t height, + const void* data, + std::size_t level = 0) pure virtual +

+

Updates the texture with new data, which must have the same format used when the texture was created.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
yDestination Y coordinate.
iIndex of the destination texture within the array.
widthWidth of the section which will be updated.
heightHeight of the section which will be updated.
dataPointer to the new data.
levelMip level to update.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture3D.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture3D.html new file mode 100644 index 0000000000..84c4dd5ba5 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Texture3D.html @@ -0,0 +1,189 @@ + + + + + cubos::core::gl::impl::Texture3D class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Texture3D class + +

+

Abstract 3D texture.

+ +
+

Public functions

+
+
+ void update(std::size_t x, + std::size_t y, + std::size_t z, + std::size_t width, + std::size_t height, + std::size_t depth, + const void* data, + std::size_t level = 0) pure virtual +
+
Updates the texture with new data, which must have the same format used when the texture was created.
+
+ void generateMipmaps() pure virtual +
+
Generates mipmaps on this texture.
+
+
+
+

Function documentation

+
+

+ void cubos::core::gl::impl::Texture3D::update(std::size_t x, + std::size_t y, + std::size_t z, + std::size_t width, + std::size_t height, + std::size_t depth, + const void* data, + std::size_t level = 0) pure virtual +

+

Updates the texture with new data, which must have the same format used when the texture was created.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
xDestination X coordinate.
yDestination Y coordinate.
zDestination Z coordinate.
widthWidth of the section which will be updated.
heightHeight of the section which will be updated.
depthDepth of the section which will be updated.
dataPointer to the new data.
levelMip level to update.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Timer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Timer.html new file mode 100644 index 0000000000..3c3597bd58 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1Timer.html @@ -0,0 +1,167 @@ + + + + + cubos::core::gl::impl::Timer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::Timer class + +

+

Abstract timer.

+ +
+

Public functions

+
+
+ void begin() pure virtual +
+
Starts a region to be timed.
+
+ void end() pure virtual +
+
Ends a region.
+
+ auto done() -> bool pure virtual +
+
Checks if result is available.
+
+ auto result() -> int pure virtual +
+
Gets the result, in nanoseconds.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::gl::impl::Timer::done() pure virtual +

+

Checks if result is available.

+ + + + + + + +
ReturnsWhether the result is available.
+
+
+

+ int cubos::core::gl::impl::Timer::result() pure virtual +

+

Gets the result, in nanoseconds.

+ + + + + + + +
ReturnsTime spent in region, in nanoseconds, or -1 if an error occurred while querying the time.
+

Blocks until a result is available.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexArray.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexArray.html new file mode 100644 index 0000000000..60a36fb6f3 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexArray.html @@ -0,0 +1,103 @@ + + + + + cubos::core::gl::impl::VertexArray class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::VertexArray class + +

+

Abstract vertex array.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexBuffer.html b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexBuffer.html new file mode 100644 index 0000000000..094faefbae --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1gl_1_1impl_1_1VertexBuffer.html @@ -0,0 +1,183 @@ + + + + + cubos::core::gl::impl::VertexBuffer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl::VertexBuffer class + +

+

Abstract vertex buffer.

+ +
+

Public functions

+
+
+ auto map() -> void* pure virtual +
+
Maps the vertex buffer to a region in memory. Must be matched with a call to unmap().
+
+ auto map(std::size_t offset, + std::size_t length, + bool synchronized = true) -> void* pure virtual +
+
Maps a region of the vertex buffer to a region in memory. Must be matched with a call to unmap().
+
+ void unmap() pure virtual +
+
Unmaps the vertex buffer, updating it with data written to the mapped region.
+
+
+
+

Function documentation

+
+

+ void* cubos::core::gl::impl::VertexBuffer::map() pure virtual +

+

Maps the vertex buffer to a region in memory. Must be matched with a call to unmap().

+ + + + + + + +
ReturnsPointer to the memory region.
+
+
+

+ void* cubos::core::gl::impl::VertexBuffer::map(std::size_t offset, + std::size_t length, + bool synchronized = true) pure virtual +

+

Maps a region of the vertex buffer to a region in memory. Must be matched with a call to unmap().

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
offsetOffset in bytes.
lengthLength in bytes.
synchronizedWhether pending operations on the buffer should be synchronized prior to returning from this method.
ReturnsPointer to the memory region.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1io_1_1BaseWindow.html b/preview/pr-1379/classcubos_1_1core_1_1io_1_1BaseWindow.html new file mode 100644 index 0000000000..7f684bb9c3 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1io_1_1BaseWindow.html @@ -0,0 +1,561 @@ + + + + + cubos::core::io::BaseWindow class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::io::BaseWindow class + +

+

Interface used to wrap low-level window API implementations.

+ +

Allows polling of input events and creates a gl::RenderDevice for rendering to the window.

+
+

Public functions

+
+
+ void pushEvent(WindowEvent&& event) +
+
Pushes an event to the event queue.
+
+ auto pollEvent() -> std::optional<WindowEvent> +
+
Polls the window for events.
+
+ void swapBuffers() pure virtual +
+
Swaps the window buffers.
+
+ auto renderDevice() const -> gl::RenderDevice& pure virtual +
+
Gets the render device associated with this window.
+
+ auto size() const -> glm::uvec2 pure virtual +
+
Gets the window size, which may differ from the framebuffer size.
+
+ auto framebufferSize() const -> glm::uvec2 pure virtual +
+
Gets the window framebuffer size, which may differ from the window size.
+
+ auto contentScale() const -> float pure virtual +
+
Gets the window content scale, commonly known as "DPI scale".
+
+ auto shouldClose() const -> bool pure virtual +
+
Checks whether the window should close.
+
+ auto time() const -> double pure virtual +
+
Gets the time since the window was created.
+
+ void mouseState(MouseState state) pure virtual +
+
Sets the mouse state when the window is focused.
+
+ auto mouseState() const -> MouseState pure virtual +
+
Gets the mouse state when the window is focused.
+
+ auto getMousePosition() -> glm::ivec2 pure virtual +
+
Gets the position of the mouse cursor.
+
+ void setMousePosition(glm::ivec2 position) pure virtual +
+
Sets the position of the mouse cursor.
+
+ auto createCursor(Cursor::Standard standard) -> std::shared_ptr<Cursor> pure virtual +
+
Creates a new cursor with a standard shape.
+
+ void cursor(std::shared_ptr<Cursor> cursor) pure virtual +
+
Sets the current cursor. Pass nullptr to use the default cursor.
+
+ void clipboard(const std::string& text) pure virtual +
+
Sets the content of the clipboard.
+
+ auto clipboard() const -> const char* pure virtual +
+
Gets the content of the clipboard.
+
+ auto modifiers() const -> Modifiers pure virtual +
+
Gets the last used keyboard modifiers.
+
+ auto pressed(Key key, + Modifiers modifiers = Modifiers::None) const -> bool pure virtual +
+
Checks if a key is currently pressed with (at least) the given modifiers.
+
+ auto pressed(MouseButton button) const -> bool pure virtual +
+
Checks if a mouse button is currently pressed.
+
+ auto gamepadState(int gamepad, + GamepadState& state) const -> bool pure virtual +
+
Gets the state of the specified gamepad.
+
+
+
+

Protected functions

+
+
+ void pollEvents() pure virtual +
+
Asks the implementation to fill the event queue with new events.
+
+
+
+

Function documentation

+
+

+ void cubos::core::io::BaseWindow::pushEvent(WindowEvent&& event) +

+

Pushes an event to the event queue.

+ + + + + + + + + + +
Parameters
eventEvent to push.
+
+
+

+ std::optional<WindowEvent> cubos::core::io::BaseWindow::pollEvent() +

+

Polls the window for events.

+ + + + + + + +
ReturnsNext event, or std::nullopt if there are no more events.
+
+
+

+ gl::RenderDevice& cubos::core::io::BaseWindow::renderDevice() const pure virtual +

+

Gets the render device associated with this window.

+ + + + + + + +
ReturnsRender device associated with this window.
+
+
+

+ glm::uvec2 cubos::core::io::BaseWindow::size() const pure virtual +

+

Gets the window size, which may differ from the framebuffer size.

+ + + + + + + +
ReturnsWindow size, in screen coordinates.
+
+
+

+ glm::uvec2 cubos::core::io::BaseWindow::framebufferSize() const pure virtual +

+

Gets the window framebuffer size, which may differ from the window size.

+ + + + + + + +
ReturnsWindow framebuffer size, in pixels.
+
+
+

+ float cubos::core::io::BaseWindow::contentScale() const pure virtual +

+

Gets the window content scale, commonly known as "DPI scale".

+ + + + + + + +
ReturnsRatio between the current DPI and the platform's default DPI.
+
+
+

+ bool cubos::core::io::BaseWindow::shouldClose() const pure virtual +

+

Checks whether the window should close.

+ + + + + + + +
ReturnsWhether the window should close.
+
+
+

+ double cubos::core::io::BaseWindow::time() const pure virtual +

+

Gets the time since the window was created.

+ + + + + + + +
ReturnsTime since the window was created, in seconds.
+
+
+

+ void cubos::core::io::BaseWindow::mouseState(MouseState state) pure virtual +

+

Sets the mouse state when the window is focused.

+ + + + + + + + + + +
Parameters
stateMouse state.
+
+
+

+ MouseState cubos::core::io::BaseWindow::mouseState() const pure virtual +

+

Gets the mouse state when the window is focused.

+ + + + + + + +
ReturnsMouse state when the window is focused.
+
+
+

+ glm::ivec2 cubos::core::io::BaseWindow::getMousePosition() pure virtual +

+

Gets the position of the mouse cursor.

+ + + + + + + +
ReturnsPosition of the mouse cursor, in screen coordinates.
+
+
+

+ void cubos::core::io::BaseWindow::setMousePosition(glm::ivec2 position) pure virtual +

+

Sets the position of the mouse cursor.

+ + + + + + + + + + +
Parameters
positionNew position of the mouse cursor, in screen coordinates.
+
+
+

+ std::shared_ptr<Cursor> cubos::core::io::BaseWindow::createCursor(Cursor::Standard standard) pure virtual +

+

Creates a new cursor with a standard shape.

+ + + + + + + + + + + + + + + + +
Parameters
standardStandard cursor to use.
ReturnsNew cursor, or nullptr if creation failed.
+
+
+

+ void cubos::core::io::BaseWindow::cursor(std::shared_ptr<Cursor> cursor) pure virtual +

+

Sets the current cursor. Pass nullptr to use the default cursor.

+ + + + + + + + + + +
Parameters
cursorNew cursor.
+
+
+

+ void cubos::core::io::BaseWindow::clipboard(const std::string& text) pure virtual +

+

Sets the content of the clipboard.

+ + + + + + + + + + +
Parameters
textNew clipboard text.
+
+
+

+ const char* cubos::core::io::BaseWindow::clipboard() const pure virtual +

+

Gets the content of the clipboard.

+ + + + + + + +
ReturnsText from the clipboard. Guaranteed to be valid until the next call.
+ +
+
+

+ Modifiers cubos::core::io::BaseWindow::modifiers() const pure virtual +

+

Gets the last used keyboard modifiers.

+ + + + + + + +
ReturnsActive keyboard modifiers.
+
+
+

+ bool cubos::core::io::BaseWindow::pressed(Key key, + Modifiers modifiers = Modifiers::None) const pure virtual +

+

Checks if a key is currently pressed with (at least) the given modifiers.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey to check.
modifiersModifiers to check.
ReturnsWhether the key and modifiers (or a superset of) are currently pressed.
+
+
+

+ bool cubos::core::io::BaseWindow::pressed(MouseButton button) const pure virtual +

+

Checks if a mouse button is currently pressed.

+ + + + + + + + + + + + + + + + +
Parameters
buttonMouse button to check.
ReturnsWhether the mouse button is currently pressed.
+
+
+

+ bool cubos::core::io::BaseWindow::gamepadState(int gamepad, + GamepadState& state) const pure virtual +

+

Gets the state of the specified gamepad.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
gamepadGamepad to get the state of.
stateState to fill with the gamepad state.
ReturnsWhether the gamepad was found.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1io_1_1Cursor.html b/preview/pr-1379/classcubos_1_1core_1_1io_1_1Cursor.html new file mode 100644 index 0000000000..8091c334dd --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1io_1_1Cursor.html @@ -0,0 +1,206 @@ + + + + + cubos::core::io::Cursor class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::io::Cursor class + +

+

Handle for a custom mouse cursor.

+ +
+

Public types

+
+
+ enum class Standard { Arrow, + IBeam, + Cross, + Hand, + EWResize, + NSResize, + NWSEResize, + NESWResize, + AllResize, + NotAllowed } +
+
Identifiers for the different standard cursors.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::core::io::Cursor::Standard +

+

Identifiers for the different standard cursors.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Arrow +

Standard arrow cursor.

+
IBeam +

Standard I-beam cursor.

+
Cross +

Standard crosshair cursor.

+
Hand +

Standard hand cursor.

+
EWResize +

Standard horizontal resize cursor.

+
NSResize +

Standard vertical resize cursor.

+
NWSEResize +

Standard diagonal resize cursor (top-left to bottom-right).

+
NESWResize +

Standard diagonal resize cursor (top-right to bottom-left).

+
AllResize +

Standard all directions resize cursor.

+
NotAllowed +

Standard not allowed cursor.

+
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyValue.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyValue.html new file mode 100644 index 0000000000..bad49e0505 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyValue.html @@ -0,0 +1,408 @@ + + + + + cubos::core::memory::AnyValue class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory::AnyValue class final + +

+

Stores a blob of a given reflected type.

+ +
+

Public static functions

+
+
+
template<typename T, typename... TArgs>
+ static auto customConstruct(TArgs && ... args) -> AnyValue noexcept +
+
Constructs a value of the given type with the given arguments.
+
+ static auto defaultConstruct(const reflection::Type& type) -> AnyValue noexcept +
+
Default constructs a value with the given type.
+
+ static auto copyConstruct(const reflection::Type& type, + const void* value) -> AnyValue noexcept +
+
Copy constructs a value with the given type.
+
+ static auto moveConstruct(const reflection::Type& type, + void* value) -> AnyValue noexcept +
+
Move constructs a value with the given type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ AnyValue() +
+
Constructs an empty AnyValue.
+
+ AnyValue(AnyValue&& other) noexcept +
+
Move constructs.
+
+ AnyValue(const AnyValue& other) noexcept +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ auto operator=(AnyValue&& other) -> AnyValue& noexcept +
+
Move assignment.
+
+ auto type() const -> const reflection::Type& +
+
Get the type of the elements stored in the vector.
+
+ auto get() -> void* +
+
Gets a pointer to the underlying value.
+
+ auto get() const -> const void* +
+
Gets a pointer to the underlying value.
+
+ auto valid() const -> bool +
+
Checks whether value is valid or not (holds a value).
+
+
+
+

Function documentation

+
+

+
+ template<typename T, typename... TArgs> +
+ static AnyValue cubos::core::memory::AnyValue::customConstruct(TArgs && ... args) noexcept +

+

Constructs a value of the given type with the given arguments.

+ + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
TArgsArgument types.
Parameters
argsArguments.
+
+
+

+ static AnyValue cubos::core::memory::AnyValue::defaultConstruct(const reflection::Type& type) noexcept +

+

Default constructs a value with the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeValue type.
ReturnsValue.
+ +
+
+

+ static AnyValue cubos::core::memory::AnyValue::copyConstruct(const reflection::Type& type, + const void* value) noexcept +

+

Copy constructs a value with the given type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeValue type.
valueValue to copy.
ReturnsValue.
+ +
+
+

+ static AnyValue cubos::core::memory::AnyValue::moveConstruct(const reflection::Type& type, + void* value) noexcept +

+

Move constructs a value with the given type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeValue type.
valueValue to move.
ReturnsValue.
+ +
+
+

+ cubos::core::memory::AnyValue::AnyValue(AnyValue&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherValue.
+
+
+

+ cubos::core::memory::AnyValue::AnyValue(const AnyValue& other) noexcept +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherValue.
+
+
+

+ AnyValue& cubos::core::memory::AnyValue::operator=(AnyValue&& other) noexcept +

+

Move assignment.

+ + + + + + + + + + +
Parameters
otherValue.
+
+
+

+ const reflection::Type& cubos::core::memory::AnyValue::type() const +

+

Get the type of the elements stored in the vector.

+ + + + + + + +
ReturnsElement type.
+ +
+
+

+ void* cubos::core::memory::AnyValue::get() +

+

Gets a pointer to the underlying value.

+ + + + + + + +
ReturnsValue.
+
+
+

+ const void* cubos::core::memory::AnyValue::get() const +

+

Gets a pointer to the underlying value.

+ + + + + + + +
ReturnsValue.
+
+
+

+ bool cubos::core::memory::AnyValue::valid() const +

+

Checks whether value is valid or not (holds a value).

+ + + + + + + +
ReturnsTrue is valid.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyVector.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyVector.html new file mode 100644 index 0000000000..2b096e01f7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1AnyVector.html @@ -0,0 +1,673 @@ + + + + + cubos::core::memory::AnyVector class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory::AnyVector class final + +

+

Stores a dynamically sized array of blobs of a given reflected type.

+ +
+

Constructors, destructors, conversion operators

+
+
+ AnyVector(const reflection::Type& elementType) +
+
Constructs with the given element type.
+
+ AnyVector(const AnyVector& other) +
+
Copy constructs.
+
+ AnyVector(AnyVector&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto elementType() const -> const reflection::Type& +
+
Get the type of the elements stored in the vector.
+
+ void reserve(std::size_t capacity) +
+
Reserves space for at least capacity elements.
+
+ void insertUninit(std::size_t index) +
+
Inserts an uninitialized element at the given index.
+
+ void insertDefault(std::size_t index) +
+
Inserts a default-constructed element at the given index.
+
+ void insertCopy(std::size_t index, + const void* value) +
+
Inserts a copy-constructed element at the given index.
+
+ void insertMove(std::size_t index, + void* value) +
+
Inserts a move-constructed element at the given index.
+
+ void pushUninit() +
+
Pushes an uninitialized element to the back of the vector.
+
+ void pushDefault() +
+
Pushes a new default-constructed element to the back of the vector.
+
+ void pushCopy(const void* value) +
+
Pushes a new copy-constructed element to the back of the vector.
+
+ void pushMove(void* value) +
+
Pushes a new move-constructed element to the back of the vector.
+
+ void setDefault(std::size_t index) +
+
Overwrites the element at the given index with a new default-constructed element.
+
+ void setCopy(std::size_t index, + const void* value) +
+
Overwrites the element at the given index with a new copy-constructed element.
+
+ void setMove(std::size_t index, + void* value) +
+
Overwrites the element at the given index with a new move-constructed element.
+
+ void pop() +
+
Removes the last element from the vector.
+
+ void erase(std::size_t index) +
+
Removes the element at the given index from the vector.
+
+ void swapErase(std::size_t index) +
+
Removes the element at the given index from the vector, moving the last element to its place if it isn't the last element.
+
+ void swapMove(std::size_t index, + void* destination) +
+
Moves the element at the given index from the vector into the given address, moving the last element to its place if it isn't the last element.
+
+ void clear() +
+
Removes all elements from the vector.
+
+ auto at(std::size_t index) -> void* +
+
Get the element at the given index.
+
+ auto at(std::size_t index) const -> const void* +
+
Get the element at the given index.
+
+ auto size() const -> std::size_t +
+
Get the number of elements in the vector.
+
+ auto capacity() const -> std::size_t +
+
Get the number of elements the vector can hold without reallocating.
+
+ auto empty() const -> bool +
+
Checks if the vector is empty.
+
+
+
+

Function documentation

+
+

+ cubos::core::memory::AnyVector::AnyVector(const reflection::Type& elementType) +

+

Constructs with the given element type.

+ + + + + + + + + + +
Parameters
elementTypeElement type.
+ +
+
+

+ cubos::core::memory::AnyVector::AnyVector(const AnyVector& other) +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherVector.
+ +
+
+

+ cubos::core::memory::AnyVector::AnyVector(AnyVector&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherVector.
+
+
+

+ const reflection::Type& cubos::core::memory::AnyVector::elementType() const +

+

Get the type of the elements stored in the vector.

+ + + + + + + +
ReturnsElement type.
+
+
+

+ void cubos::core::memory::AnyVector::reserve(std::size_t capacity) +

+

Reserves space for at least capacity elements.

+ + + + + + + + + + +
Parameters
capacityMinimum capacity.
+ +
+
+

+ void cubos::core::memory::AnyVector::insertUninit(std::size_t index) +

+

Inserts an uninitialized element at the given index.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::memory::AnyVector::insertDefault(std::size_t index) +

+

Inserts a default-constructed element at the given index.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::memory::AnyVector::insertCopy(std::size_t index, + const void* value) +

+

Inserts a copy-constructed element at the given index.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueElement to copy.
+ +
+
+

+ void cubos::core::memory::AnyVector::insertMove(std::size_t index, + void* value) +

+

Inserts a move-constructed element at the given index.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueElement to move.
+ +
+
+

+ void cubos::core::memory::AnyVector::pushUninit() +

+

Pushes an uninitialized element to the back of the vector.

+ +
+
+

+ void cubos::core::memory::AnyVector::pushDefault() +

+

Pushes a new default-constructed element to the back of the vector.

+ +
+
+

+ void cubos::core::memory::AnyVector::pushCopy(const void* value) +

+

Pushes a new copy-constructed element to the back of the vector.

+ + + + + + + + + + +
Parameters
valueElement to copy.
+ +
+
+

+ void cubos::core::memory::AnyVector::pushMove(void* value) +

+

Pushes a new move-constructed element to the back of the vector.

+ + + + + + + + + + +
Parameters
valueElement to move.
+
+
+

+ void cubos::core::memory::AnyVector::setDefault(std::size_t index) +

+

Overwrites the element at the given index with a new default-constructed element.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::memory::AnyVector::setCopy(std::size_t index, + const void* value) +

+

Overwrites the element at the given index with a new copy-constructed element.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueElement to copy.
+ +
+
+

+ void cubos::core::memory::AnyVector::setMove(std::size_t index, + void* value) +

+

Overwrites the element at the given index with a new move-constructed element.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueElement to move.
+ +
+
+

+ void cubos::core::memory::AnyVector::pop() +

+

Removes the last element from the vector.

+ +
+
+

+ void cubos::core::memory::AnyVector::erase(std::size_t index) +

+

Removes the element at the given index from the vector.

+ + + + + + + + + + +
Parameters
indexElement index.
+

Prefer using swapErase() if the order of elements doesn't matter, as it is more efficient.

+
+
+

+ void cubos::core::memory::AnyVector::swapErase(std::size_t index) +

+

Removes the element at the given index from the vector, moving the last element to its place if it isn't the last element.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::memory::AnyVector::swapMove(std::size_t index, + void* destination) +

+

Moves the element at the given index from the vector into the given address, moving the last element to its place if it isn't the last element.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
destinationAddress to move the element to.
+ +
+
+

+ void* cubos::core::memory::AnyVector::at(std::size_t index) +

+

Get the element at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the element to get.
ReturnsPointer to the element.
+ +
+
+

+ const void* cubos::core::memory::AnyVector::at(std::size_t index) const +

+

Get the element at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the element to get.
ReturnsPointer to the element.
+ +
+
+

+ std::size_t cubos::core::memory::AnyVector::size() const +

+

Get the number of elements in the vector.

+ + + + + + + +
ReturnsElement count.
+
+
+

+ std::size_t cubos::core::memory::AnyVector::capacity() const +

+

Get the number of elements the vector can hold without reallocating.

+ + + + + + + +
ReturnsElement capacity.
+
+
+

+ bool cubos::core::memory::AnyVector::empty() const +

+

Checks if the vector is empty.

+ + + + + + + +
ReturnsWhether the vector is empty.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1BufferStream.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1BufferStream.html new file mode 100644 index 0000000000..74f7a4ee0c --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1BufferStream.html @@ -0,0 +1,446 @@ + + + + + cubos::core::memory::BufferStream class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory::BufferStream class + +

+

Stream implementation which writes to/reads from a buffer.

+ +
+

Base classes

+
+
+ class Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ BufferStream(void* buffer, + std::size_t size, + bool readOnly = false) +
+
Constructs using an existing buffer.
+
+ BufferStream(const void* buffer, + std::size_t size) +
+
Constructs using a read-only buffer.
+
+ BufferStream(std::size_t size = 16) +
+
Constructs using a new buffer, managed internally and which grows as needed.
+
+ BufferStream(const BufferStream& other) +
+
Constructs a copy of another buffer stream. If the given buffer stream owns its buffer, the copy will also create its own buffer. Otherwise, it will share the buffer with the original.
+
+ BufferStream(BufferStream&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto getBuffer() const -> const void* +
+
Gets the buffer of this stream.
+
+ auto string() const -> std::string +
+
Creates a string from the buffer of this stream.
+
+ auto read(void* data, + std::size_t size) -> std::size_t override +
+
Reads data from the stream.
+
+ auto write(const void* data, + std::size_t size) -> std::size_t override +
+
Writes data to the stream.
+
+ auto tell() const -> std::size_t override +
+
Gets the current position in the stream.
+
+ void seek(ptrdiff_t offset, + SeekOrigin origin) override +
+
Seeks to a position in the stream.
+
+ auto eof() const -> bool override +
+
Checks if the stream still has content to read.
+
+ auto peek() -> char override +
+
Peeks one byte from the stream.
+
+
+
+

Function documentation

+
+

+ cubos::core::memory::BufferStream::BufferStream(void* buffer, + std::size_t size, + bool readOnly = false) +

+

Constructs using an existing buffer.

+ + + + + + + + + + + + + + + + + + +
Parameters
bufferBuffer to read/write from.
sizeSize of the buffer.
readOnlyWhether the buffer is read-only.
+
+
+

+ cubos::core::memory::BufferStream::BufferStream(const void* buffer, + std::size_t size) +

+

Constructs using a read-only buffer.

+ + + + + + + + + + + + + + +
Parameters
bufferBuffer to read/write from.
sizeSize of the buffer.
+
+
+

+ cubos::core::memory::BufferStream::BufferStream(std::size_t size = 16) +

+

Constructs using a new buffer, managed internally and which grows as needed.

+ + + + + + + + + + +
Parameters
sizeInitial size of the buffer.
+
+
+

+ cubos::core::memory::BufferStream::BufferStream(const BufferStream& other) +

+

Constructs a copy of another buffer stream. If the given buffer stream owns its buffer, the copy will also create its own buffer. Otherwise, it will share the buffer with the original.

+ + + + + + + + + + +
Parameters
otherBuffer stream to copy.
+
+
+

+ cubos::core::memory::BufferStream::BufferStream(BufferStream&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherBuffer stream to move.
+
+
+

+ const void* cubos::core::memory::BufferStream::getBuffer() const +

+

Gets the buffer of this stream.

+ + + + + + + +
ReturnsBuffer.
+
+
+

+ std::string cubos::core::memory::BufferStream::string() const +

+

Creates a string from the buffer of this stream.

+ + + + + + + +
ReturnsString.
+
+
+

+ std::size_t cubos::core::memory::BufferStream::read(void* data, + std::size_t size) override +

+

Reads data from the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsNumber of bytes read.
+ +
+
+

+ std::size_t cubos::core::memory::BufferStream::write(const void* data, + std::size_t size) override +

+

Writes data to the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsNumber of bytes written.
+ +
+
+

+ std::size_t cubos::core::memory::BufferStream::tell() const override +

+

Gets the current position in the stream.

+ + + + + + + +
ReturnsCurrent position in the stream, or SIZE_MAX if the position is unknown.
+
+
+

+ void cubos::core::memory::BufferStream::seek(ptrdiff_t offset, + SeekOrigin origin) override +

+

Seeks to a position in the stream.

+ + + + + + + + + + + + + + +
Parameters
offsetOffset to seek to.
originOrigin of the offset.
+
+
+

+ bool cubos::core::memory::BufferStream::eof() const override +

+

Checks if the stream still has content to read.

+ + + + + + + +
ReturnsWhether the stream has reached the end.
+
+
+

+ char cubos::core::memory::BufferStream::peek() override +

+

Peeks one byte from the stream.

+ + + + + + + +
ReturnsPeeked byte.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Function.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Function.html new file mode 100644 index 0000000000..a71011f25a --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Function.html @@ -0,0 +1,105 @@ + + + + + cubos::core::memory::Function class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename>
+ cubos::core::memory::Function class final +

+

Generic function pointer which can also store capturing lambda functions.

+

Should be used with care as this class needs to do heap allocations to store captured data.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Opt.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Opt.html new file mode 100644 index 0000000000..b08bf9f886 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Opt.html @@ -0,0 +1,457 @@ + + + + + cubos::core::memory::Opt class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::memory::Opt class +

+

Wrapper for reference types to indicate that the given argument type is optional.

+ + + + + + + + + + +
Template parameters
TArgument type.
+ +
+

Constructors, destructors, conversion operators

+
+
+ Opt() +
+
Constructs without a value.
+
+ Opt(T value) +
+
Constructs with a value.
+
+ Opt(const Opt<T>& other) +
+
Copy constructor.
+
+ Opt(Opt<T>&& other) noexcept +
+
Move constructor.
+
+ operator bool() const +
+
Checks if the optional contains a value.
+
+
template<typename U = T>
+ requires(requires(const U&a, const U&b) { a==b;}) bool operator +
+
Compares with another optional value.
+
+
+
+

Public functions

+
+
+ auto operator=(const Opt<T>& other) -> Opt<T>& +
+
Copy assignment.
+
+ auto operator=(Opt<T>&& other) -> Opt<T>& noexcept +
+
Move assignment.
+
+ void replace(T value) +
+
Moves the given value into the optional, destroying any previously stored value.
+
+ void reset() +
+
Destroys the value, if any.
+
+ auto contains() const -> bool +
+
Checks if the optional contains a value.
+
+ auto value() -> T& +
+
Gets the underlying value.
+
+ auto value() const -> const T& +
+
Gets the underlying value.
+
+ auto operator*() -> T& +
+
Gets the underlying value.
+
+ auto operator->() -> T* +
+
Gets the underlying value.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::memory::Opt<T>::Opt(T value) +

+

Constructs with a value.

+ + + + + + + + + + +
Parameters
valueValue.
+
+
+

+
+ template<typename T> +
+ cubos::core::memory::Opt<T>::Opt(const Opt<T>& other) +

+

Copy constructor.

+ + + + + + + + + + +
Parameters
otherOther optional.
+
+
+

+
+ template<typename T> +
+ cubos::core::memory::Opt<T>::Opt(Opt<T>&& other) noexcept +

+

Move constructor.

+ + + + + + + + + + +
Parameters
otherOther optional.
+
+
+

+
+ template<typename T> +
+ cubos::core::memory::Opt<T>::operator bool() const +

+

Checks if the optional contains a value.

+ + + + + + + +
ReturnsWhether the optional contains a value.
+
+
+

+
+ template<typename T> + template<typename U = T> +
+ cubos::core::memory::Opt<T>::requires(requires(const U&a, const U&b) { a==b;}) bool operator +

+

Compares with another optional value.

+ + + + + + + +
ReturnsWhether they're equal.
+
+
+

+
+ template<typename T> +
+ Opt<T>& cubos::core::memory::Opt<T>::operator=(const Opt<T>& other) +

+

Copy assignment.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther optional.
ReturnsReference to this.
+
+
+

+
+ template<typename T> +
+ Opt<T>& cubos::core::memory::Opt<T>::operator=(Opt<T>&& other) noexcept +

+

Move assignment.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther optional.
ReturnsReference to this.
+
+
+

+
+ template<typename T> +
+ void cubos::core::memory::Opt<T>::replace(T value) +

+

Moves the given value into the optional, destroying any previously stored value.

+ + + + + + + + + + +
Parameters
valueValue.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::memory::Opt<T>::contains() const +

+

Checks if the optional contains a value.

+ + + + + + + +
ReturnsWhether the optional contains a value.
+
+
+

+
+ template<typename T> +
+ T& cubos::core::memory::Opt<T>::value() +

+

Gets the underlying value.

+ + + + + + + +
ReturnsReference to value.
+

Aborts if there's no value.

+
+
+

+
+ template<typename T> +
+ const T& cubos::core::memory::Opt<T>::value() const +

+

Gets the underlying value.

+ + + + + + + +
ReturnsReference to value.
+

Aborts if there's no value.

+
+
+

+
+ template<typename T> +
+ T& cubos::core::memory::Opt<T>::operator*() +

+

Gets the underlying value.

+ + + + + + + +
ReturnsReference to value.
+

Aborts if there's no value.

+
+
+

+
+ template<typename T> +
+ T* cubos::core::memory::Opt<T>::operator->() +

+

Gets the underlying value.

+ + + + + + + +
ReturnsReference to value.
+

Aborts if there's no value.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1ReadGuard.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1ReadGuard.html new file mode 100644 index 0000000000..0b95d7bd16 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1ReadGuard.html @@ -0,0 +1,263 @@ + + + + + cubos::core::memory::ReadGuard class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T, typename Lock>
+ cubos::core::memory::ReadGuard class +

+

Provides safe read-only access to an object using a lock.

+ + + + + + + + + + + + + + +
Template parameters
TGuarded object type.
LockHeld lock type.
+ +

This class was created because there are multiple parts of the code that need to provide access to objects in a thread-safe manner.

Usage example

using AssetMetaRead = core::memory::ReadGuard<AssetMeta, std::shared_lock<std::shared_mutex>>;
+
+

Constructors, destructors, conversion operators

+
+
+ ReadGuard(const T& object, + Lock&& lock) +
+
Constructor.
+
+ ReadGuard(ReadGuard&& other) noexcept +
+
Move constructor.
+
+
+
+

Public functions

+
+
+ auto get() const -> const T& +
+
Gets a reference to the underlying object.
+
+ auto operator*() const -> const T& +
+
Gets a reference to the underlying object.
+
+ auto operator->() const -> const T* +
+
Gets a pointer to the underlying object.
+
+
+
+

Function documentation

+
+

+
+ template<typename T, typename Lock> +
+ cubos::core::memory::ReadGuard<T, Lock>::ReadGuard(const T& object, + Lock&& lock) +

+

Constructor.

+ + + + + + + + + + + + + + +
Parameters
objectObject to guard.
lockLock to hold.
+
+
+

+
+ template<typename T, typename Lock> +
+ cubos::core::memory::ReadGuard<T, Lock>::ReadGuard(ReadGuard&& other) noexcept +

+

Move constructor.

+ + + + + + + + + + +
Parameters
otherGuard to move from.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T& cubos::core::memory::ReadGuard<T, Lock>::get() const +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T& cubos::core::memory::ReadGuard<T, Lock>::operator*() const +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T* cubos::core::memory::ReadGuard<T, Lock>::operator->() const +

+

Gets a pointer to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1StandardStream.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1StandardStream.html new file mode 100644 index 0000000000..fb51ee2dd5 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1StandardStream.html @@ -0,0 +1,335 @@ + + + + + cubos::core::memory::StandardStream class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory::StandardStream class + +

+

Stream implementation which wraps a libc file pointer.

+ +
+

Base classes

+
+
+ class Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ StandardStream(FILE* file, + bool close = false) +
+
Constructs.
+
+ StandardStream(StandardStream&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto read(void* data, + std::size_t size) -> std::size_t override +
+
Reads data from the stream.
+
+ auto write(const void* data, + std::size_t size) -> std::size_t override +
+
Writes data to the stream.
+
+ auto tell() const -> std::size_t override +
+
Gets the current position in the stream.
+
+ void seek(ptrdiff_t offset, + SeekOrigin origin) override +
+
Seeks to a position in the stream.
+
+ auto eof() const -> bool override +
+
Checks if the stream still has content to read.
+
+ auto peek() -> char override +
+
Peeks one byte from the stream.
+
+
+
+

Function documentation

+
+

+ cubos::core::memory::StandardStream::StandardStream(FILE* file, + bool close = false) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
fileFile to read/write from.
closeShould the file be closed when this stream is destructed?
+
+
+

+ cubos::core::memory::StandardStream::StandardStream(StandardStream&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherMoved stream.
+
+
+

+ std::size_t cubos::core::memory::StandardStream::read(void* data, + std::size_t size) override +

+

Reads data from the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsNumber of bytes read.
+ +
+
+

+ std::size_t cubos::core::memory::StandardStream::write(const void* data, + std::size_t size) override +

+

Writes data to the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsNumber of bytes written.
+ +
+
+

+ std::size_t cubos::core::memory::StandardStream::tell() const override +

+

Gets the current position in the stream.

+ + + + + + + +
ReturnsCurrent position in the stream, or SIZE_MAX if the position is unknown.
+
+
+

+ void cubos::core::memory::StandardStream::seek(ptrdiff_t offset, + SeekOrigin origin) override +

+

Seeks to a position in the stream.

+ + + + + + + + + + + + + + +
Parameters
offsetOffset to seek to.
originOrigin of the offset.
+
+
+

+ bool cubos::core::memory::StandardStream::eof() const override +

+

Checks if the stream still has content to read.

+ + + + + + + +
ReturnsWhether the stream has reached the end.
+
+
+

+ char cubos::core::memory::StandardStream::peek() override +

+

Peeks one byte from the stream.

+ + + + + + + +
ReturnsPeeked byte.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Stream.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Stream.html new file mode 100644 index 0000000000..5435c7f9ec --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1Stream.html @@ -0,0 +1,1082 @@ + + + + + cubos::core::memory::Stream class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory::Stream class + +

+

Interface class for memory streams. Abstracts away sources or destinations of data.

+ +

Motivation

Why do we have our own streams? Well, the standard library streams are hard to use and extend, and very template heavy. Using our own streams allows us to abstract away more easily where the data is coming from, or going to, allowing us, for example, to embed files into the executable and not have to worry about the code that reads them.

+
+

Derived classes

+
+
+
template<typename T>
+ class cubos::core::data::FileStream final +
+
Wrapper around an implementation-specific file stream which keeps the file alive and does some sanity checks.
+
+ class BufferStream +
+
Stream implementation which writes to/reads from a buffer.
+
+ class StandardStream +
+
Stream implementation which wraps a libc file pointer.
+
+ class cubos::core::net::TcpStream +
+
Stream implementation which writes to/reads from a TCP connection.
+
+
+
+

Public static variables

+
+
+ static Stream& stdIn +
+
Stream wrapper for stdin.
+
+ static Stream& stdOut +
+
Stream wrapper for stdout.
+
+ static Stream& stdErr +
+
Stream wrapper for stderr.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Stream() defaulted +
+
Constructs.
+
+ Stream(Stream&&) defaulted +
+
Move constructs.
+
+
template<typename T>
+ requires(::std::is_integral_v<T> && ::std::is_signed_v<T>) void print(T value +
+
Prints a signed integer to the stream.
+
+
template<typename T>
+ requires(::std::is_integral_v<T> && !::std::is_signed_v<T>) inline void print(T value +
+
Prints a signed integer to the stream.
+
+
+
+

Public functions

+
+
+ auto read(void* data, + std::size_t size) -> std::size_t pure virtual +
+
Reads data from the stream.
+
+ auto write(const void* data, + std::size_t size) -> std::size_t pure virtual +
+
Writes data to the stream.
+
+ auto readExact(void* data, + std::size_t size) -> bool +
+
Reads data from the stream with the exact specified size.
+
+ auto writeExact(const void* data, + std::size_t size) -> bool +
+
Writes data to the stream with the exact specified size.
+
+ auto tell() const -> std::size_t pure virtual +
+
Gets the current position in the stream.
+
+ void seek(ptrdiff_t offset, + SeekOrigin origin) pure virtual +
+
Seeks to a position in the stream.
+
+ auto eof() const -> bool pure virtual +
+
Checks if the stream still has content to read.
+
+ auto peek() -> char pure virtual +
+
Peeks one byte from the stream.
+
+ auto get() -> char +
+
Gets one byte from the stream.
+
+ void put(char c) +
+
Puts one byte into the stream.
+
+ void print(int64_t value, + std::size_t base = 10) +
+
Prints a 64 bit signed integer to the stream.
+
+ void print(uint64_t value, + std::size_t base = 10) +
+
Prints a 64 bit unsigned integer to the stream.
+
+ void print(float value, + std::size_t decimalPlaces = 4) +
+
Prints a float to the stream.
+
+ void print(double value, + std::size_t decimalPlaces = 4) +
+
Prints a double to the stream.
+
+ void print(const char* str) +
+
Prints a string to the stream.
+
+ void print(const char* str, + std::size_t size) +
+
Prints a string to the stream.
+
+ void print(const ::std::string& str) +
+
Prints a string to the stream.
+
+
template<typename T, typename... TArgs>
+ void printf(const char* fmt, + T arg, + TArgs... args) +
+
Prints a formatted string the stream.
+
+ void printf(const char* fmt) +
+
Prints a string to the stream.
+
+ void parse(int8_t& value, + std::size_t base = 10) +
+
Parses a 8 bit signed integer from the stream.
+
+ void parse(int16_t& value, + std::size_t base = 10) +
+
Parses a 16 bit signed integer from the stream.
+
+ void parse(int32_t& value, + std::size_t base = 10) +
+
Parses a 32 bit signed integer from the stream.
+
+ void parse(int64_t& value, + std::size_t base = 10) +
+
Parses a 64 bit signed integer from the stream.
+
+ void parse(uint8_t& value, + std::size_t base = 10) +
+
Parses a 8 bit unsigned integer from the stream.
+
+ void parse(uint16_t& value, + std::size_t base = 10) +
+
Parses a 16 bit unsigned integer from the stream.
+
+ void parse(uint32_t& value, + std::size_t base = 10) +
+
Parses a 32 bit unsigned integer from the stream.
+
+ void parse(uint64_t& value, + std::size_t base = 10) +
+
Parses a 64 bit unsigned integer from the stream.
+
+ void parse(float& value) +
+
Parses a float from the stream.
+
+ void parse(double& value) +
+
Parses a double from the stream.
+
+ void readUntil(std::string& str, + const char* terminator) +
+
Reads a string from the stream until the terminator (or \0) is found.
+
+ auto readUntil(char* buffer, + std::size_t size, + const char* terminator) -> std::size_t +
+
Reads a string from the stream until the terminator (or \0) is found.
+
+ void ignore(std::size_t size) +
+
Ignores a number of bytes from the stream.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::memory::Stream::requires(::std::is_integral_v<T> && ::std::is_signed_v<T>) void print(T value +

+

Prints a signed integer to the stream.

+ + + + + + + + + + +
Template parameters
TType of the integer.
+
+
+

+
+ template<typename T> +
+ cubos::core::memory::Stream::requires(::std::is_integral_v<T> && !::std::is_signed_v<T>) inline void print(T value +

+

Prints a signed integer to the stream.

+ + + + + + + + + + +
Template parameters
TInteger type.
+
+
+

+ std::size_t cubos::core::memory::Stream::read(void* data, + std::size_t size) pure virtual +

+

Reads data from the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsNumber of bytes read.
+ +
+
+

+ std::size_t cubos::core::memory::Stream::write(const void* data, + std::size_t size) pure virtual +

+

Writes data to the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsNumber of bytes written.
+ +
+
+

+ bool cubos::core::memory::Stream::readExact(void* data, + std::size_t size) +

+

Reads data from the stream with the exact specified size.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsWhether reading was sucessful.
+ +
+
+

+ bool cubos::core::memory::Stream::writeExact(const void* data, + std::size_t size) +

+

Writes data to the stream with the exact specified size.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsWhether writing was sucessful.
+ +
+
+

+ std::size_t cubos::core::memory::Stream::tell() const pure virtual +

+

Gets the current position in the stream.

+ + + + + + + +
ReturnsCurrent position in the stream, or SIZE_MAX if the position is unknown.
+
+
+

+ void cubos::core::memory::Stream::seek(ptrdiff_t offset, + SeekOrigin origin) pure virtual +

+

Seeks to a position in the stream.

+ + + + + + + + + + + + + + +
Parameters
offsetOffset to seek to.
originOrigin of the offset.
+
+
+

+ bool cubos::core::memory::Stream::eof() const pure virtual +

+

Checks if the stream still has content to read.

+ + + + + + + +
ReturnsWhether the stream has reached the end.
+
+
+

+ char cubos::core::memory::Stream::peek() pure virtual +

+

Peeks one byte from the stream.

+ + + + + + + +
ReturnsPeeked byte.
+
+
+

+ char cubos::core::memory::Stream::get() +

+

Gets one byte from the stream.

+ + + + + + + +
ReturnsRead byte.
+
+
+

+ void cubos::core::memory::Stream::put(char c) +

+

Puts one byte into the stream.

+ + + + + + + + + + +
Parameters
cByte to put.
+
+
+

+ void cubos::core::memory::Stream::print(int64_t value, + std::size_t base = 10) +

+

Prints a 64 bit signed integer to the stream.

+ + + + + + + + + + + + + + +
Parameters
valueValue to print.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::print(uint64_t value, + std::size_t base = 10) +

+

Prints a 64 bit unsigned integer to the stream.

+ + + + + + + + + + + + + + +
Parameters
valueValue to print.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::print(float value, + std::size_t decimalPlaces = 4) +

+

Prints a float to the stream.

+ + + + + + + + + + + + + + +
Parameters
valueValue to print.
decimalPlacesNumber of decimal places to print.
+
+
+

+ void cubos::core::memory::Stream::print(double value, + std::size_t decimalPlaces = 4) +

+

Prints a double to the stream.

+ + + + + + + + + + + + + + +
Parameters
valueValue to print.
decimalPlacesNumber of decimal places to print.
+
+
+

+ void cubos::core::memory::Stream::print(const char* str) +

+

Prints a string to the stream.

+ + + + + + + + + + +
Parameters
strString to print.
+
+
+

+ void cubos::core::memory::Stream::print(const char* str, + std::size_t size) +

+

Prints a string to the stream.

+ + + + + + + + + + + + + + +
Parameters
strString to print.
sizeSize of the string.
+
+
+

+ void cubos::core::memory::Stream::print(const ::std::string& str) +

+

Prints a string to the stream.

+ + + + + + + + + + +
Parameters
strValue to print.
+
+
+

+
+ template<typename T, typename... TArgs> +
+ void cubos::core::memory::Stream::printf(const char* fmt, + T arg, + TArgs... args) +

+

Prints a formatted string the stream.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the first argument.
TArgsTypes of the remaining arguments.
Parameters
fmtFormat string.
argFirst argument to print.
argsRemaining arguments to print.
+
Usage
stream.printf("Hello, {}!\n", "world");
+stream.printf("{} + {} = {}\n", 1, 2, 3);
+stream.printf("\\{} {}\n", 1, 2); // This will print "{} 2"
+
+
+

+ void cubos::core::memory::Stream::printf(const char* fmt) +

+

Prints a string to the stream.

+ + + + + + + + + + +
Parameters
fmtFormat string.
+ +
+
+

+ void cubos::core::memory::Stream::parse(int8_t& value, + std::size_t base = 10) +

+

Parses a 8 bit signed integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(int16_t& value, + std::size_t base = 10) +

+

Parses a 16 bit signed integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(int32_t& value, + std::size_t base = 10) +

+

Parses a 32 bit signed integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(int64_t& value, + std::size_t base = 10) +

+

Parses a 64 bit signed integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(uint8_t& value, + std::size_t base = 10) +

+

Parses a 8 bit unsigned integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(uint16_t& value, + std::size_t base = 10) +

+

Parses a 16 bit unsigned integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(uint32_t& value, + std::size_t base = 10) +

+

Parses a 32 bit unsigned integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(uint64_t& value, + std::size_t base = 10) +

+

Parses a 64 bit unsigned integer from the stream.

+ + + + + + + + + + + + + + +
Parameters
value outParsed value.
baseBase to use.
+
+
+

+ void cubos::core::memory::Stream::parse(float& value) +

+

Parses a float from the stream.

+ + + + + + + + + + +
Parameters
value outParsed value.
+
+
+

+ void cubos::core::memory::Stream::parse(double& value) +

+

Parses a double from the stream.

+ + + + + + + + + + +
Parameters
value outParsed value.
+
+
+

+ void cubos::core::memory::Stream::readUntil(std::string& str, + const char* terminator) +

+

Reads a string from the stream until the terminator (or \0) is found.

+ + + + + + + + + + + + + + +
Parameters
str outRead string.
terminatorOptional terminator to use.
+
+
+

+ std::size_t cubos::core::memory::Stream::readUntil(char* buffer, + std::size_t size, + const char* terminator) +

+

Reads a string from the stream until the terminator (or \0) is found.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
bufferBuffer to read into.
sizeSize of the buffer.
terminatorOptional terminator to use.
ReturnsNumber of bytes read.
+
+
+

+ void cubos::core::memory::Stream::ignore(std::size_t size) +

+

Ignores a number of bytes from the stream.

+ + + + + + + + + + +
Parameters
sizeNumber of bytes to ignore.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1TypeMap.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1TypeMap.html new file mode 100644 index 0000000000..59f0f64e7d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1TypeMap.html @@ -0,0 +1,583 @@ + + + + + cubos::core::memory::TypeMap class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename V>
+ cubos::core::memory::TypeMap class +

+

A map that stores values of type V, using reflection types as keys.

+ + + + + + + + + + +
Template parameters
VValues type.
+ +
+

Public functions

+
+
+ void insert(const reflection::Type& type, + V value) +
+
Sets the value associated to the given type.
+
+
template<typename K>
+ void insert(V value) +
+
Sets the value associated to the given type.
+
+ auto erase(const reflection::Type& type) -> bool +
+
Removes the entry associated to the given type.
+
+
template<typename K>
+ auto erase() -> bool +
+
Removes the entry associated to the given type.
+
+ auto contains(const reflection::Type& type) const -> bool +
+
Checks if there's a an entry with the given type.
+
+
template<typename K>
+ auto contains() const -> bool +
+
Checks if there's a an entry with the given type.
+
+ auto at(const reflection::Type& type) -> V& +
+
Gets the value associated to the given type.
+
+
template<typename K>
+ auto at() -> V& +
+
Gets the value associated to the given type.
+
+ auto at(const reflection::Type& type) const -> const V& +
+
Gets the value associated to the given type.
+
+
template<typename K>
+ auto at() const -> const V& +
+
Gets the value associated to the given type.
+
+ void clear() +
+
Removes all entries from the map.
+
+ auto size() const -> std::size_t +
+
Gets the number of entries in the map.
+
+ auto empty() const -> bool +
+
Checks if the map is empty.
+
+ auto begin() -> auto +
+
Gets an iterator to the beginning of the map.
+
+ auto end() -> auto +
+
Gets an iterator to the end of the map.
+
+ auto begin() const -> auto +
+
Gets an iterator to the beginning of the map.
+
+ auto end() const -> auto +
+
Gets an iterator to the end of the map.
+
+
+
+

Function documentation

+
+

+
+ template<typename V> +
+ void cubos::core::memory::TypeMap<V>::insert(const reflection::Type& type, + V value) +

+

Sets the value associated to the given type.

+ + + + + + + + + + + + + + +
Parameters
typeType.
valueValue.
+ +
+
+

+
+ template<typename V> + template<typename K> +
+ void cubos::core::memory::TypeMap<V>::insert(V value) +

+

Sets the value associated to the given type.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
KType.
Parameters
valueValue.
+ +
+
+

+
+ template<typename V> +
+ bool cubos::core::memory::TypeMap<V>::erase(const reflection::Type& type) +

+

Removes the entry associated to the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsWhether the entry was removed.
+
+
+

+
+ template<typename V> + template<typename K> +
+ bool cubos::core::memory::TypeMap<V>::erase() +

+

Removes the entry associated to the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
KType.
ReturnsWhether the entry was removed.
+
+
+

+
+ template<typename V> +
+ bool cubos::core::memory::TypeMap<V>::contains(const reflection::Type& type) const +

+

Checks if there's a an entry with the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsWhether there's an entry with the given type.
+
+
+

+
+ template<typename V> + template<typename K> +
+ bool cubos::core::memory::TypeMap<V>::contains() const +

+

Checks if there's a an entry with the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
KType.
ReturnsWhether there's an entry with the given type.
+
+
+

+
+ template<typename V> +
+ V& cubos::core::memory::TypeMap<V>::at(const reflection::Type& type) +

+

Gets the value associated to the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsReference to the value.
+ +
+
+

+
+ template<typename V> + template<typename K> +
+ V& cubos::core::memory::TypeMap<V>::at() +

+

Gets the value associated to the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
KType.
ReturnsReference to the value.
+ +
+
+

+
+ template<typename V> +
+ const V& cubos::core::memory::TypeMap<V>::at(const reflection::Type& type) const +

+

Gets the value associated to the given type.

+ + + + + + + + + + + + + + + + +
Parameters
typeType.
ReturnsReference to the value.
+ +
+
+

+
+ template<typename V> + template<typename K> +
+ const V& cubos::core::memory::TypeMap<V>::at() const +

+

Gets the value associated to the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
KType.
ReturnsReference to the value.
+ +
+
+

+
+ template<typename V> +
+ std::size_t cubos::core::memory::TypeMap<V>::size() const +

+

Gets the number of entries in the map.

+ + + + + + + +
ReturnsValues count.
+
+
+

+
+ template<typename V> +
+ bool cubos::core::memory::TypeMap<V>::empty() const +

+

Checks if the map is empty.

+ + + + + + + +
ReturnsWhether the map is empty.
+
+
+

+
+ template<typename V> +
+ auto cubos::core::memory::TypeMap<V>::begin() +

+

Gets an iterator to the beginning of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename V> +
+ auto cubos::core::memory::TypeMap<V>::end() +

+

Gets an iterator to the end of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename V> +
+ auto cubos::core::memory::TypeMap<V>::begin() const +

+

Gets an iterator to the beginning of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename V> +
+ auto cubos::core::memory::TypeMap<V>::end() const +

+

Gets an iterator to the end of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1UnorderedBimap.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1UnorderedBimap.html new file mode 100644 index 0000000000..df2df80897 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1UnorderedBimap.html @@ -0,0 +1,483 @@ + + + + + cubos::core::memory::UnorderedBimap class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename L, typename R, typename LHash = std::hash<L>, typename RHash = std::hash<R>>
+ cubos::core::memory::UnorderedBimap class final +

+

A bidirectional hash table.

+ + + + + + + + + + + + + + + + + + + + + + +
Template parameters
LLeft type.
RRight type.
LHashHash functor type for L.
RHashHash functor type for R.
+ +
+

Public functions

+
+
+ void insert(L left, + R right) +
+
Adds a new entry to the map.
+
+ auto eraseLeft(const L& left) -> bool +
+
Removes the entry associated to the given left value.
+
+ auto eraseRight(const R& right) -> bool +
+
Removes the entry associated to the given right value.
+
+ auto contains(const L& left, + const R& right) const -> bool +
+
Checks if the map has the given entry.
+
+ auto containsLeft(const L& left) const -> bool +
+
Checks if the map contains the given left value.
+
+ auto containsRight(const R& right) const -> bool +
+
Checks if the map contains the given right value.
+
+ auto atLeft(const L& left) const -> const R& +
+
Gets the right value associated to the given left value.
+
+ auto atRight(const R& right) const -> const L& +
+
Gets the left value associated to the given right value.
+
+ void clear() +
+
Clears the map.
+
+ auto size() const -> std::size_t +
+
Gets the number of entries in the map.
+
+ auto empty() const -> bool +
+
Checks if the map is empty.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the beginning of the map.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the end of the map.
+
+
+
+

Function documentation

+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ void cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::insert(L left, + R right) +

+

Adds a new entry to the map.

+ + + + + + + + + + + + + + +
Parameters
leftLeft value.
rightRight value.
+ +
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::eraseLeft(const L& left) +

+

Removes the entry associated to the given left value.

+ + + + + + + + + + + + + + + + +
Parameters
leftLeft value.
ReturnsWhether the entry was removed.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::eraseRight(const R& right) +

+

Removes the entry associated to the given right value.

+ + + + + + + + + + + + + + + + +
Parameters
rightRight value.
ReturnsWhether the entry was removed.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::contains(const L& left, + const R& right) const +

+

Checks if the map has the given entry.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
leftLeft value.
rightRight value.
ReturnsWhether the map has the entry.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::containsLeft(const L& left) const +

+

Checks if the map contains the given left value.

+ + + + + + + + + + + + + + + + +
Parameters
leftLeft value.
ReturnsWhether the map contains the value.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::containsRight(const R& right) const +

+

Checks if the map contains the given right value.

+ + + + + + + + + + + + + + + + +
Parameters
rightRight value.
ReturnsWhether the map contains the value.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ const R& cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::atLeft(const L& left) const +

+

Gets the right value associated to the given left value.

+ + + + + + + + + + + + + + + + +
Parameters
leftLeft value.
ReturnsRight value.
+ +
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ const L& cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::atRight(const R& right) const +

+

Gets the left value associated to the given right value.

+ + + + + + + + + + + + + + + + +
Parameters
rightRight value.
ReturnsLeft value.
+ +
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ std::size_t cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::size() const +

+

Gets the number of entries in the map.

+ + + + + + + +
ReturnsEntry count.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ bool cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::empty() const +

+

Checks if the map is empty.

+ + + + + + + +
ReturnsWhether the map is empty.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ Iterator cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::begin() const +

+

Gets an iterator to the beginning of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+

+
+ template<typename L, typename R, typename LHash, typename RHash> +
+ Iterator cubos::core::memory::UnorderedBimap<L, R, LHash, RHash>::end() const +

+

Gets an iterator to the end of the map.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1memory_1_1WriteGuard.html b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1WriteGuard.html new file mode 100644 index 0000000000..b675c14c97 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1memory_1_1WriteGuard.html @@ -0,0 +1,326 @@ + + + + + cubos::core::memory::WriteGuard class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T, typename Lock>
+ cubos::core::memory::WriteGuard class +

+

Provides safe read-write access to an object using a lock.

+ + + + + + + + + + + + + + +
Template parameters
TGuarded object type.
LockHeld lock type.
+ +

This class was created because there are multiple parts of the code that need to provide access to objects in a thread-safe manner.

Usage example

using AssetMetaWrite = core::memory::WriteGuard<AssetMeta, std::unique_lock<std::shared_mutex>>;
+
+

Constructors, destructors, conversion operators

+
+
+ WriteGuard(T& object, + Lock&& lock) +
+
Constructor.
+
+ WriteGuard(WriteGuard&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto get() -> T& +
+
Gets a reference to the underlying object.
+
+ auto operator*() -> T& +
+
Gets a reference to the underlying object.
+
+ auto operator->() -> T* +
+
Gets a pointer to the underlying object.
+
+ auto get() const -> const T& +
+
Gets a reference to the underlying object.
+
+ auto operator*() const -> const T& +
+
Gets a reference to the underlying object.
+
+ auto operator->() const -> const T* +
+
Gets a pointer to the underlying object.
+
+
+
+

Function documentation

+
+

+
+ template<typename T, typename Lock> +
+ cubos::core::memory::WriteGuard<T, Lock>::WriteGuard(T& object, + Lock&& lock) +

+

Constructor.

+ + + + + + + + + + + + + + +
Parameters
objectObject to guard.
lockLock to hold.
+
+
+

+
+ template<typename T, typename Lock> +
+ cubos::core::memory::WriteGuard<T, Lock>::WriteGuard(WriteGuard&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherGuard to move from.
+
+
+

+
+ template<typename T, typename Lock> +
+ T& cubos::core::memory::WriteGuard<T, Lock>::get() +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ T& cubos::core::memory::WriteGuard<T, Lock>::operator*() +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ T* cubos::core::memory::WriteGuard<T, Lock>::operator->() +

+

Gets a pointer to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T& cubos::core::memory::WriteGuard<T, Lock>::get() const +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T& cubos::core::memory::WriteGuard<T, Lock>::operator*() const +

+

Gets a reference to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+

+
+ template<typename T, typename Lock> +
+ const T* cubos::core::memory::WriteGuard<T, Lock>::operator->() const +

+

Gets a pointer to the underlying object.

+ + + + + + + +
ReturnsUnderlying object.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1net_1_1Address.html b/preview/pr-1379/classcubos_1_1core_1_1net_1_1Address.html new file mode 100644 index 0000000000..b3c3857f90 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1net_1_1Address.html @@ -0,0 +1,279 @@ + + + + + cubos::core::net::Address class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::net::Address class + +

+

Represents an address, either IPv4 or IPv6.

+ +
+

Public static variables

+
+
+ static const Address Any +
+
0.0.0.0
+
+ static const Address LocalHost +
+
127.0.0.1
+
+
+
+

Public static functions

+
+
+ static auto fromIPv4(uint8_t a, + uint8_t b, + uint8_t c, + uint8_t d) -> Address +
+
Constructs a new IPv4 address from four octets (a.b.c.d).
+
+ static auto fromIPv6(uint32_t a, + uint32_t b, + uint32_t c, + uint32_t d) -> Address +
+
Constructs a new IPv6 address from four 32-bit integers (a.b.c.d).
+
+ static auto from(const std::string& address) -> memory::Opt<Address> +
+
Converts the provided string value to an Address.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Address() +
+
Constructs a empty address (IPv4 by default).
+
+ ~Address() +
+
Deconstructs by cleaning necessary resources.
+
+
+
+

Public functions

+
+
+ auto toString() const -> std::string +
+
Converts the address value to a string.
+
+
+
+

Function documentation

+
+

+ static Address cubos::core::net::Address::fromIPv4(uint8_t a, + uint8_t b, + uint8_t c, + uint8_t d) +

+

Constructs a new IPv4 address from four octets (a.b.c.d).

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
aFirst octet.
bSecond octet.
cThird octet.
dFourth octet.
+
+
+

+ static Address cubos::core::net::Address::fromIPv6(uint32_t a, + uint32_t b, + uint32_t c, + uint32_t d) +

+

Constructs a new IPv6 address from four 32-bit integers (a.b.c.d).

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
aFirst octet.
bSecond octet.
cThird octet.
dFourth octet.
+
+
+

+ static memory::Opt<Address> cubos::core::net::Address::from(const std::string& address) +

+

Converts the provided string value to an Address.

+ + + + + + + + + + + + + + + + +
Parameters
addressThe address, either in IPv4/IPv6 format, or as a domain hostname.
ReturnsAddress object, or nothing if could not resolve the provided address.
+
+
+

+ std::string cubos::core::net::Address::toString() const +

+

Converts the address value to a string.

+ + + + + + + +
ReturnsAddress represented as a string.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpListener.html b/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpListener.html new file mode 100644 index 0000000000..036c43f9f1 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpListener.html @@ -0,0 +1,279 @@ + + + + + cubos::core::net::TcpListener class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::net::TcpListener class final + +

+

A TCP socket server, listening for connections.

+ +
+

Constructors, destructors, conversion operators

+
+
+ TcpListener() +
+
Create an empty TCP listener, ready for connecting.
+
+ ~TcpListener() +
+
Deconstructs by calling close.
+
+ TcpListener(const TcpListener&) deleted +
+
Forbid copy construction.
+
+
+
+

Public functions

+
+
+ auto operator=(const TcpListener&) -> TcpListener& deleted +
+
Forbid assignment.
+
+ auto listen(const Address& address, + uint16_t port, + int maxQueueLength = 4096) -> bool +
+
Start listening for connection at specified address and port.
+
+ auto accept(TcpStream& stream) const -> bool +
+
Accepts a new connection.
+
+ void close() +
+
Close the listener socket.
+
+ auto valid() const -> bool +
+
Check if connection is valid.
+
+ auto inner() const -> InnerSocket +
+
Get inner socket handle.
+
+ auto setBlocking(bool blocking) -> bool +
+
Control blocking mode of inner socket.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::net::TcpListener::listen(const Address& address, + uint16_t port, + int maxQueueLength = 4096) +

+

Start listening for connection at specified address and port.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
addressDestination address.
portDestination port.
maxQueueLengthMaximum connection requests.
ReturnsWhether start listening was successful.
+
+
+

+ bool cubos::core::net::TcpListener::accept(TcpStream& stream) const +

+

Accepts a new connection.

+ + + + + + + + + + + + + + + + +
Parameters
stream outBuffer to store the connection stream.
ReturnsWhether accepting the connection and creating the stream was successful.
+ +
+
+

+ bool cubos::core::net::TcpListener::valid() const +

+

Check if connection is valid.

+ + + + + + + +
ReturnsWhether inner sock is connected.
+
+
+

+ InnerSocket cubos::core::net::TcpListener::inner() const +

+

Get inner socket handle.

+ + + + + + + +
ReturnsSocket.
+
+
+

+ bool cubos::core::net::TcpListener::setBlocking(bool blocking) +

+

Control blocking mode of inner socket.

+ + + + + + + + + + + + + + + + +
Parameters
blockingWhether to block or not.
ReturnsWhether setting the block flag was sucessful.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpStream.html b/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpStream.html new file mode 100644 index 0000000000..c6d7823b3b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1net_1_1TcpStream.html @@ -0,0 +1,417 @@ + + + + + cubos::core::net::TcpStream class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::net::TcpStream class + +

+

Stream implementation which writes to/reads from a TCP connection.

+ +
+

Base classes

+
+
+ class cubos::core::memory::Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ TcpStream() +
+
Constructs an empty TCP stream, ready for connecting.
+
+ ~TcpStream() override +
+
Deconstructs.
+
+ TcpStream(TcpStream&& other) noexcept +
+
Move constructor.
+
+ TcpStream(const TcpStream&) deleted +
+
Forbid copy construction.
+
+
+
+

Public functions

+
+
+ auto operator=(const TcpStream&) -> TcpStream& deleted +
+
Forbid copy assignment.
+
+ auto connect(const Address& address, + uint16_t port) -> bool +
+
Connects to a TCP listener, possibly on a remote machine.
+
+ void inner(InnerSocket socket) +
+
Replaces the inner socket with the given one.
+
+ void disconnect() +
+
Disconnects inner socket.
+
+ auto valid() const -> bool +
+
Checks if inner socket is currently valid successfully.
+
+ auto setBlocking(bool blocking) -> bool +
+
Control blocking mode of inner socket.
+
+ auto read(void* data, + std::size_t size) -> std::size_t override +
+
Reads data from the stream.
+
+ auto write(const void* data, + std::size_t size) -> std::size_t override +
+
Writes data to the stream.
+
+ auto tell() const -> std::size_t override +
+
Gets the current position in the stream.
+
+ auto eof() const -> bool override +
+
Checks if the stream still has content to read.
+
+ auto peek() -> char override +
+
Peeks one byte from the stream.
+
+ void seek(ptrdiff_t offset, + memory::SeekOrigin origin) override +
+
Seeks to a position in the stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::net::TcpStream::connect(const Address& address, + uint16_t port) +

+

Connects to a TCP listener, possibly on a remote machine.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
addressDestination address.
portDestination port.
ReturnsWhether connecting was successful.
+
+
+

+ void cubos::core::net::TcpStream::inner(InnerSocket socket) +

+

Replaces the inner socket with the given one.

+ + + + + + + + + + + + + + + + +
Parameters
socketSocket.
ReturnsWhether connecting was successful.
+
+
+

+ bool cubos::core::net::TcpStream::valid() const +

+

Checks if inner socket is currently valid successfully.

+ + + + + + + +
ReturnsWhether inner socket is valid.
+
+
+

+ bool cubos::core::net::TcpStream::setBlocking(bool blocking) +

+

Control blocking mode of inner socket.

+ + + + + + + + + + + + + + + + +
Parameters
blockingWhether to block or not.
ReturnsWhether setting the block flag was sucessful.
+ +
+
+

+ std::size_t cubos::core::net::TcpStream::read(void* data, + std::size_t size) override +

+

Reads data from the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to read data into.
sizeSize of the buffer.
ReturnsNumber of bytes read.
+ +
+
+

+ std::size_t cubos::core::net::TcpStream::write(const void* data, + std::size_t size) override +

+

Writes data to the stream.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to write data from.
sizeSize of the buffer.
ReturnsNumber of bytes written.
+ +
+
+

+ std::size_t cubos::core::net::TcpStream::tell() const override +

+

Gets the current position in the stream.

+ + + + + + + +
ReturnsCurrent position in the stream, or SIZE_MAX if the position is unknown.
+
+
+

+ bool cubos::core::net::TcpStream::eof() const override +

+

Checks if the stream still has content to read.

+ + + + + + + +
ReturnsWhether the stream has reached the end.
+
+
+

+ char cubos::core::net::TcpStream::peek() override +

+

Peeks one byte from the stream.

+ + + + + + + +
ReturnsPeeked byte.
+
+
+

+ void cubos::core::net::TcpStream::seek(ptrdiff_t offset, + memory::SeekOrigin origin) override +

+

Seeks to a position in the stream.

+ + + + + + + + + + + + + + +
Parameters
offsetOffset to seek to.
originOrigin of the offset.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1net_1_1UdpSocket.html b/preview/pr-1379/classcubos_1_1core_1_1net_1_1UdpSocket.html new file mode 100644 index 0000000000..4f716311c9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1net_1_1UdpSocket.html @@ -0,0 +1,299 @@ + + + + + cubos::core::net::UdpSocket class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::net::UdpSocket class + +

+

Represents a UDP socket.

+ +
+

Constructors, destructors, conversion operators

+
+
+ UdpSocket() +
+
Constructs a UDP socket.
+
+ ~UdpSocket() +
+
Deconstructs by unbinding the inner socket.
+
+ UdpSocket(const UdpSocket&) deleted +
+
Forbid copy construction.
+
+
+
+

Public functions

+
+
+ auto operator=(const UdpSocket&) -> UdpSocket& deleted +
+
Forbid copy assignment.
+
+ auto bind(uint16_t port, + const Address& address = Address::Any) const -> bool +
+
Binds a UDP socket from the given port and address.
+
+ void unbind() +
+
Closes the inner socket.
+
+ auto send(const void* data, + std::size_t size, + const Address& address, + uint16_t port) const -> bool +
+
Sends data on the socket to the remote address and port.
+
+ auto receive(void* data, + std::size_t size, + std::size_t& received, + Address& address) const -> bool +
+
Receives a single datagram message on the socket.
+
+ auto setBlocking(bool blocking) -> bool +
+
Control blocking mode of inner socket.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::net::UdpSocket::bind(uint16_t port, + const Address& address = Address::Any) const +

+

Binds a UDP socket from the given port and address.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
portPort to bind.
addressAddress to bind.
ReturnsWhether binding was successful.
+
+
+

+ bool cubos::core::net::UdpSocket::send(const void* data, + std::size_t size, + const Address& address, + uint16_t port) const +

+

Sends data on the socket to the remote address and port.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
dataMessage.
sizeMessage size.
addressAddress to send.
portPort to send.
ReturnsWhether data was sent sucessfully.
+
+
+

+ bool cubos::core::net::UdpSocket::receive(void* data, + std::size_t size, + std::size_t& received, + Address& address) const +

+

Receives a single datagram message on the socket.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
dataBuffer to store the datagram message.
sizeMaximum buffer size.
received outNumber of bytes read.
address outOrigin address.
ReturnsWhether data was received sucessfully.
+
+
+

+ bool cubos::core::net::UdpSocket::setBlocking(bool blocking) +

+

Control blocking mode of inner socket.

+ + + + + + + + + + + + + + + + +
Parameters
blockingWhether to block or not.
ReturnsWhether setting the block flag was sucessfull.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ArrayTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ArrayTrait.html new file mode 100644 index 0000000000..a401e94361 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ArrayTrait.html @@ -0,0 +1,997 @@ + + + + + cubos::core::reflection::ArrayTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::ArrayTrait class final + +

+

Exposes array-like functionality of a type.

+ + +
+

Public types

+
+
+ using Length = std::size_t(*)(const void*instance) +
+
Function pointer to get the length of an array instance.
+
+ using AddressOf = uintptr_t(*)(const void*instance, std::size_t index) +
+
Function pointer to get the address of an element in an array instance.
+
+ using InsertDefault = void(*)(void*instance, std::size_t index) +
+
Function pointer to insert a default value into the array.
+
+ using InsertCopy = void(*)(void*instance, std::size_t index, const void*value) +
+
Function pointer to insert a copy of the given value into the array.
+
+ using InsertMove = void(*)(void*instance, std::size_t index, void*value) +
+
Function pointer to move the given value into the array.
+
+ using Erase = void(*)(void*instance, std::size_t index) +
+
Function pointer to remove an element of the array.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ ArrayTrait(const Type& elementType, + Length length, + AddressOf addressOf) +
+
Constructs.
+
+ View(const ArrayTrait& trait, + void* instance) +
+
Constructs.
+
+ ConstView(const ArrayTrait& trait, + const void* instance) +
+
Constructs.
+
+ Iterator(const View& view, + std::size_t index) +
+
Constructs.
+
+ Iterator(const Iterator& iterator) defaulted +
+
Copy constructs.
+
+ Iterator(const ConstView& view, + std::size_t index) +
+
Constructs.
+
+ Iterator(const Iterator& iterator) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ void setInsertDefault(InsertDefault insertDefault) +
+
Sets the default-construct insert operation to the trait.
+
+ void setInsertCopy(InsertCopy insertCopy) +
+
Sets the copy-construct insert operation to the trait.
+
+ void setInsertMove(InsertMove insertMove) +
+
Sets the move-construct insert operation to the trait.
+
+ void setErase(Erase erase) +
+
Sets the erase operation to the trait.
+
+ auto hasInsertDefault() const -> bool +
+
Checks if default-construct insert is supported.
+
+ auto hasInsertCopy() const -> bool +
+
Checks if copy-construct insert is supported.
+
+ auto hasInsertMove() const -> bool +
+
Checks if move-construct insert is supported.
+
+ auto hasErase() const -> bool +
+
Checks if erase is supported.
+
+ auto hasResize() const -> bool +
+
Checks if resize is supported.
+
+ auto elementType() const -> const Type& +
+
Returns the element type of the array.
+
+ auto view(void* instance) const -> View +
+
Returns a view of the given array instance.
+
+ auto view(const void* instance) const -> ConstView +
+
Returns a view of the given array instance.
+
+ auto length() const -> std::size_t +
+
Returns the length of the array.
+
+ auto get(std::size_t index) const -> void* +
+
Gets a pointer to the element with the given index.
+
+ void insertDefault(std::size_t index) const +
+
Inserts a default-constructed element.
+
+ void insertCopy(std::size_t index, + const void* value) const +
+
Inserts a copy-constructed element.
+
+ void insertMove(std::size_t index, + void* value) const +
+
Inserts a move-constructed element.
+
+ void erase(std::size_t index) const +
+
Removes an element.
+
+ void clear() const +
+
Clears the array.
+
+ void resize(std::size_t size) const +
+
Resizes the array. If this increases the size of the array, insertDefault is used to insert the remaining elements.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first element.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the element after the last element.
+
+ auto length() const -> std::size_t +
+
Returns the length of the array.
+
+ auto get(std::size_t index) const -> const void* +
+
Gets a pointer to the element with the given index.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first element.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the element after the last element.
+
+ auto operator*() const -> void* +
+
Accesses the element referenced by this iterator.
+
+ auto operator->() const -> void* +
+
Accesses the element referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator*() const -> const void* +
+
Accesses the element referenced by this iterator.
+
+ auto operator->() const -> const void* +
+
Accesses the element referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Function documentation

+
+

+ cubos::core::reflection::ArrayTrait::ArrayTrait(const Type& elementType, + Length length, + AddressOf addressOf) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
elementType
lengthFunction used to get the length of an array.
addressOfFunction used to address an element in an array.
+
+
+

+ cubos::core::reflection::ArrayTrait::View(const ArrayTrait& trait, + void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::ArrayTrait::ConstView(const ArrayTrait& trait, + const void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::ArrayTrait::Iterator(const View& view, + std::size_t index) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
viewArray view.
indexElement index.
+
+
+

+ cubos::core::reflection::ArrayTrait::Iterator(const Iterator& iterator) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+
+
+

+ cubos::core::reflection::ArrayTrait::Iterator(const ConstView& view, + std::size_t index) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
viewArray view.
indexElement index.
+
+
+

+ cubos::core::reflection::ArrayTrait::Iterator(const Iterator& iterator) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+
+
+

+ void cubos::core::reflection::ArrayTrait::setInsertDefault(InsertDefault insertDefault) +

+

Sets the default-construct insert operation to the trait.

+ + + + + + + + + + +
Parameters
insertDefaultFunction pointer.
+
+
+

+ void cubos::core::reflection::ArrayTrait::setInsertCopy(InsertCopy insertCopy) +

+

Sets the copy-construct insert operation to the trait.

+ + + + + + + + + + +
Parameters
insertCopyFunction pointer.
+
+
+

+ void cubos::core::reflection::ArrayTrait::setInsertMove(InsertMove insertMove) +

+

Sets the move-construct insert operation to the trait.

+ + + + + + + + + + +
Parameters
insertMoveFunction pointer.
+
+
+

+ void cubos::core::reflection::ArrayTrait::setErase(Erase erase) +

+

Sets the erase operation to the trait.

+ + + + + + + + + + +
Parameters
eraseFunction pointer.
+
+
+

+ bool cubos::core::reflection::ArrayTrait::hasInsertDefault() const +

+

Checks if default-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ArrayTrait::hasInsertCopy() const +

+

Checks if copy-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ArrayTrait::hasInsertMove() const +

+

Checks if move-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ArrayTrait::hasErase() const +

+

Checks if erase is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ArrayTrait::hasResize() const +

+

Checks if resize is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ const Type& cubos::core::reflection::ArrayTrait::elementType() const +

+

Returns the element type of the array.

+ + + + + + + +
ReturnsElement type.
+
+
+

+ View cubos::core::reflection::ArrayTrait::view(void* instance) const +

+

Returns a view of the given array instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceArray instance.
ReturnsArray view.
+
+
+

+ ConstView cubos::core::reflection::ArrayTrait::view(const void* instance) const +

+

Returns a view of the given array instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceArray instance.
ReturnsArray view.
+
+
+

+ std::size_t cubos::core::reflection::ArrayTrait::length() const +

+

Returns the length of the array.

+ + + + + + + +
ReturnsArray length.
+
+
+

+ void* cubos::core::reflection::ArrayTrait::get(std::size_t index) const +

+

Gets a pointer to the element with the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexElement index.
ReturnsPointer to the element.
+
+
+

+ void cubos::core::reflection::ArrayTrait::insertDefault(std::size_t index) const +

+

Inserts a default-constructed element.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::reflection::ArrayTrait::insertCopy(std::size_t index, + const void* value) const +

+

Inserts a copy-constructed element.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueValue.
+ +
+
+

+ void cubos::core::reflection::ArrayTrait::insertMove(std::size_t index, + void* value) const +

+

Inserts a move-constructed element.

+ + + + + + + + + + + + + + +
Parameters
indexElement index.
valueValue.
+ +
+
+

+ void cubos::core::reflection::ArrayTrait::erase(std::size_t index) const +

+

Removes an element.

+ + + + + + + + + + +
Parameters
indexElement index.
+ +
+
+

+ void cubos::core::reflection::ArrayTrait::clear() const +

+

Clears the array.

+ +
+
+

+ void cubos::core::reflection::ArrayTrait::resize(std::size_t size) const +

+

Resizes the array. If this increases the size of the array, insertDefault is used to insert the remaining elements.

+ + + + + + + + + + +
Parameters
sizeArray size.
+ +
+
+

+ Iterator cubos::core::reflection::ArrayTrait::begin() const +

+

Gets an iterator to the first element.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::ArrayTrait::end() const +

+

Gets an iterator to the element after the last element.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ std::size_t cubos::core::reflection::ArrayTrait::length() const +

+

Returns the length of the array.

+ + + + + + + +
ReturnsArray length.
+
+
+

+ const void* cubos::core::reflection::ArrayTrait::get(std::size_t index) const +

+

Gets a pointer to the element with the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexElement index.
ReturnsPointer to the element.
+
+
+

+ Iterator cubos::core::reflection::ArrayTrait::begin() const +

+

Gets an iterator to the first element.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::ArrayTrait::end() const +

+

Gets an iterator to the element after the last element.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ void* cubos::core::reflection::ArrayTrait::operator*() const +

+

Accesses the element referenced by this iterator.

+ + + + + + + +
ReturnsElement.
+ +
+
+

+ void* cubos::core::reflection::ArrayTrait::operator->() const +

+

Accesses the element referenced by this iterator.

+ + + + + + + +
ReturnsElement.
+ +
+
+

+ Iterator& cubos::core::reflection::ArrayTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ const void* cubos::core::reflection::ArrayTrait::operator*() const +

+

Accesses the element referenced by this iterator.

+ + + + + + + +
ReturnsElement.
+ +
+
+

+ const void* cubos::core::reflection::ArrayTrait::operator->() const +

+

Accesses the element referenced by this iterator.

+ + + + + + + +
ReturnsElement.
+ +
+
+

+ Iterator& cubos::core::reflection::ArrayTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait.html new file mode 100644 index 0000000000..48a28e7849 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait.html @@ -0,0 +1,571 @@ + + + + + cubos::core::reflection::ConstructibleTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::ConstructibleTrait class + +

+

Describes how a reflected type may be constructed and destructed.

+ + +
+

Public types

+
+
+
template<typename T>
+ class Builder +
+
Builder for ConstructibleTrait.
+
+ using Destructor = memory::Function<void(void*instance) const > +
+
Function pointer to the destructor of a type.
+
+ using DefaultConstructor = memory::Function<void(void*instance) const > +
+
Function pointer to the default constructor of a type.
+
+ using CopyConstructor = memory::Function<void(void*instance, const void*other) const > +
+
Function pointer to the copy constructor of a type.
+
+ using MoveConstructor = memory::Function<void(void*instance, void*other) const > +
+
Function pointer to the move constructor of a type.
+
+
+
+

Public static functions

+
+
+
template<typename T>
+ static auto typed() -> Builder<T> +
+
Returns a trait builder for the given type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ ConstructibleTrait(std::size_t size, + std::size_t alignment, + Destructor destructor) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto withDefaultConstructor(DefaultConstructor defaultConstructor) && -> ConstructibleTrait&& +
+
Sets the default constructor of the type.
+
+ auto withCopyConstructor(CopyConstructor copyConstructor) && -> ConstructibleTrait&& +
+
Sets the copy constructor of the type.
+
+ auto withMoveConstructor(MoveConstructor moveConstructor) && -> ConstructibleTrait&& +
+
Sets the move constructor of the type.
+
+ auto size() const -> std::size_t +
+
Returns the size of the type in bytes.
+
+ auto alignment() const -> std::size_t +
+
Returns the alignment of the type in bytes.
+
+ auto hasDefaultConstruct() const -> bool +
+
Checks if default construction is supported.
+
+ auto hasCopyConstruct() const -> bool +
+
Checks if copy construction is supported.
+
+ auto hasMoveConstruct() const -> bool +
+
Checks if move construction is supported.
+
+ void destruct(void* instance) const +
+
Destructs an instance of the type.
+
+ void defaultConstruct(void* instance) const +
+
Default constructs an instance of the type.
+
+ void copyConstruct(void* instance, + const void* other) const +
+
Copy constructs an instance of the type.
+
+ void moveConstruct(void* instance, + void* other) const +
+
Move constructs an instance of the type.
+
+ auto destructor() const -> Destructor +
+
Gets the destructor of the type.
+
+ auto defaultConstructor() const -> DefaultConstructor +
+
Gets the default constructor of the type.
+
+ auto copyConstructor() const -> CopyConstructor +
+
Gets the copy constructor of the type.
+
+ auto moveConstructor() const -> MoveConstructor +
+
Gets the move constructor of the type.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ static Builder<T> cubos::core::reflection::ConstructibleTrait::typed() +

+

Returns a trait builder for the given type.

+ + + + + + + + + + + + + + + + +
Template parameters
TType to build a trait for.
ReturnsTrait builder.
+
+
+

+ cubos::core::reflection::ConstructibleTrait::ConstructibleTrait(std::size_t size, + std::size_t alignment, + Destructor destructor) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
sizeSize of the type in bytes.
alignmentAlignment of the type in bytes (must be a power of two).
destructorDestructor of the type.
+
+
+

+ ConstructibleTrait&& cubos::core::reflection::ConstructibleTrait::withDefaultConstructor(DefaultConstructor defaultConstructor) && +

+

Sets the default constructor of the type.

+ + + + + + + + + + + + + + + + +
Parameters
defaultConstructorFunction pointer to the default constructor of the type.
ReturnsTrait.
+

Aborts if the default constructor has already been set.

+
+
+

+ ConstructibleTrait&& cubos::core::reflection::ConstructibleTrait::withCopyConstructor(CopyConstructor copyConstructor) && +

+

Sets the copy constructor of the type.

+ + + + + + + + + + + + + + + + +
Parameters
copyConstructorFunction pointer to the copy constructor of the type.
ReturnsTrait.
+

Aborts if the copy constructor has already been set.

+
+
+

+ ConstructibleTrait&& cubos::core::reflection::ConstructibleTrait::withMoveConstructor(MoveConstructor moveConstructor) && +

+

Sets the move constructor of the type.

+ + + + + + + + + + + + + + + + +
Parameters
moveConstructorFunction pointer to the move constructor of the type.
ReturnsTrait.
+

Aborts if the copy constructor has already been set.

+
+
+

+ std::size_t cubos::core::reflection::ConstructibleTrait::size() const +

+

Returns the size of the type in bytes.

+ + + + + + + +
ReturnsSize of the type in bytes.
+
+
+

+ std::size_t cubos::core::reflection::ConstructibleTrait::alignment() const +

+

Returns the alignment of the type in bytes.

+ + + + + + + +
ReturnsAlignment of the type in bytes.
+
+
+

+ bool cubos::core::reflection::ConstructibleTrait::hasDefaultConstruct() const +

+

Checks if default construction is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ConstructibleTrait::hasCopyConstruct() const +

+

Checks if copy construction is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::ConstructibleTrait::hasMoveConstruct() const +

+

Checks if move construction is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ void cubos::core::reflection::ConstructibleTrait::destruct(void* instance) const +

+

Destructs an instance of the type.

+ + + + + + + + + + +
Parameters
instancePointer to the instance to destruct.
+
+
+

+ void cubos::core::reflection::ConstructibleTrait::defaultConstruct(void* instance) const +

+

Default constructs an instance of the type.

+ + + + + + + + + + +
Parameters
instancePointer to the location to construct the instance at.
+ +
+
+

+ void cubos::core::reflection::ConstructibleTrait::copyConstruct(void* instance, + const void* other) const +

+

Copy constructs an instance of the type.

+ + + + + + + + + + + + + + +
Parameters
instancePointer to the location to construct the instance at.
otherPointer to the instance to copy construct from.
+ +
+
+

+ void cubos::core::reflection::ConstructibleTrait::moveConstruct(void* instance, + void* other) const +

+

Move constructs an instance of the type.

+ + + + + + + + + + + + + + +
Parameters
instancePointer to the location to construct the instance at.
otherPointer to the instance to move construct from.
+ +
+
+

+ Destructor cubos::core::reflection::ConstructibleTrait::destructor() const +

+

Gets the destructor of the type.

+ + + + + + + +
ReturnsDestructor of the type.
+
+
+

+ DefaultConstructor cubos::core::reflection::ConstructibleTrait::defaultConstructor() const +

+

Gets the default constructor of the type.

+ + + + + + + +
ReturnsDefault constructor of the type.
+
+
+

+ CopyConstructor cubos::core::reflection::ConstructibleTrait::copyConstructor() const +

+

Gets the copy constructor of the type.

+ + + + + + + +
ReturnsCopy constructor of the type.
+
+
+

+ MoveConstructor cubos::core::reflection::ConstructibleTrait::moveConstructor() const +

+

Gets the move constructor of the type.

+ + + + + + + +
ReturnsMove constructor of the type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait_1_1Builder.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait_1_1Builder.html new file mode 100644 index 0000000000..6a7dad7ff9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1ConstructibleTrait_1_1Builder.html @@ -0,0 +1,238 @@ + + + + + cubos::core::reflection::ConstructibleTrait::Builder class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::reflection::ConstructibleTrait::Builder class +

+

Builder for ConstructibleTrait.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Builder() +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto build() && -> ConstructibleTrait +
+
Returns the constructed trait.
+
+ auto withDefaultConstructor() && -> Builder&& +
+
Sets the default constructor of the type.
+
+ auto withCopyConstructor() && -> Builder&& +
+
Sets the copy constructor of the type.
+
+ auto withMoveConstructor() && -> Builder&& +
+
Sets the move constructor of the type.
+
+ auto withBasicConstructors() && -> Builder&& +
+
Sets the default, copy and move constructors of the type.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ ConstructibleTrait cubos::core::reflection::ConstructibleTrait::Builder<T>::build() && +

+

Returns the constructed trait.

+ + + + + + + +
ReturnsConstructed trait.
+
+
+

+
+ template<typename T> +
+ Builder&& cubos::core::reflection::ConstructibleTrait::Builder<T>::withDefaultConstructor() && +

+

Sets the default constructor of the type.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ Builder&& cubos::core::reflection::ConstructibleTrait::Builder<T>::withCopyConstructor() && +

+

Sets the copy constructor of the type.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ Builder&& cubos::core::reflection::ConstructibleTrait::Builder<T>::withMoveConstructor() && +

+

Sets the move constructor of the type.

+ + + + + + + +
ReturnsBuilder.
+
+
+

+
+ template<typename T> +
+ Builder&& cubos::core::reflection::ConstructibleTrait::Builder<T>::withBasicConstructors() && +

+

Sets the default, copy and move constructors of the type.

+ + + + + + + +
ReturnsBuilder.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1DictionaryTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1DictionaryTrait.html new file mode 100644 index 0000000000..4becdea351 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1DictionaryTrait.html @@ -0,0 +1,1191 @@ + + + + + cubos::core::reflection::DictionaryTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::DictionaryTrait class final + +

+

Exposes dictionary-like functionality of a type.

+ + +
+

Public types

+
+
+ struct Entry +
+
Output structure for the iterator.
+
+ using Length = std::size_t(*)(const void*instance) +
+
Function pointer to get the length of a dictionary instance.
+
+ using Begin = void*(*)(uintptr_t instance, bool writeable) +
+
Function pointer to get an iterator to the first key-value pair of a dictionary instance.
+
+ using Find = void*(*)(uintptr_t instance, const void*key, bool writeable) +
+
Function pointer to get an iterator to a value in an dictionary instance.
+
+ using Advance = bool(*)(uintptr_t instance, void*iterator, bool writeable) +
+
Function pointer to advance an iterator.
+
+ using Stop = void(*)(void*iterator, bool writeable) +
+
Function pointer to destroy an iterator instance.
+
+ using Key = const void*(*)(const void*iterator, bool writeable) +
+
Function pointer to get the address of the key pointed to by an iterator.
+
+ using Value = uintptr_t(*)(const void*iterator, bool writeable) +
+
Function pointer to get the address of the value pointed to by an iterator.
+
+ using InsertDefault = void(*)(void*instance, const void*key) +
+
Function pointer to insert a default value into a dictionary instance.
+
+ using InsertCopy = void(*)(void*instance, const void*key, const void*value) +
+
Function pointer to insert a copy of the given value into a dictionary instance.
+
+ using InsertMove = void(*)(void*instance, const void*key, void*value) +
+
Function pointer to move the given value into a dictionary instance.
+
+ using Erase = void(*)(void*instance, const void*iterator) +
+
Function pointer to remove a key-value pair of a dictionary instance.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ DictionaryTrait(const Type& keyType, + const Type& valueType, + Length length, + Begin begin, + Find find, + Advance advance, + Stop stop, + Key key, + Value value) +
+
Constructs.
+
+ View(const DictionaryTrait& trait, + void* instance) +
+
Constructs.
+
+ ConstView(const DictionaryTrait& trait, + const void* instance) +
+
Constructs.
+
+ Iterator(const Iterator& other) +
+
Copy constructs.
+
+ Iterator(Iterator&& other) noexcept +
+
Move constructs.
+
+ Iterator(const Iterator& other) +
+
Copy constructs.
+
+ Iterator(Iterator&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ void setInsertDefault(InsertDefault insertDefault) +
+
Sets the default-construct insert operation of the trait.
+
+ void setInsertCopy(InsertCopy insertCopy) +
+
Sets the copy-construct insert operation of the trait.
+
+ void setInsertMove(InsertMove insertMove) +
+
Sets the move-construct insert operation of the trait.
+
+ void setErase(Erase erase) +
+
Sets the erase operation of the trait.
+
+ auto hasInsertDefault() const -> bool +
+
Checks if default-construct insert is supported.
+
+ auto hasInsertCopy() const -> bool +
+
Checks if copy-construct insert is supported.
+
+ auto hasInsertMove() const -> bool +
+
Checks if move-construct insert is supported.
+
+ auto hasErase() const -> bool +
+
Checks if erase is supported.
+
+ auto keyType() const -> const Type& +
+
Returns the key type of the dictionary.
+
+ auto valueType() const -> const Type& +
+
Returns the value type of the dictionary.
+
+ auto view(void* instance) const -> View +
+
Returns a view of the given dictionary instance.
+
+ auto view(const void* instance) const -> ConstView +
+
Returns a view of the given dictionary instance.
+
+ auto length() const -> std::size_t +
+
Returns the length of the dictionary.
+
+ auto begin() const -> Iterator +
+
Returns an iterator to the first entry.
+
+ auto end() const -> Iterator +
+
Returns an iterator to the entry after the last entry.
+
+ auto find(const void* key) const -> Iterator +
+
Returns an iterator to the entry with the given key.
+
+ void insertDefault(const void* key) const +
+
Inserts a default-constructed value with the given key.
+
+ void insertCopy(const void* key, + const void* value) const +
+
Inserts a copy-constructed value with the given key.
+
+ void insertMove(const void* key, + void* value) const +
+
Inserts a move-constructed value with the given key.
+
+ void erase(Iterator& iterator) const +
+
Removes an entry.
+
+ void erase(Iterator&& iterator) const +
+
Removes an entry.
+
+ void clear() const +
+
Clears the dictionary.
+
+ auto length() const -> std::size_t +
+
Returns the length of the dictionary.
+
+ auto begin() const -> Iterator +
+
Returns an iterator to the first entry.
+
+ auto end() const -> Iterator +
+
Returns an iterator to the entry after the last entry.
+
+ auto find(const void* key) const -> Iterator +
+
Returns an iterator to the entry with the given key.
+
+ auto operator=(const Iterator& other) -> Iterator& +
+
Assigns an iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator!=(const Iterator&) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Entry& +
+
Accesses the entry referenced by this iterator.
+
+ auto operator->() const -> const Entry* +
+
Accesses the entry referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator=(const Iterator& other) -> Iterator& +
+
Assigns an iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator!=(const Iterator&) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Entry& +
+
Accesses the entry referenced by this iterator.
+
+ auto operator->() const -> const Entry* +
+
Accesses the entry referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Function documentation

+
+

+ cubos::core::reflection::DictionaryTrait::DictionaryTrait(const Type& keyType, + const Type& valueType, + Length length, + Begin begin, + Find find, + Advance advance, + Stop stop, + Key key, + Value value) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
keyTypeKey type of the dictionary.
valueTypeValue type of the dictionary.
lengthFunction used to get the length of a dictionary.
beginFunction used to get an iterator to the first key-value pair of a
findFunction used to find a key-value pair in a dictionary.
advanceFunction used to advance an iterator.
stopFunction used to destroy an iterator.
keyFunction used to get the address of the key pointed to by an iterator.
valueFunction used to get the address of the value pointed to by an iterator.
+
+
+

+ cubos::core::reflection::DictionaryTrait::View(const DictionaryTrait& trait, + void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::DictionaryTrait::ConstView(const DictionaryTrait& trait, + const void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::DictionaryTrait::Iterator(const Iterator& other) +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::reflection::DictionaryTrait::Iterator(Iterator&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::reflection::DictionaryTrait::Iterator(const Iterator& other) +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::reflection::DictionaryTrait::Iterator(Iterator&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ void cubos::core::reflection::DictionaryTrait::setInsertDefault(InsertDefault insertDefault) +

+

Sets the default-construct insert operation of the trait.

+ + + + + + + + + + +
Parameters
insertDefaultFunction pointer.
+
+
+

+ void cubos::core::reflection::DictionaryTrait::setInsertCopy(InsertCopy insertCopy) +

+

Sets the copy-construct insert operation of the trait.

+ + + + + + + + + + +
Parameters
insertCopyFunction pointer.
+
+
+

+ void cubos::core::reflection::DictionaryTrait::setInsertMove(InsertMove insertMove) +

+

Sets the move-construct insert operation of the trait.

+ + + + + + + + + + +
Parameters
insertMoveFunction pointer.
+
+
+

+ void cubos::core::reflection::DictionaryTrait::setErase(Erase erase) +

+

Sets the erase operation of the trait.

+ + + + + + + + + + +
Parameters
eraseFunction pointer.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::hasInsertDefault() const +

+

Checks if default-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::hasInsertCopy() const +

+

Checks if copy-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::hasInsertMove() const +

+

Checks if move-construct insert is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::hasErase() const +

+

Checks if erase is supported.

+ + + + + + + +
ReturnsWhether the operation is supported.
+
+
+

+ const Type& cubos::core::reflection::DictionaryTrait::keyType() const +

+

Returns the key type of the dictionary.

+ + + + + + + +
ReturnsKey type.
+
+
+

+ const Type& cubos::core::reflection::DictionaryTrait::valueType() const +

+

Returns the value type of the dictionary.

+ + + + + + + +
ReturnsValue type.
+
+
+

+ View cubos::core::reflection::DictionaryTrait::view(void* instance) const +

+

Returns a view of the given dictionary instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceDictionary instance.
ReturnsDictionary view.
+
+
+

+ ConstView cubos::core::reflection::DictionaryTrait::view(const void* instance) const +

+

Returns a view of the given dictionary instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceDictionary instance.
ReturnsDictionary view.
+
+
+

+ std::size_t cubos::core::reflection::DictionaryTrait::length() const +

+

Returns the length of the dictionary.

+ + + + + + + +
ReturnsDictionary length.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::begin() const +

+

Returns an iterator to the first entry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::end() const +

+

Returns an iterator to the entry after the last entry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::find(const void* key) const +

+

Returns an iterator to the entry with the given key.

+ + + + + + + + + + + + + + + + +
Parameters
keyKey.
ReturnsIterator.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::insertDefault(const void* key) const +

+

Inserts a default-constructed value with the given key.

+ + + + + + + + + + +
Parameters
keyKey.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::insertCopy(const void* key, + const void* value) const +

+

Inserts a copy-constructed value with the given key.

+ + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::insertMove(const void* key, + void* value) const +

+

Inserts a move-constructed value with the given key.

+ + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::erase(Iterator& iterator) const +

+

Removes an entry.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::erase(Iterator&& iterator) const +

+

Removes an entry.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+ +
+
+

+ void cubos::core::reflection::DictionaryTrait::clear() const +

+

Clears the dictionary.

+ +
+
+

+ std::size_t cubos::core::reflection::DictionaryTrait::length() const +

+

Returns the length of the dictionary.

+ + + + + + + +
ReturnsDictionary length.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::begin() const +

+

Returns an iterator to the first entry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::end() const +

+

Returns an iterator to the entry after the last entry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::DictionaryTrait::find(const void* key) const +

+

Returns an iterator to the entry with the given key.

+ + + + + + + + + + + + + + + + +
Parameters
keyKey.
ReturnsIterator.
+ +
+
+

+ Iterator& cubos::core::reflection::DictionaryTrait::operator=(const Iterator& other) +

+

Assigns an iterator.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsIterator.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same entry.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::operator!=(const Iterator&) const +

+

Compares two iterators.

+ + + + + + + +
ReturnsWhether the iterators point to different entries.
+
+
+

+ const Entry& cubos::core::reflection::DictionaryTrait::operator*() const +

+

Accesses the entry referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Entry* cubos::core::reflection::DictionaryTrait::operator->() const +

+

Accesses the entry referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::reflection::DictionaryTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ Iterator& cubos::core::reflection::DictionaryTrait::operator=(const Iterator& other) +

+

Assigns an iterator.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsIterator.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same entry.
+
+
+

+ bool cubos::core::reflection::DictionaryTrait::operator!=(const Iterator&) const +

+

Compares two iterators.

+ + + + + + + +
ReturnsWhether the iterators point to different entries.
+
+
+

+ const Entry& cubos::core::reflection::DictionaryTrait::operator*() const +

+

Accesses the entry referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ const Entry* cubos::core::reflection::DictionaryTrait::operator->() const +

+

Accesses the entry referenced by this iterator.

+ + + + + + + +
ReturnsEntry.
+ +
+
+

+ Iterator& cubos::core::reflection::DictionaryTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1EnumTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1EnumTrait.html new file mode 100644 index 0000000000..244289d032 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1EnumTrait.html @@ -0,0 +1,742 @@ + + + + + cubos::core::reflection::EnumTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::EnumTrait class + +

+

Provides enumeration functionality to an enumerated type.

+ + +
+

Public types

+
+
+ using Tester = memory::Function<bool(const void*) const > +
+
Function pointer to test if a value matches the variant.
+
+ using Setter = memory::Function<void(void*) const > +
+
Function pointer to set the value of the variant.
+
+
+
+

Public static functions

+
+
+
template<typename T>
+ static auto toString(const T& value) -> const std::string& +
+
Converts an enumeration value to its string representation.
+
+
template<typename T>
+ static auto fromString(T& value, + const std::string& str) -> bool +
+
Converts a string to a value of a specified type.
+
+ static auto end() -> Iterator +
+
Gets an iterator to the last variant of the type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ EnumTrait() defaulted +
+
Constructs.
+
+ EnumTrait(EnumTrait&& other) noexcept +
+
Move constructs.
+
+ Variant(std::string name, + Tester tester, + Setter setter) +
+
Constructs a variant with a given name, tester function, and setter function.
+
+ Iterator(const Variant* variant) +
+
Constructs.
+
+ Iterator(const Iterator& iterator) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ void addVariant(std::string name, + Tester tester, + Setter setter) +
+
Adds a variant to the type.
+
+ auto withVariant(std::string name, + Tester tester, + Setter setter) && -> EnumTrait&& +
+
Adds a variant to the type.
+
+
template<auto V>
+ auto withVariant(std::string name) && -> EnumTrait&& +
+
Adds a variant to the type.
+
+ auto contains(const std::string& name) const -> bool +
+
Checks if a variant with the given name exists.
+
+ auto at(const std::string& name) const -> const Variant& +
+
Gets the variant with the specified name.
+
+ auto variant(const void* value) const -> const Variant& +
+
Gets the variant associated with the given value.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first variant of the type.
+
+ auto size() const -> std::size_t +
+
Returns how many enum variants there are in the trait.
+
+ auto test(const void* value) const -> bool +
+
Tests if the given value matches the variant.
+
+ void set(void* value) const +
+
Sets the value of the variant.
+
+ auto name() const -> const std::string& +
+
Gets the name of the variant.
+
+ auto next() const -> const Variant* +
+
Returns the next variant in the linked list.
+
+ auto operator=(const Iterator&) -> Iterator& defaulted +
+
Copy assigns.
+
+ auto operator==(const Iterator&) const -> bool defaulted +
+
Compares with another iterator.
+
+ auto operator*() const -> const Variant& +
+
Accesses the variant referenced by this iterator.
+
+ auto operator->() const -> const Variant* +
+
Accesses the variant referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ static const std::string& cubos::core::reflection::EnumTrait::toString(const T& value) +

+

Converts an enumeration value to its string representation.

+ + + + + + + + + + + + + + + + +
Parameters
valueEnumeration value to be converted.
ReturnsString representation.
+
+
+

+
+ template<typename T> +
+ static bool cubos::core::reflection::EnumTrait::fromString(T& value, + const std::string& str) +

+

Converts a string to a value of a specified type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
value in/outVariable to store the converted value.
strString to be converted to the specified value type.
ReturnsWhether the conversion was successful, false otherwise.
+
+
+

+ static Iterator cubos::core::reflection::EnumTrait::end() +

+

Gets an iterator to the last variant of the type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ cubos::core::reflection::EnumTrait::EnumTrait(EnumTrait&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther trait.
+
+
+

+ cubos::core::reflection::EnumTrait::Variant(std::string name, + Tester tester, + Setter setter) +

+

Constructs a variant with a given name, tester function, and setter function.

+ + + + + + + + + + + + + + + + + + +
Parameters
nameVariant name.
testerFunction to test if a value matches the variant.
setterFunction to set the value of the variant.
+
+
+

+ cubos::core::reflection::EnumTrait::Iterator(const Variant* variant) +

+

Constructs.

+ + + + + + + + + + +
Parameters
variantVariant.
+
+
+

+ cubos::core::reflection::EnumTrait::Iterator(const Iterator& iterator) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+
+
+

+ void cubos::core::reflection::EnumTrait::addVariant(std::string name, + Tester tester, + Setter setter) +

+

Adds a variant to the type.

+ + + + + + + + + + + + + + + + + + +
Parameters
nameVariant name.
testerFunction to test if a value matches the variant.
setterFunction to set the value of the variant.
+
+
+

+ EnumTrait&& cubos::core::reflection::EnumTrait::withVariant(std::string name, + Tester tester, + Setter setter) && +

+

Adds a variant to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameVariant name.
testerFunction to test if a value matches the variant.
setterFunction to set the value of the variant.
ReturnsTrait.
+
+
+

+
+ template<auto V> +
+ EnumTrait&& cubos::core::reflection::EnumTrait::withVariant(std::string name) && +

+

Adds a variant to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
VEnumeration value.
Parameters
nameVariant name.
ReturnsTrait.
+
+
+

+ bool cubos::core::reflection::EnumTrait::contains(const std::string& name) const +

+

Checks if a variant with the given name exists.

+ + + + + + + + + + + + + + + + +
Parameters
nameVariant name.
ReturnsWhether the variant exists.
+
+
+

+ const Variant& cubos::core::reflection::EnumTrait::at(const std::string& name) const +

+

Gets the variant with the specified name.

+ + + + + + + + + + + + + + + + +
Parameters
nameVariant name.
ReturnsReference.
+ +
+
+

+ const Variant& cubos::core::reflection::EnumTrait::variant(const void* value) const +

+

Gets the variant associated with the given value.

+ + + + + + + + + + + + + + + + +
Parameters
valuePointer to the value for which to retrieve the variant.
ReturnsReference.
+
+
+

+ Iterator cubos::core::reflection::EnumTrait::begin() const +

+

Gets an iterator to the first variant of the type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ std::size_t cubos::core::reflection::EnumTrait::size() const +

+

Returns how many enum variants there are in the trait.

+ + + + + + + +
ReturnsVariant count.
+
+
+

+ bool cubos::core::reflection::EnumTrait::test(const void* value) const +

+

Tests if the given value matches the variant.

+ + + + + + + + + + + + + + + + +
Parameters
valuePointer to value.
ReturnsWhether the value matches the variant.
+
+
+

+ void cubos::core::reflection::EnumTrait::set(void* value) const +

+

Sets the value of the variant.

+ + + + + + + + + + +
Parameters
valuePointer to value.
+
+
+

+ const std::string& cubos::core::reflection::EnumTrait::name() const +

+

Gets the name of the variant.

+ + + + + + + +
ReturnsVariant name.
+
+
+

+ const Variant* cubos::core::reflection::EnumTrait::next() const +

+

Returns the next variant in the linked list.

+ + + + + + + +
ReturnsPointer to next variant or null if this is the last variant.
+
+
+

+ Iterator& cubos::core::reflection::EnumTrait::operator=(const Iterator&) defaulted +

+

Copy assigns.

+ + + + + + + +
ReturnsThis.
+
+
+

+ bool cubos::core::reflection::EnumTrait::operator==(const Iterator&) const defaulted +

+

Compares with another iterator.

+ + + + + + + +
ReturnsWhether both point to the same variant.
+
+
+

+ const Variant& cubos::core::reflection::EnumTrait::operator*() const +

+

Accesses the variant referenced by this iterator.

+ + + + + + + +
ReturnsReference to the variant.
+ +
+
+

+ const Variant* cubos::core::reflection::EnumTrait::operator->() const +

+

Accesses the variant referenced by this iterator.

+ + + + + + + +
ReturnsPointer to the variant.
+ +
+
+

+ Iterator& cubos::core::reflection::EnumTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait.html new file mode 100644 index 0000000000..d4f55201be --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait.html @@ -0,0 +1,1225 @@ + + + + + cubos::core::reflection::FieldsTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::FieldsTrait class + +

+

Describes the fields of a reflected type.

+ + +
+

Public types

+
+
+
template<typename O, typename F>
+ class AddressOfImpl +
+
Implementation of AddressOf for a pointer to member.
+
+ struct Output +
+
Output structure for the iterator.
+
+
+
+

Public static functions

+
+
+ static auto end() -> Iterator +
+
Gets an iterator which represents the end of the field list of a type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ FieldsTrait() defaulted +
+
Constructs.
+
+ FieldsTrait(FieldsTrait&& other) noexcept +
+
Move constructs.
+
+ Field(const Type& type, + std::string name, + AddressOf* addressOf) +
+
Constructs using the given address of getter. Will be deleted using delete and thus must be allocated using new.
+
+ Iterator(const Field* field) +
+
Constructs.
+
+ Iterator(const Iterator& iterator) defaulted +
+
Copy constructs.
+
+ View(const FieldsTrait& trait, + void* instance) +
+
Constructs.
+
+ ConstView(const FieldsTrait& trait, + const void* instance) +
+
Constructs.
+
+ Iterator(const View& view, + const Field* field) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+ Iterator(const ConstView& view, + const Field* field) +
+
Constructs.
+
+ Iterator(const Iterator& other) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ void addField(const Type& type, + std::string name, + AddressOf* addressOf) +
+
Adds a field to the type. The getter will be deleted using delete and thus must be allocated using new.
+
+ auto withField(const Type& type, + std::string name, + AddressOf* addressOf) && -> FieldsTrait&& +
+
Adds a field to the type. The getter will be deleted using delete and thus must be allocated using new.
+
+
template<typename O, typename F>
+ void addField(std::string name, + F O::* pointer) +
+
Adds a field to the type.
+
+
template<typename O, typename F>
+ auto withField(std::string name, + F O::* pointer) && -> FieldsTrait&& +
+
Adds a field to the type.
+
+ auto field(const std::string& name) const -> const Field* +
+
Gets the field with the given name.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first field of the type.
+
+ auto size() const -> std::size_t +
+
Returns how many fields there are in the trait.
+
+ auto view(void* instance) const -> View +
+
Returns a view of the given object instance.
+
+ auto view(const void* instance) const -> ConstView +
+
Returns a view of the given object instance.
+
+ auto get(const void* instance) const -> uintptr_t pure virtual +
+
Gets the address of the field on a given instance.
+
+ auto type() const -> const Type& +
+
Returns the type of the field.
+
+ auto name() const -> const std::string& +
+
Returns the name of the field.
+
+ auto next() const -> const Field* +
+
Returns the next field in the linked list.
+
+ auto operator*() const -> const Field& +
+
Accesses the field referenced by this iterator.
+
+ auto operator->() const -> const Field* +
+
Accesses the field referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto get(const Field& field) const -> void* +
+
Gets a pointer to the value of the given field on the object.
+
+ auto get(const std::string& name) const -> void* +
+
Gets a pointer to the value of the field with the given name on the object.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first field.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the field after the last field.
+
+ auto get(const Field& field) const -> const void* +
+
Gets a pointer to the value of the given field on the object.
+
+ auto get(const std::string& name) const -> const void* +
+
Gets a pointer to the value of the field with the given name on the object.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first field.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the field after the last field.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator!=(const Iterator&) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Output& +
+
Accesses the field referenced by this iterator.
+
+ auto operator->() const -> const Output* +
+
Accesses the field referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator==(const Iterator& other) const -> bool +
+
Compares two iterators.
+
+ auto operator!=(const Iterator&) const -> bool +
+
Compares two iterators.
+
+ auto operator*() const -> const Output& +
+
Accesses the field referenced by this iterator.
+
+ auto operator->() const -> const Output* +
+
Accesses the field referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+
+
+

Function documentation

+
+

+ static Iterator cubos::core::reflection::FieldsTrait::end() +

+

Gets an iterator which represents the end of the field list of a type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ cubos::core::reflection::FieldsTrait::FieldsTrait(FieldsTrait&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther trait.
+
+
+

+ cubos::core::reflection::FieldsTrait::Field(const Type& type, + std::string name, + AddressOf* addressOf) +

+

Constructs using the given address of getter. Will be deleted using delete and thus must be allocated using new.

+ + + + + + + + + + + + + + + + + + +
Parameters
typeField type.
nameField name.
addressOfGetter for the address of the field on a given instance.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const Field* field) +

+

Constructs.

+ + + + + + + + + + +
Parameters
fieldField.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const Iterator& iterator) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+
+
+

+ cubos::core::reflection::FieldsTrait::View(const FieldsTrait& trait, + void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::FieldsTrait::ConstView(const FieldsTrait& trait, + const void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const View& view, + const Field* field) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
viewView.
fieldField.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const ConstView& view, + const Field* field) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
viewView.
fieldField.
+
+
+

+ cubos::core::reflection::FieldsTrait::Iterator(const Iterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ void cubos::core::reflection::FieldsTrait::addField(const Type& type, + std::string name, + AddressOf* addressOf) +

+

Adds a field to the type. The getter will be deleted using delete and thus must be allocated using new.

+ + + + + + + + + + + + + + + + + + +
Parameters
typeField type.
nameField name.
addressOfGetter for the address of the field on a given instance.
+
+
+

+ FieldsTrait&& cubos::core::reflection::FieldsTrait::withField(const Type& type, + std::string name, + AddressOf* addressOf) && +

+

Adds a field to the type. The getter will be deleted using delete and thus must be allocated using new.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeField type.
nameField name.
addressOfGetter for the address of the field on a given instance.
ReturnsTrait.
+
+
+

+
+ template<typename O, typename F> +
+ void cubos::core::reflection::FieldsTrait::addField(std::string name, + F O::* pointer) +

+

Adds a field to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
OObject type.
FField type.
Parameters
nameField name.
pointerField pointer.
+
+
+

+
+ template<typename O, typename F> +
+ FieldsTrait&& cubos::core::reflection::FieldsTrait::withField(std::string name, + F O::* pointer) && +

+

Adds a field to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
OObject type.
FField type.
Parameters
nameField name.
pointerField pointer.
ReturnsTrait.
+
+
+

+ const Field* cubos::core::reflection::FieldsTrait::field(const std::string& name) const +

+

Gets the field with the given name.

+ + + + + + + + + + + + + + + + +
Parameters
nameField name.
ReturnsField with the given name, or null if no such field exists.
+
+
+

+ Iterator cubos::core::reflection::FieldsTrait::begin() const +

+

Gets an iterator to the first field of the type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ std::size_t cubos::core::reflection::FieldsTrait::size() const +

+

Returns how many fields there are in the trait.

+ + + + + + + +
ReturnsField count.
+
+
+

+ View cubos::core::reflection::FieldsTrait::view(void* instance) const +

+

Returns a view of the given object instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceObject instance.
ReturnsObject view.
+
+
+

+ ConstView cubos::core::reflection::FieldsTrait::view(const void* instance) const +

+

Returns a view of the given object instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceObject instance.
ReturnsObject view.
+
+
+

+ uintptr_t cubos::core::reflection::FieldsTrait::get(const void* instance) const pure virtual +

+

Gets the address of the field on a given instance.

+ + + + + + + + + + + + + + + + +
Parameters
instancePointer to the instance.
ReturnsAddress of the field on the given instance.
+
+
+

+ const Type& cubos::core::reflection::FieldsTrait::type() const +

+

Returns the type of the field.

+ + + + + + + +
ReturnsType of the field.
+
+
+

+ const std::string& cubos::core::reflection::FieldsTrait::name() const +

+

Returns the name of the field.

+ + + + + + + +
ReturnsName of the field.
+
+
+

+ const Field* cubos::core::reflection::FieldsTrait::next() const +

+

Returns the next field in the linked list.

+ + + + + + + +
ReturnsPointer to next field or null if this is the last field.
+
+
+

+ const Field& cubos::core::reflection::FieldsTrait::operator*() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsReference to the field.
+ +
+
+

+ const Field* cubos::core::reflection::FieldsTrait::operator->() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsPointer to the field.
+ +
+
+

+ Iterator& cubos::core::reflection::FieldsTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ void* cubos::core::reflection::FieldsTrait::get(const Field& field) const +

+

Gets a pointer to the value of the given field on the object.

+ + + + + + + + + + + + + + + + +
Parameters
fieldField.
ReturnsField value.
+
+
+

+ void* cubos::core::reflection::FieldsTrait::get(const std::string& name) const +

+

Gets a pointer to the value of the field with the given name on the object.

+ + + + + + + + + + + + + + + + +
Parameters
nameField name.
ReturnsField value.
+ +
+
+

+ Iterator cubos::core::reflection::FieldsTrait::begin() const +

+

Gets an iterator to the first field.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::FieldsTrait::end() const +

+

Gets an iterator to the field after the last field.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ const void* cubos::core::reflection::FieldsTrait::get(const Field& field) const +

+

Gets a pointer to the value of the given field on the object.

+ + + + + + + + + + + + + + + + +
Parameters
fieldField.
ReturnsField value.
+
+
+

+ const void* cubos::core::reflection::FieldsTrait::get(const std::string& name) const +

+

Gets a pointer to the value of the field with the given name on the object.

+ + + + + + + + + + + + + + + + +
Parameters
nameField name.
ReturnsField value.
+ +
+
+

+ Iterator cubos::core::reflection::FieldsTrait::begin() const +

+

Gets an iterator to the first field.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::FieldsTrait::end() const +

+

Gets an iterator to the field after the last field.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::reflection::FieldsTrait::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same field.
+
+
+

+ bool cubos::core::reflection::FieldsTrait::operator!=(const Iterator&) const +

+

Compares two iterators.

+ + + + + + + +
ReturnsWhether the iterators point to different fields.
+
+
+

+ const Output& cubos::core::reflection::FieldsTrait::operator*() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ const Output* cubos::core::reflection::FieldsTrait::operator->() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ Iterator& cubos::core::reflection::FieldsTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::reflection::FieldsTrait::operator==(const Iterator& other) const +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same field.
+
+
+

+ bool cubos::core::reflection::FieldsTrait::operator!=(const Iterator&) const +

+

Compares two iterators.

+ + + + + + + +
ReturnsWhether the iterators point to different fields.
+
+
+

+ const Output& cubos::core::reflection::FieldsTrait::operator*() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ const Output* cubos::core::reflection::FieldsTrait::operator->() const +

+

Accesses the field referenced by this iterator.

+ + + + + + + +
ReturnsOutput.
+ +
+
+

+ Iterator& cubos::core::reflection::FieldsTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1AddressOfImpl.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1AddressOfImpl.html new file mode 100644 index 0000000000..03dfddedff --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1AddressOfImpl.html @@ -0,0 +1,162 @@ + + + + + cubos::core::reflection::FieldsTrait::AddressOfImpl class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename O, typename F>
+ cubos::core::reflection::FieldsTrait::AddressOfImpl class +

+

Implementation of AddressOf for a pointer to member.

+ + + + + + + + + + + + + + +
Template parameters
OObject type.
FField type.
+ +
+

Constructors, destructors, conversion operators

+
+
+ AddressOfImpl(F O::* pointer) +
+
Constructs.
+
+
+
+

Function documentation

+
+

+
+ template<typename O, typename F> +
+ cubos::core::reflection::FieldsTrait::AddressOfImpl<O, F>::AddressOfImpl(F O::* pointer) +

+

Constructs.

+ + + + + + + + + + +
Parameters
pointerPointer to member.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1InheritsTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1InheritsTrait.html new file mode 100644 index 0000000000..800ce2af23 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1InheritsTrait.html @@ -0,0 +1,219 @@ + + + + + cubos::core::reflection::InheritsTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::InheritsTrait class + +

+

Provides inheritance relationship between types.

+ + +
+

Public static functions

+
+
+
template<typename T>
+ static auto from() -> InheritsTrait +
+
Adds an inheritance relationship to the type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ InheritsTrait(const Type& type) +
+
Constructs.
+
+
+
+

Public functions

+
+
+
template<typename T>
+ auto inherits() const -> bool +
+
Checks if the type inherits from the specified parent type.
+
+ auto base() const -> const Type& +
+
Gets the base type of the inherited type.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ static InheritsTrait cubos::core::reflection::InheritsTrait::from() +

+

Adds an inheritance relationship to the type.

+ + + + + + + + + + + + + + + + +
Template parameters
TThe parent type from which this type inherits.
ReturnsTrait.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::reflection::InheritsTrait::inherits() const +

+

Checks if the type inherits from the specified parent type.

+ + + + + + + + + + + + + + + + +
Template parameters
TThe parent type to check for inheritance.
ReturnsWhether type inherits from the specified parent type, false otherwise.
+
+
+

+ const Type& cubos::core::reflection::InheritsTrait::base() const +

+

Gets the base type of the inherited type.

+ + + + + + + +
ReturnsType.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1MaskTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1MaskTrait.html new file mode 100644 index 0000000000..c87af4deb4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1MaskTrait.html @@ -0,0 +1,1199 @@ + + + + + cubos::core::reflection::MaskTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::MaskTrait class + +

+

Provides mask functionality to an enum mask type.

+ + +
+

Public types

+
+
+ using Tester = memory::Function<bool(const void*) const > +
+
Function pointer to test if a bit is set on the mask.
+
+ using Setter = memory::Function<void(void*) const > +
+
Function pointer to set the bit on the mask.
+
+ using Clearer = memory::Function<void(void*) const > +
+
Function pointer to clear the bit on the mask.
+
+
+
+

Public static functions

+
+
+ static auto end() -> Iterator +
+
Gets an iterator to the last bit of the type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ MaskTrait() defaulted +
+
Constructs.
+
+ MaskTrait(MaskTrait&& other) noexcept +
+
Move constructs.
+
+ Bit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) +
+
Constructs.
+
+ Iterator(const Bit* bit) +
+
Constructs.
+
+ Iterator(const Iterator& iterator) defaulted +
+
Copy constructs.
+
+ SetIterator(const Bit* bit, + const void* instance) +
+
Constructs.
+
+ SetIterator(const SetIterator& other) defaulted +
+
Copy constructs.
+
+ View(const MaskTrait& trait, + void* instance) +
+
Constructs.
+
+ ConstView(const MaskTrait& trait, + const void* instance) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ void addBit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) +
+
Adds a bit to the type.
+
+ auto withBit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) && -> MaskTrait&& +
+
Adds a bit to the type.
+
+
template<auto B>
+ auto withBit(std::string name) && -> MaskTrait&& +
+
Adds a bit to the type.
+
+ auto contains(const std::string& name) const -> bool +
+
Checks if a bit with the given name exists.
+
+ auto at(const std::string& name) const -> const Bit& +
+
Gets the bit with the specified name.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the first bit of the type.
+
+ auto size() const -> std::size_t +
+
Returns how many bits there are in the trait.
+
+ auto view(void* instance) const -> View +
+
Returns a view of the given mask instance.
+
+ auto view(const void* instance) const -> ConstView +
+
Returns a view of the given mask instance.
+
+ auto test(const void* value) const -> bool +
+
Tests if the given value has the bit set.
+
+ void set(void* value) const +
+
Sets the bit on the given value.
+
+ void clear(void* value) const +
+
Clears the bit on the given value.
+
+ auto name() const -> const std::string& +
+
Gets the name of the bit.
+
+ auto next() const -> const Bit* +
+
Returns the next bit in the linked list.
+
+ auto operator=(const Iterator&) -> Iterator& defaulted +
+
Copy assigns.
+
+ auto operator==(const Iterator&) const -> bool defaulted +
+
Compares with another iterator.
+
+ auto operator*() const -> const Bit& +
+
Accesses the bit referenced by this iterator.
+
+ auto operator->() const -> const Bit* +
+
Accesses the bit referenced by this iterator.
+
+ auto operator++() -> Iterator& +
+
Advances the iterator.
+
+ auto operator==(const SetIterator& other) const -> bool defaulted +
+
Compares two iterators.
+
+ auto operator*() const -> const Bit& +
+
Accesses the bit referenced by this iterator.
+
+ auto operator->() const -> const Bit* +
+
Accesses the bit referenced by this iterator.
+
+ auto operator++() -> SetIterator& +
+
Advances the iterator.
+
+ auto test(const Bit& bit) const -> bool +
+
Checks if the given bit is set on the mask.
+
+ auto test(const std::string& name) const -> bool +
+
Checks if the given bit is set on the mask.
+
+ void set(const Bit& bit) const +
+
Sets the given bit on the mask.
+
+ void set(const std::string& name) const +
+
Sets the given bit on the mask.
+
+ void clear(const Bit& bit) const +
+
Clears the given bit on the mask.
+
+ void clear(const std::string& name) const +
+
Clears the given bit on the mask.
+
+ auto begin() const -> SetIterator +
+
Gets an iterator to the first set bit.
+
+ auto end() const -> SetIterator +
+
Gets an iterator representing the end of the set bits.
+
+ auto test(const Bit& bit) const -> bool +
+
Checks if the given bit is set on the mask.
+
+ auto test(const std::string& name) const -> bool +
+
Checks if the given bit is set on the mask.
+
+ auto begin() const -> SetIterator +
+
Gets an iterator to the first set bit.
+
+ auto end() const -> SetIterator +
+
Gets an iterator representing the end of the set bits.
+
+
+
+

Function documentation

+
+

+ static Iterator cubos::core::reflection::MaskTrait::end() +

+

Gets an iterator to the last bit of the type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ cubos::core::reflection::MaskTrait::MaskTrait(MaskTrait&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther trait.
+
+
+

+ cubos::core::reflection::MaskTrait::Bit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameName.
testerFunction to test if a bit is set on the mask.
setterFunction to set a bit on the mask.
clearerFunction to clear a bit on the mask.
+
+
+

+ cubos::core::reflection::MaskTrait::Iterator(const Bit* bit) +

+

Constructs.

+ + + + + + + + + + +
Parameters
bitBit.
+
+
+

+ cubos::core::reflection::MaskTrait::Iterator(const Iterator& iterator) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
iteratorIterator.
+
+
+

+ cubos::core::reflection::MaskTrait::SetIterator(const Bit* bit, + const void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
bitBit to start from.
instanceMask instance.
+
+
+

+ cubos::core::reflection::MaskTrait::SetIterator(const SetIterator& other) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther iterator.
+
+
+

+ cubos::core::reflection::MaskTrait::View(const MaskTrait& trait, + void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ cubos::core::reflection::MaskTrait::ConstView(const MaskTrait& trait, + const void* instance) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
traitTrait.
instanceInstance.
+
+
+

+ void cubos::core::reflection::MaskTrait::addBit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) +

+

Adds a bit to the type.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameBit name.
testerFunction to test if a bit is set on the mask.
setterFunction to set a bit on the mask.
clearerFunction to clear a bit on the mask.
+
+
+

+ MaskTrait&& cubos::core::reflection::MaskTrait::withBit(std::string name, + Tester tester, + Setter setter, + Clearer clearer) && +

+

Adds a bit to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameBit name.
testerFunction to test if a bit is set on the mask.
setterFunction to set a bit on the mask.
clearerFunction to clear a bit on the mask.
ReturnsTrait.
+
+
+

+
+ template<auto B> +
+ MaskTrait&& cubos::core::reflection::MaskTrait::withBit(std::string name) && +

+

Adds a bit to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
BBit value.
Parameters
nameBit name.
ReturnsTrait.
+

The bit type must implement at least the operators '&', '|' and '~'.

+
+
+

+ bool cubos::core::reflection::MaskTrait::contains(const std::string& name) const +

+

Checks if a bit with the given name exists.

+ + + + + + + + + + + + + + + + +
Parameters
nameBit name.
ReturnsWhether the bit exists.
+
+
+

+ const Bit& cubos::core::reflection::MaskTrait::at(const std::string& name) const +

+

Gets the bit with the specified name.

+ + + + + + + + + + + + + + + + +
Parameters
nameBit name.
ReturnsReference.
+ +
+
+

+ Iterator cubos::core::reflection::MaskTrait::begin() const +

+

Gets an iterator to the first bit of the type.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ std::size_t cubos::core::reflection::MaskTrait::size() const +

+

Returns how many bits there are in the trait.

+ + + + + + + +
ReturnsBit count.
+
+
+

+ View cubos::core::reflection::MaskTrait::view(void* instance) const +

+

Returns a view of the given mask instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceMask instance.
ReturnsMask view.
+
+
+

+ ConstView cubos::core::reflection::MaskTrait::view(const void* instance) const +

+

Returns a view of the given mask instance.

+ + + + + + + + + + + + + + + + +
Parameters
instanceMask instance.
ReturnsMask view.
+
+
+

+ bool cubos::core::reflection::MaskTrait::test(const void* value) const +

+

Tests if the given value has the bit set.

+ + + + + + + + + + + + + + + + +
Parameters
valuePointer to value.
ReturnsWhether the value has the bit set.
+
+
+

+ void cubos::core::reflection::MaskTrait::set(void* value) const +

+

Sets the bit on the given value.

+ + + + + + + + + + +
Parameters
valuePointer to value.
+
+
+

+ void cubos::core::reflection::MaskTrait::clear(void* value) const +

+

Clears the bit on the given value.

+ + + + + + + + + + +
Parameters
valuePointer to value.
+
+
+

+ const std::string& cubos::core::reflection::MaskTrait::name() const +

+

Gets the name of the bit.

+ + + + + + + +
ReturnsBit name.
+
+
+

+ const Bit* cubos::core::reflection::MaskTrait::next() const +

+

Returns the next bit in the linked list.

+ + + + + + + +
ReturnsPointer to next bit or null if this is the last bit.
+
+
+

+ Iterator& cubos::core::reflection::MaskTrait::operator=(const Iterator&) defaulted +

+

Copy assigns.

+ + + + + + + +
ReturnsThis.
+
+
+

+ bool cubos::core::reflection::MaskTrait::operator==(const Iterator&) const defaulted +

+

Compares with another iterator.

+ + + + + + + +
ReturnsWhether both point to the same variant.
+
+
+

+ const Bit& cubos::core::reflection::MaskTrait::operator*() const +

+

Accesses the bit referenced by this iterator.

+ + + + + + + +
ReturnsReference to the bit.
+ +
+
+

+ const Bit* cubos::core::reflection::MaskTrait::operator->() const +

+

Accesses the bit referenced by this iterator.

+ + + + + + + +
ReturnsPointer to the bit.
+ +
+
+

+ Iterator& cubos::core::reflection::MaskTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::reflection::MaskTrait::operator==(const SetIterator& other) const defaulted +

+

Compares two iterators.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther iterator.
ReturnsWhether the iterators point to the same bit.
+
+
+

+ const Bit& cubos::core::reflection::MaskTrait::operator*() const +

+

Accesses the bit referenced by this iterator.

+ + + + + + + +
ReturnsBit.
+ +
+
+

+ const Bit* cubos::core::reflection::MaskTrait::operator->() const +

+

Accesses the bit referenced by this iterator.

+ + + + + + + +
ReturnsBit.
+ +
+
+

+ SetIterator& cubos::core::reflection::MaskTrait::operator++() +

+

Advances the iterator.

+ + + + + + + +
ReturnsReference to this.
+ +
+
+

+ bool cubos::core::reflection::MaskTrait::test(const Bit& bit) const +

+

Checks if the given bit is set on the mask.

+ + + + + + + + + + + + + + + + +
Parameters
bitBit.
ReturnsWhether the bit is set.
+
+
+

+ bool cubos::core::reflection::MaskTrait::test(const std::string& name) const +

+

Checks if the given bit is set on the mask.

+ + + + + + + + + + + + + + + + +
Parameters
nameBit name.
ReturnsWhether the bit is set.
+

Aborts if the bit does not exist.

+
+
+

+ void cubos::core::reflection::MaskTrait::set(const Bit& bit) const +

+

Sets the given bit on the mask.

+ + + + + + + + + + +
Parameters
bitBit.
+
+
+

+ void cubos::core::reflection::MaskTrait::set(const std::string& name) const +

+

Sets the given bit on the mask.

+ + + + + + + + + + +
Parameters
nameBit name.
+

Aborts if the bit does not exist.

+
+
+

+ void cubos::core::reflection::MaskTrait::clear(const Bit& bit) const +

+

Clears the given bit on the mask.

+ + + + + + + + + + +
Parameters
bitBit.
+
+
+

+ void cubos::core::reflection::MaskTrait::clear(const std::string& name) const +

+

Clears the given bit on the mask.

+ + + + + + + + + + +
Parameters
nameBit name.
+

Aborts if the bit does not exist.

+
+
+

+ SetIterator cubos::core::reflection::MaskTrait::begin() const +

+

Gets an iterator to the first set bit.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ SetIterator cubos::core::reflection::MaskTrait::end() const +

+

Gets an iterator representing the end of the set bits.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::core::reflection::MaskTrait::test(const Bit& bit) const +

+

Checks if the given bit is set on the mask.

+ + + + + + + + + + + + + + + + +
Parameters
bitBit.
ReturnsWhether the bit is set.
+
+
+

+ bool cubos::core::reflection::MaskTrait::test(const std::string& name) const +

+

Checks if the given bit is set on the mask.

+ + + + + + + + + + + + + + + + +
Parameters
nameBit name.
ReturnsWhether the bit is set.
+

Aborts if the bit does not exist.

+
+
+

+ SetIterator cubos::core::reflection::MaskTrait::begin() const +

+

Gets an iterator to the first set bit.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ SetIterator cubos::core::reflection::MaskTrait::end() const +

+

Gets an iterator representing the end of the set bits.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1NullableTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1NullableTrait.html new file mode 100644 index 0000000000..b5b267c4f0 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1NullableTrait.html @@ -0,0 +1,218 @@ + + + + + cubos::core::reflection::NullableTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::NullableTrait class + +

+

Used to manipulate values of null-representable types.

+ + +
+

Public types

+
+
+ using IsNull = memory::Function<bool(const void*) const > +
+
Function pointer to check if a value represents null.
+
+ using SetToNull = memory::Function<void(void*) const > +
+
Function pointer to set a value to its null representation.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ NullableTrait(IsNull isNull, + SetToNull setToNull) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto isNull(const void* instance) const -> bool +
+
Checks if the given value represents null.
+
+ void setToNull(void* instance) const +
+
Sets a value to its null representation.
+
+
+
+

Function documentation

+
+

+ cubos::core::reflection::NullableTrait::NullableTrait(IsNull isNull, + SetToNull setToNull) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
isNullIsNull.
setToNullSetToNull.
+
+
+

+ bool cubos::core::reflection::NullableTrait::isNull(const void* instance) const +

+

Checks if the given value represents null.

+ + + + + + + + + + + + + + + + +
Parameters
instanceInstance.
ReturnsWhether the value represents null.
+
+
+

+ void cubos::core::reflection::NullableTrait::setToNull(void* instance) const +

+

Sets a value to its null representation.

+ + + + + + + + + + +
Parameters
instanceInstance.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1StringConversionTrait.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1StringConversionTrait.html new file mode 100644 index 0000000000..7353a4dea4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1StringConversionTrait.html @@ -0,0 +1,230 @@ + + + + + cubos::core::reflection::StringConversionTrait class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::StringConversionTrait class + +

+

Stores functions for converting a type to and from a string.

+ + +
+

Public types

+
+
+ using Into = std::string(*)(const void*instance) +
+
Function pointer to convert an instance of the type into a string.
+
+ using From = bool(*)(void*instance, const std::string&string) +
+
Function pointer to convert a string into an instance of the type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ StringConversionTrait(Into into, + From from) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto into(const void* instance) const -> std::string +
+
Converts an instance of the type into a string.
+
+ auto from(void* instance, + const std::string& string) const -> bool +
+
Converts a string to an instance of the type.
+
+
+
+

Function documentation

+
+

+ cubos::core::reflection::StringConversionTrait::StringConversionTrait(Into into, + From from) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
intoInto.
fromFrom.
+
+
+

+ std::string cubos::core::reflection::StringConversionTrait::into(const void* instance) const +

+

Converts an instance of the type into a string.

+ + + + + + + + + + + + + + + + +
Parameters
instanceInstance.
ReturnsString.
+
+
+

+ bool cubos::core::reflection::StringConversionTrait::from(void* instance, + const std::string& string) const +

+

Converts a string to an instance of the type.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
instanceInstance.
stringString.
ReturnsWhether the string was valid.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1Type.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1Type.html new file mode 100644 index 0000000000..cb24a53b43 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1Type.html @@ -0,0 +1,460 @@ + + + + + cubos::core::reflection::Type class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::Type class final + +

+

Describes a reflected type.

+ +

Holds the name of a type and the traits associated with it. Traits can be of any type, which means you can define your own custom traits.

+
+

Public static functions

+
+
+ static auto create(std::string name) -> Type& +
+
Constructs with a type the given name.
+
+ static void destroy(Type& type) +
+
Destroys the given type.
+
+
+
+

Public functions

+
+
+ auto name() const -> const std::string& +
+
Returns the name of the type.
+
+ auto shortName() const -> const std::string& +
+
Returns the name of the type without any namespaces.
+
+
template<typename T>
+ auto is() const -> bool +
+
Checks if this type represents the type T.
+
+
template<typename T>
+ auto with(T trait) -> Type& +
+
Adds the given trait to the type.
+
+ auto with(const Type& type, + void* trait, + void(*)(void*) deleter) -> Type& +
+
Adds the given trait to the type.
+
+
template<typename T>
+ auto has() const -> bool +
+
Returns whether the type has the given trait.
+
+ auto has(const Type& type) const -> bool +
+
Returns whether the type has the given trait.
+
+
template<typename T>
+ auto get() const -> const T& +
+
Returns the given trait of the type.
+
+ auto get(const Type& type) const -> const void* +
+
Returns the given trait of the type.
+
+ auto operator==(const Type& other) const -> bool +
+
Equality operator.
+
+
+
+

Function documentation

+
+

+ static Type& cubos::core::reflection::Type::create(std::string name) +

+

Constructs with a type the given name.

+ + + + + + + + + + + + + + + + +
Parameters
nameName of the type.
ReturnsReference to the type.
+
+
+

+ static void cubos::core::reflection::Type::destroy(Type& type) +

+

Destroys the given type.

+ + + + + + + + + + +
Parameters
typeType to destroy.
+
+
+

+ const std::string& cubos::core::reflection::Type::name() const +

+

Returns the name of the type.

+ + + + + + + +
ReturnsName of the type.
+
+
+

+ const std::string& cubos::core::reflection::Type::shortName() const +

+

Returns the name of the type without any namespaces.

+ + + + + + + +
ReturnsName of the type without any namespaces.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::reflection::Type::is() const +

+

Checks if this type represents the type T.

+ + + + + + + + + + + + + + + + +
Template parameters
TType to check.
ReturnsWhether this type represents the type T.
+
+
+

+
+ template<typename T> +
+ Type& cubos::core::reflection::Type::with(T trait) +

+

Adds the given trait to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TTrait type.
Parameters
traitTrait value.
ReturnsReference to this type, for chaining.
+

Aborts if the trait is already present in the type.

+
+
+

+ Type& cubos::core::reflection::Type::with(const Type& type, + void* trait, + void(*)(void*) deleter) +

+

Adds the given trait to the type.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
type
traitAllocated trait value.
deleterUsed to delete the trait when the type is destroyed.
ReturnsReference to this type, for chaining.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::reflection::Type::has() const +

+

Returns whether the type has the given trait.

+ + + + + + + + + + + + + + + + +
Template parameters
TTrait type.
ReturnsWhether the type has the given trait.
+
+
+

+ bool cubos::core::reflection::Type::has(const Type& type) const +

+

Returns whether the type has the given trait.

+ + + + + + + +
ReturnsWhether the type has the given trait.
+
+
+

+
+ template<typename T> +
+ const T& cubos::core::reflection::Type::get() const +

+

Returns the given trait of the type.

+ + + + + + + + + + + + + + + + +
Template parameters
TTrait type.
ReturnsReference to the trait.
+

Aborts if the type does not have the given trait.

+
+
+

+ const void* cubos::core::reflection::Type::get(const Type& type) const +

+

Returns the given trait of the type.

+ + + + + + + + + + + + + + + + +
Parameters
typeTrait type.
ReturnsPointer to the trait.
+

Aborts if the type does not have the given trait.

+
+
+

+ bool cubos::core::reflection::Type::operator==(const Type& other) const +

+

Equality operator.

+ + + + + + + + + + + + + + + + +
Parameters
otherType object to compare.
ReturnsWhether the objects have the same address, which indicates equality.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeClient.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeClient.html new file mode 100644 index 0000000000..3fe0665efa --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeClient.html @@ -0,0 +1,307 @@ + + + + + cubos::core::reflection::TypeClient class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::TypeClient class final + +

+

Manages the client-side of a reflection channel on top of a stream.

+ +

This class allows the client to receive type information of types unknown by the client from the server. It also makes it possible to then receive and send values of these types.

Received types can be either structured or non-structured. Only values of structured types can be communicated between the client and the server. For a type to be structured, it must have a structural trait, so that the client can create new instances of the type.

Structural traits are traits which define the memory layout of a type. A structural trait should add the TypeClient::RemoteTrait trait to the type. This trait is then used by this class to create a ConstructibleTrait for the type.

See TypeServer for more information on the protocol.

+
+

Public types

+
+
+ using Deserialize = memory::Function<bool(const TypeRegistry&, Type&, data::Deserializer&) const > +
+
Function type for deserializing traits.
+
+ using DiscoverTypes = void(*)(const Type&, memory::Function<void(const Type&) const >&) +
+
Function type for discovering new types from a trait.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ TypeClient() +
+
Default constructor.
+
+
+
+

Public functions

+
+
+ void addTrait(bool isStructural, + const Type& traitType, + Deserialize deserialize, + DiscoverTypes discoverTypes) +
+
Registers a trait to be supported by the channel.
+
+
template<typename T>
+ void addTrait(bool isStructural, + Deserialize deserialize, + DiscoverTypes discoverTypes) +
+
Registers a trait to be supported by the channel.
+
+ void addType(const Type& type) +
+
Adds a known type to the channel.
+
+
template<typename T>
+ void addType() +
+
Adds a known type to the channel.
+
+ auto connect(memory::Stream& stream) const -> memory::Opt<Connection> +
+
Connects to a server, using the given stream.
+
+
+
+

Function documentation

+
+

+ void cubos::core::reflection::TypeClient::addTrait(bool isStructural, + const Type& traitType, + Deserialize deserialize, + DiscoverTypes discoverTypes) +

+

Registers a trait to be supported by the channel.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
isStructuralWhether the trait is a structural trait.
traitTypeTrait type to be registered.
deserializeFunction to deserialize the trait.
discoverTypesFunction to discover new types from the trait.
+
+
+

+
+ template<typename T> +
+ void cubos::core::reflection::TypeClient::addTrait(bool isStructural, + Deserialize deserialize, + DiscoverTypes discoverTypes) +

+

Registers a trait to be supported by the channel.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TTrait type.
Parameters
isStructuralWhether the trait is a structural trait.
deserializeFunction to deserialize the trait.
discoverTypesFunction to discover new types from the trait.
+
+
+

+ void cubos::core::reflection::TypeClient::addType(const Type& type) +

+

Adds a known type to the channel.

+ + + + + + + + + + +
Parameters
typeType.
+

This allows the channel to reuse the given type instead of creating a new runtime type when connecting to a server.

+
+
+

+
+ template<typename T> +
+ void cubos::core::reflection::TypeClient::addType() +

+

Adds a known type to the channel.

+ + + + + + + + + + +
Template parameters
TType.
+

This allows the channel to reuse the given type instead of creating a new runtime type when connecting to a server.

+
+
+

+ memory::Opt<Connection> cubos::core::reflection::TypeClient::connect(memory::Stream& stream) const +

+

Connects to a server, using the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream.
ReturnsConnection information, or nothing if the connection failed.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeRegistry.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeRegistry.html new file mode 100644 index 0000000000..5bf5eaee39 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeRegistry.html @@ -0,0 +1,351 @@ + + + + + cubos::core::reflection::TypeRegistry class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::TypeRegistry class final + +

+

Stores a set of types which can be accessed by name.

+ +
+

Public functions

+
+
+ void insert(const Type& type) +
+
Registers the given type.
+
+ void insert(const TypeRegistry& other) +
+
Calls insert for each type in the given type registry.
+
+
template<typename T>
+ void insert() +
+
Registers the given type.
+
+ auto contains(const Type& type) const -> bool +
+
Checks if the given type is registered.
+
+
template<typename T>
+ auto contains() const -> bool +
+
+
+ auto contains(const std::string& name) const -> bool +
+
Checks if a type with the given name is registered.
+
+ auto at(const std::string& name) const -> const Type& +
+
Returns the type with the given name.
+
+ auto size() const -> std::size_t +
+
Returns the number of registered types.
+
+ auto begin() const -> Iterator +
+
Gets an iterator to the beginning of the registry.
+
+ auto end() const -> Iterator +
+
Gets an iterator to the end of the registry.
+
+
+
+

Function documentation

+
+

+ void cubos::core::reflection::TypeRegistry::insert(const Type& type) +

+

Registers the given type.

+ + + + + + + + + + +
Parameters
typeType to register.
+

Does nothing if the type is already registered. Aborts if a different type with the same name is already registered.

+
+
+

+ void cubos::core::reflection::TypeRegistry::insert(const TypeRegistry& other) +

+

Calls insert for each type in the given type registry.

+ + + + + + + + + + +
Parameters
otherType registry to copy types from.
+
+
+

+
+ template<typename T> +
+ void cubos::core::reflection::TypeRegistry::insert() +

+

Registers the given type.

+ + + + + + + + + + +
Template parameters
TType to register.
+

Does nothing if the type is already registered. Aborts if a different type with the same name is already registered.

+
+
+

+ bool cubos::core::reflection::TypeRegistry::contains(const Type& type) const +

+

Checks if the given type is registered.

+ + + + + + + + + + + + + + + + +
Parameters
typeType to check.
ReturnsWhether the given type is registered.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::reflection::TypeRegistry::contains() const +

+ + + + + + + + + + +
Template parameters
TType to check.
+
+
+

+ bool cubos::core::reflection::TypeRegistry::contains(const std::string& name) const +

+

Checks if a type with the given name is registered.

+ + + + + + + + + + + + + + + + +
Parameters
nameName of the type.
ReturnsWhether a type with the given name is registered.
+
+
+

+ const Type& cubos::core::reflection::TypeRegistry::at(const std::string& name) const +

+

Returns the type with the given name.

+ + + + + + + + + + + + + + + + +
Parameters
nameName of the type.
ReturnsType with the given name.
+

Aborts if contains(const std::string&) returns false.

+
+
+

+ std::size_t cubos::core::reflection::TypeRegistry::size() const +

+

Returns the number of registered types.

+ + + + + + + +
ReturnsNumber of registered types.
+
+
+

+ Iterator cubos::core::reflection::TypeRegistry::begin() const +

+

Gets an iterator to the beginning of the registry.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::core::reflection::TypeRegistry::end() const +

+

Gets an iterator to the end of the registry.

+ + + + + + + +
ReturnsIterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeServer.html b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeServer.html new file mode 100644 index 0000000000..d29e766a62 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1reflection_1_1TypeServer.html @@ -0,0 +1,307 @@ + + + + + cubos::core::reflection::TypeServer class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection::TypeServer class final + +

+

Used to setup a TypeChannel on top of a stream, from the server side.

+ +

This class allows the server to send and receive values of types unknown by the client to the client. Not all types registered on the server will support this: some may not have enough information to be serialized. The set of types which can be safely serialized is returned by the connect function.

The protocol used by this class is as follows:

  1. Server receives a list of supported trait types from the client, and whether they are structural.
  2. Server receives a list of the types which the client already knows.
  3. Server sends the type information of the types which the client does not know. This includes: a) name of each type, b) structural trait of the type which is supported by the client, if any, b) non-structural traits of the type which are supported by the client, d) if the type has a structural trait and is default-constructible, the default-constructed serialized value.

If the type has multiple structural traits, the first one added to the server is used. The non-structural traits are sent in the order they were added to the server.

+
+

Public types

+
+
+ using Serialize = memory::Function<bool(data::Serializer&, const Type&, bool) const > +
+
Function type for serializing traits.
+
+ using DiscoverTypes = void(*)(const Type&, memory::Function<void(const Type&) const >&) +
+
Function type for discovering new types from a trait.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ TypeServer() +
+
Default constructs.
+
+
+
+

Public functions

+
+
+ void addTrait(const Type& traitType, + Serialize serialize, + DiscoverTypes discoverTypes) +
+
Registers a trait to be supported by the channel.
+
+
template<typename T>
+ void addTrait(Serialize serialize, + DiscoverTypes discoverTypes) +
+
Registers a trait to be supported by the channel.
+
+ void addType(const Type& type) +
+
Adds a type to be supported by the channel.
+
+
template<typename T>
+ void addType() +
+
Adds a type to be supported by the channel.
+
+ auto connect(memory::Stream& stream) -> memory::Opt<Connection> +
+
Connects to a new client, using the given stream.
+
+
+
+

Typedef documentation

+
+

+ using cubos::core::reflection::TypeServer::Serialize = memory::Function<bool(data::Serializer&, const Type&, bool) const > +

+

Function type for serializing traits.

+

Receives a serializer, the value to serialize, and whether the type is already serializable.

+
+
+
+

Function documentation

+
+

+ void cubos::core::reflection::TypeServer::addTrait(const Type& traitType, + Serialize serialize, + DiscoverTypes discoverTypes) +

+

Registers a trait to be supported by the channel.

+ + + + + + + + + + + + + + + + + + +
Parameters
traitType
serializeFunction to serialize the trait.
discoverTypesFunction to discover new types from the trait.
+ +
+
+

+
+ template<typename T> +
+ void cubos::core::reflection::TypeServer::addTrait(Serialize serialize, + DiscoverTypes discoverTypes) +

+

Registers a trait to be supported by the channel.

+ + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TTrait type.
Parameters
serializeFunction to serialize the trait.
discoverTypesFunction to discover new types from the trait.
+ +
+
+

+ void cubos::core::reflection::TypeServer::addType(const Type& type) +

+

Adds a type to be supported by the channel.

+ + + + + + + + + + +
Parameters
typeType to be supported.
+

Also adds any types used by the type, recursively. I.e., types of fields if the type has a FieldsTrait.

+
+
+

+
+ template<typename T> +
+ void cubos::core::reflection::TypeServer::addType() +

+

Adds a type to be supported by the channel.

+ + + + + + + + + + +
Template parameters
TType to be supported.
+

Also adds any types used by the type, recursively. I.e., types of fields if the type has a FieldsTrait.

+
+
+

+ memory::Opt<Connection> cubos::core::reflection::TypeServer::connect(memory::Stream& stream) +

+

Connects to a new client, using the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream.
ReturnsConnection information, or nothing if the connection failed.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Logger.html b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Logger.html new file mode 100644 index 0000000000..70189b66d9 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Logger.html @@ -0,0 +1,355 @@ + + + + + cubos::core::tel::Logger class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::Logger class final + +

+

Singleton which holds the logging state.

+ +
+

Public types

+
+
+ struct Entry +
+
Data created by a call to log.
+
+ struct Location +
+
Identifies a location in the code.
+
+ struct Timestamp +
+
A timestamp used to identify when a logging message was written.
+
+
+
+

Public static functions

+
+
+ static void level(Level level) +
+
Sets the log level.
+
+ static auto level() -> Level +
+
Gets the current log level.
+
+ static auto logToFile(const std::string& filePath) -> bool +
+
Sets a file path where logs will be saved.
+
+ static auto logToFile() -> bool +
+
Mounts a standard archive on the /logs/ directory, and calls logToFile to a timestamped log file on that directory.
+
+ static void write(Level level, + Location location, + std::string message) +
+
Creates a new entry in the logs, as long as the log level is high enough.
+
+
template<typename... TArgs>
+ static void writeFormat(Level level, + Location location, + const char* format, + TArgs... args) +
+
Wrapper for write() with message formatting.
+
+ static auto read(std::size_t& cursor, + Entry& entry) -> bool +
+
Reads a log entry, if there's a new one.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Logger() deleted +
+
Deleted constructor.
+
+
+
+

Function documentation

+
+

+ static void cubos::core::tel::Logger::level(Level level) +

+

Sets the log level.

+ + + + + + + + + + +
Parameters
levelNew logging level.
+

If CUBOS_TEL_LEVEL is higher than the set level, entries below it are still not registered.

+
+
+

+ static Level cubos::core::tel::Logger::level() +

+

Gets the current log level.

+ + + + + + + +
ReturnsLog level.
+
+
+

+ static bool cubos::core::tel::Logger::logToFile(const std::string& filePath) +

+

Sets a file path where logs will be saved.

+ + + + + + + + + + + + + + + + +
Parameters
filePathPath to file in the virtual file system.
ReturnsWhether the file could be opened for logging.
+ +
+
+

+ static bool cubos::core::tel::Logger::logToFile() +

+

Mounts a standard archive on the /logs/ directory, and calls logToFile to a timestamped log file on that directory.

+ + + + + + + +
ReturnsWhether the file could be mounted and opened for logging.
+ +
+
+

+ static void cubos::core::tel::Logger::write(Level level, + Location location, + std::string message) +

+

Creates a new entry in the logs, as long as the log level is high enough.

+ + + + + + + + + + + + + + + + + + +
Parameters
levelLog level.
locationCode location.
messageLog message.
+
+
+

+
+ template<typename... TArgs> +
+ static void cubos::core::tel::Logger::writeFormat(Level level, + Location location, + const char* format, + TArgs... args) +

+

Wrapper for write() with message formatting.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TArgsMessage format argument types.
Parameters
levelLog level.
locationCode location.
formatMessage format string.
argsMessage format arguments.
+
+
+

+ static bool cubos::core::tel::Logger::read(std::size_t& cursor, + Entry& entry) +

+

Reads a log entry, if there's a new one.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
cursor outIndex of the entry to be read. Automatically increased.
entry outEntry to read into.
ReturnsWhether an entry was red.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Metrics.html b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Metrics.html new file mode 100644 index 0000000000..6cd6485fe2 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1Metrics.html @@ -0,0 +1,301 @@ + + + + + cubos::core::tel::Metrics class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::Metrics class + +

+

Singleton class that manages a collection of metrics.

+ +
+

Public static functions

+
+
+ static void metric(const std::string& name, + double metric) +
+
Add a metric in the pool.
+
+ static auto size() -> std::size_t +
+
Size of the metric pool.
+
+ static auto sizeByName(const std::string& name) -> std::size_t +
+
Size of metrics associated with a given name.
+
+ static void clear() +
+
Clears the metric pool.
+
+ static void setMaxEntries(std::size_t n) +
+
Sets maximum metric entries.
+
+ static auto readValue(const std::string& name, + double& value, + size_t& offset) -> bool +
+
Read a metric value by its name.
+
+ static auto readName(std::string& name, + size_t& seenCount) -> bool +
+
Search for a new unique metric name.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Metrics() deleted +
+
Deleted constructor.
+
+
+
+

Function documentation

+
+

+ static void cubos::core::tel::Metrics::metric(const std::string& name, + double metric) +

+

Add a metric in the pool.

+ + + + + + + + + + + + + + +
Parameters
name
metricThe metric to add.
+
+
+

+ static std::size_t cubos::core::tel::Metrics::size() +

+

Size of the metric pool.

+ + + + + + + +
ReturnsMetrics count.
+
+
+

+ static std::size_t cubos::core::tel::Metrics::sizeByName(const std::string& name) +

+

Size of metrics associated with a given name.

+ + + + + + + + + + + + + + + + +
Parameters
nameMetric name.
ReturnsMetrics count.
+
+
+

+ static void cubos::core::tel::Metrics::setMaxEntries(std::size_t n) +

+

Sets maximum metric entries.

+ + + + + + + + + + +
Parameters
nThe new maximum value.
+
+
+

+ static bool cubos::core::tel::Metrics::readValue(const std::string& name, + double& value, + size_t& offset) +

+

Read a metric value by its name.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameMetric name.
value outBuffer to store metric value.
offsetRead count per metric.
ReturnsWhether the metric was found.
+
+
+

+ static bool cubos::core::tel::Metrics::readName(std::string& name, + size_t& seenCount) +

+

Search for a new unique metric name.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
name outBuffer to store metric name.
seenCountSeen metrics count.
ReturnsWhether a new metric was found.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanGuard.html b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanGuard.html new file mode 100644 index 0000000000..7a1d4e637d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanGuard.html @@ -0,0 +1,103 @@ + + + + + cubos::core::tel::SpanGuard class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::SpanGuard class + +

+

A guard object that automatically ends the current span when it goes out of scope.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanManager.html b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanManager.html new file mode 100644 index 0000000000..52637ba43b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1tel_1_1SpanManager.html @@ -0,0 +1,171 @@ + + + + + cubos::core::tel::SpanManager class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::SpanManager class + +

+

Manages the creation and ending of spans.

+ +
+

Public static functions

+
+
+ static void begin(const std::string& name, + Level level) +
+
Begins a new span.
+
+ static void end() +
+
Ends the current active span.
+
+ static auto current() -> SpanId +
+
Gets the current active span.
+
+
+
+

Function documentation

+
+

+ static void cubos::core::tel::SpanManager::begin(const std::string& name, + Level level) +

+

Begins a new span.

+ + + + + + + + + + + + + + +
Parameters
nameSpan name.
levelSpan level.
+
+
+

+ static SpanId cubos::core::tel::SpanManager::current() +

+

Gets the current active span.

+ + + + + + + +
ReturnsIdentifier of the current span.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Process.html b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Process.html new file mode 100644 index 0000000000..b7d2d6767d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Process.html @@ -0,0 +1,246 @@ + + + + + cubos::core::thread::Process class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::thread::Process class final + +

+

Provides a cross-platform way to spawn child processes.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Process() defaulted +
+
Default constructor.
+
+ Process(Process&& other) noexcept +
+
Move constructor.
+
+
+
+

Public functions

+
+
+ auto operator=(Process&& other) -> Process& noexcept +
+
Move assignment operator.
+
+ auto start(const std::string& command, + const std::vector<std::string>& args = {}, + const std::string& cwd = "") -> bool +
+
Starts a new process.
+
+ void kill() +
+
Kills the process.
+
+ auto wait() -> bool +
+
Waits for the process to finish.
+
+ auto wait(int& status) -> bool +
+
Waits for the process to finish.
+
+ auto started() const -> bool +
+
Checks whether the process has been started.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::thread::Process::start(const std::string& command, + const std::vector<std::string>& args = {}, + const std::string& cwd = "") +

+

Starts a new process.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
commandCommand to execute.
argsArguments to pass to the command.
cwdWorking directory for the new process.
ReturnsWhether the process was started successfully.
+
+
+

+ bool cubos::core::thread::Process::wait() +

+

Waits for the process to finish.

+ + + + + + + +
ReturnsWhether the process exited normally.
+
+
+

+ bool cubos::core::thread::Process::wait(int& status) +

+

Waits for the process to finish.

+ + + + + + + + + + + + + + + + +
Parameters
statusExit code of the process, if it exited normally.
ReturnsWhether the process exited normally.
+
+
+

+ bool cubos::core::thread::Process::started() const +

+

Checks whether the process has been started.

+ + + + + + + +
ReturnsWhether the process has been started.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Task.html b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Task.html new file mode 100644 index 0000000000..3c70d93e1b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1Task.html @@ -0,0 +1,340 @@ + + + + + cubos::core::thread::Task class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::thread::Task class final +

+

Provides a mechanism to access the results of asynchronous operations.

+ + + + + + + + + + +
Template parameters
TResult type.
+ +
+

Constructors, destructors, conversion operators

+
+
+ Task() +
+
Constructs.
+
+ Task(T value) +
+
Constructs a finished task.
+
+ Task(const Task& other) +
+
Copy constructs.
+
+ Task(Task&& other) noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto operator=(const Task& other) -> Task& +
+
Copy assigns.
+
+ auto operator=(Task&& other) -> Task& noexcept +
+
Move assigns.
+
+ void finish(T value) +
+
Finishes the task, setting its result and notifying a waiting thread.
+
+ void discard() +
+
Discards any result eventually received. The task is left in an invalid state.
+
+ auto isDone() const -> bool +
+
Returns whether the task has finished.
+
+ auto result() -> T +
+
Blocks until the task finishes and then returns its result.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::core::thread::Task<T>::Task(T value) +

+

Constructs a finished task.

+ + + + + + + + + + + + + + + + +
Parameters
valueTask result.
ReturnsTask.
+
+
+

+
+ template<typename T> +
+ cubos::core::thread::Task<T>::Task(const Task& other) +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherTask.
+
+
+

+
+ template<typename T> +
+ cubos::core::thread::Task<T>::Task(Task&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherTask.
+
+
+

+
+ template<typename T> +
+ Task& cubos::core::thread::Task<T>::operator=(const Task& other) +

+

Copy assigns.

+ + + + + + + + + + +
Parameters
otherTask.
+
+
+

+
+ template<typename T> +
+ Task& cubos::core::thread::Task<T>::operator=(Task&& other) noexcept +

+

Move assigns.

+ + + + + + + + + + +
Parameters
otherTask.
+
+
+

+
+ template<typename T> +
+ void cubos::core::thread::Task<T>::finish(T value) +

+

Finishes the task, setting its result and notifying a waiting thread.

+ + + + + + + + + + +
Parameters
valueTask result.
+
+
+

+
+ template<typename T> +
+ bool cubos::core::thread::Task<T>::isDone() const +

+

Returns whether the task has finished.

+ + + + + + + +
ReturnsWhether the task has finished.
+
+
+

+
+ template<typename T> +
+ T cubos::core::thread::Task<T>::result() +

+

Blocks until the task finishes and then returns its result.

+ + + + + + + +
ReturnsTask result.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1core_1_1thread_1_1ThreadPool.html b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1ThreadPool.html new file mode 100644 index 0000000000..e5af11bb73 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1core_1_1thread_1_1ThreadPool.html @@ -0,0 +1,175 @@ + + + + + cubos::core::thread::ThreadPool class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::thread::ThreadPool class final + +

+

Manages a pool of threads, to which tasks can be submitted.

+ + +
+

Constructors, destructors, conversion operators

+
+
+ ThreadPool(std::size_t numThreads) +
+
Constructs a pool with numThreads, starting them immediately.
+
+
+
+

Public functions

+
+
+ void addTask(std::function<void()> task) +
+
Adds a task to the thread pool. Starts when a thread becomes available.
+
+ void wait() +
+
Blocks until all tasks finish.
+
+
+
+

Function documentation

+
+

+ cubos::core::thread::ThreadPool::ThreadPool(std::size_t numThreads) +

+

Constructs a pool with numThreads, starting them immediately.

+ + + + + + + + + + +
Parameters
numThreadsNumber of threads to create.
+
+
+

+ void cubos::core::thread::ThreadPool::addTask(std::function<void()> task) +

+

Adds a task to the thread pool. Starts when a thread becomes available.

+ + + + + + + + + + +
Parameters
taskTask to add.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1AnyAsset.html b/preview/pr-1379/classcubos_1_1engine_1_1AnyAsset.html new file mode 100644 index 0000000000..a6476331a7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1AnyAsset.html @@ -0,0 +1,506 @@ + + + + + cubos::engine::AnyAsset class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::AnyAsset class + +

+

Handle to an asset of any type. May either be weak or strong. Weak handles do not guarantee the asset is loaded, while strong handles do.

+ +

Assets are identified by their UUID. This is a unique 128-bit number which is assigned to each asset when it is imported or created. Default constructed handles are null handles, which are not associated with any asset.

+
+

Derived classes

+
+
+
template<typename T>
+ class Asset +
+
Handle to an asset of a specific type.
+
+
template<typename T>
+ class Asset +
+
Handle to an asset of a specific type.
+
+
template<typename T>
+ class Asset +
+
Handle to an asset of a specific type.
+
+
template<typename T>
+ class Asset +
+
Handle to an asset of a specific type.
+
+
+
+

Public types

+
+
+ enum class IdType { UUID, + Path, + Invalid } +
+
Type of the asset identifier.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ AnyAsset(std::nullptr_t ptr = nullptr) +
+
Constructs a null handle.
+
+ AnyAsset(uuids::uuid id) +
+
Constructs a weak handle.
+
+ AnyAsset(std::string_view str) +
+
Constructs a weak handle. If the string is not a valid UUID, the handle will be null.
+
+ AnyAsset(const AnyAsset& other) +
+
Constructs a copy of the given handle.
+
+ AnyAsset(AnyAsset&& other) noexcept +
+
Constructs a handle from the given handle.
+
+
template<typename T>
+ operator Asset<T>() const +
+
Converts this handle to a handle of a specific type.
+
+
+
+

Public functions

+
+
+ auto operator=(const AnyAsset& other) -> AnyAsset& +
+
Overwrites this handle with a copy of the given handle.
+
+ auto operator=(AnyAsset&& other) -> AnyAsset& noexcept +
+
Overwrites this handle with the given handle.
+
+ auto operator==(const AnyAsset& other) const -> bool +
+
Equality operator for comparing two AnyAsset objects.
+
+ auto getVersion() const -> int +
+
Gets the version of the asset last seen by this handle.
+
+ auto getIdType() const -> IdType +
+
Gets the type of the asset identifier.
+
+ auto getIdString() const -> std::string +
+
Gets the Path or UUID of the asset.
+
+ auto getId() const -> std::optional<uuids::uuid> +
+
Gets the UUID of the asset if it has one.
+
+ auto isNull() const -> bool +
+
Checks if the handle is null.
+
+ auto isStrong() const -> bool +
+
Checks if the handle is strong.
+
+ void makeWeak() +
+
Makes this handle a weak handle, decreasing the asset's reference count if it was strong.
+
+
+
+

Public variables

+
+
+ std::string pathOrId +
+
Avoid using this field, use getId() instead.
+
+
+
+

Protected static functions

+
+
+ static auto makeType(std::string name) -> core::reflection::Type& +
+
Constructs a type with the given name, constructible trait and UUID field.
+
+
+
+

Function documentation

+
+

+ cubos::engine::AnyAsset::AnyAsset(uuids::uuid id) +

+

Constructs a weak handle.

+ + + + + + + + + + +
Parameters
idUUID of the asset.
+
+
+

+ cubos::engine::AnyAsset::AnyAsset(std::string_view str) +

+

Constructs a weak handle. If the string is not a valid UUID, the handle will be null.

+ + + + + + + + + + +
Parameters
strString representation of the UUID.
+
+
+

+ cubos::engine::AnyAsset::AnyAsset(const AnyAsset& other) +

+

Constructs a copy of the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to copy.
+
+
+

+ cubos::engine::AnyAsset::AnyAsset(AnyAsset&& other) noexcept +

+

Constructs a handle from the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to move.
+
+
+

+
+ template<typename T> +
+ cubos::engine::AnyAsset::operator Asset<T>() const +

+

Converts this handle to a handle of a specific type.

+ + + + + + + + + + + + + + + + +
Template parameters
TType of the asset.
ReturnsHandle to the same asset, but of the specified type.
+
+
+

+ AnyAsset& cubos::engine::AnyAsset::operator=(const AnyAsset& other) +

+

Overwrites this handle with a copy of the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to copy.
+
+
+

+ AnyAsset& cubos::engine::AnyAsset::operator=(AnyAsset&& other) noexcept +

+

Overwrites this handle with the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to move.
+
+
+

+ bool cubos::engine::AnyAsset::operator==(const AnyAsset& other) const +

+

Equality operator for comparing two AnyAsset objects.

+ + + + + + + + + + + + + + + + +
Parameters
otherThe other AnyAsset to compare.
ReturnsTrue if the two AnyAsset objects have the same UUID , otherwise false.
+
+
+

+ int cubos::engine::AnyAsset::getVersion() const +

+

Gets the version of the asset last seen by this handle.

+ + + + + + + +
ReturnsAsset version.
+
+
+

+ IdType cubos::engine::AnyAsset::getIdType() const +

+

Gets the type of the asset identifier.

+ + + + + + + +
ReturnsAsset identifier type.
+
+
+

+ std::string cubos::engine::AnyAsset::getIdString() const +

+

Gets the Path or UUID of the asset.

+ + + + + + + +
ReturnsAsset Path or UUID.
+
+
+

+ std::optional<uuids::uuid> cubos::engine::AnyAsset::getId() const +

+

Gets the UUID of the asset if it has one.

+ + + + + + + +
ReturnsAsset UUID.
+

There are two possible reasons for an asset handle to have no UUID:

  • it being an invalid or null handle;
  • it being created from an asset path.

To ensure an asset handle gets a UUID, you can use Assets::load.

+
+
+

+ bool cubos::engine::AnyAsset::isNull() const +

+

Checks if the handle is null.

+ + + + + + + +
ReturnsWhether the handle is null.
+
+
+

+ bool cubos::engine::AnyAsset::isStrong() const +

+

Checks if the handle is strong.

+ + + + + + + +
ReturnsWhether the handle is strong.
+
+
+

+ static core::reflection::Type& cubos::engine::AnyAsset::makeType(std::string name) protected +

+

Constructs a type with the given name, constructible trait and UUID field.

+ + + + + + + + + + +
Parameters
nameType name.
+

Added so that typed asset handles don't duplicate the existing reflection code of the base class.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Asset.html b/preview/pr-1379/classcubos_1_1engine_1_1Asset.html new file mode 100644 index 0000000000..15eff68c88 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Asset.html @@ -0,0 +1,332 @@ + + + + + cubos::engine::Asset class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::engine::Asset class +

+

Handle to an asset of a specific type.

+ + + + + + + + + + +
Template parameters
TType of the asset.
+ + +
+

Base classes

+
+
+ class AnyAsset +
+
Handle to an asset of any type. May either be weak or strong. Weak handles do not guarantee the asset is loaded, while strong handles do.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ AnyAsset(std::nullptr_t ptr = nullptr) +
+
Constructs a null handle.
+
+ AnyAsset(uuids::uuid id) +
+
Constructs a weak handle.
+
+ AnyAsset(std::string_view str) +
+
Constructs a weak handle. If the string is not a valid UUID, the handle will be null.
+
+ AnyAsset(const AnyAsset& other) +
+
Constructs a copy of the given handle.
+
+ AnyAsset(AnyAsset&& other) noexcept +
+
Constructs a handle from the given handle.
+
+
+
+

Public functions

+
+
+ auto toAny() const -> AnyAsset +
+
Constructs a generic handle version of this handle.
+
+ auto operator=(const AnyAsset& other) -> Asset<T>& +
+
Overwrites this handle with a copy of the given handle.
+
+ auto operator=(AnyAsset&& other) -> Asset<T>& noexcept +
+
Overwrites this handle with the given handle.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ cubos::engine::Asset<T>::AnyAsset(uuids::uuid id) +

+

Constructs a weak handle.

+ + + + + + + + + + +
Parameters
idUUID of the asset.
+
+
+

+
+ template<typename T> +
+ cubos::engine::Asset<T>::AnyAsset(std::string_view str) +

+

Constructs a weak handle. If the string is not a valid UUID, the handle will be null.

+ + + + + + + + + + +
Parameters
strString representation of the UUID.
+
+
+

+
+ template<typename T> +
+ cubos::engine::Asset<T>::AnyAsset(const AnyAsset& other) +

+

Constructs a copy of the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to copy.
+
+
+

+
+ template<typename T> +
+ cubos::engine::Asset<T>::AnyAsset(AnyAsset&& other) noexcept +

+

Constructs a handle from the given handle.

+ + + + + + + + + + +
Parameters
otherHandle to move.
+
+
+

+
+ template<typename T> +
+ AnyAsset cubos::engine::Asset<T>::toAny() const +

+

Constructs a generic handle version of this handle.

+ + + + + + + +
ReturnsGeneric handle to the same asset.
+
+
+

+
+ template<typename T> +
+ Asset<T>& cubos::engine::Asset<T>::operator=(const AnyAsset& other) +

+

Overwrites this handle with a copy of the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
otherHandle to copy.
ReturnsReference to this object, for chaining.
+
+
+

+
+ template<typename T> +
+ Asset<T>& cubos::engine::Asset<T>::operator=(AnyAsset&& other) noexcept +

+

Overwrites this handle with the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
otherHandle to move.
ReturnsReference to this object, for chaining.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1AssetBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1AssetBridge.html new file mode 100644 index 0000000000..07519cfc0e --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1AssetBridge.html @@ -0,0 +1,270 @@ + + + + + cubos::engine::AssetBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::AssetBridge class + +

+

Bridges are the objects responsible for loading and saving assets from/to disk. They form the bridge between the asset manager and the virtual file system.

+ +

Not all bridges need to implement the save method. You could have an asset type which could be loaded but not saved, for example.

Bridges should take into account that the asset manager calls them from a different thread than the one that created them.

+
+

Derived classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ AssetBridge(const core::reflection::Type& type, + bool asynchronous = true) explicit +
+
Constructs a bridge.
+
+
+
+

Public functions

+
+
+ auto load(Assets& assets, + const AnyAsset& handle) -> bool pure virtual +
+
Loads an asset.
+
+ auto save(const Assets& assets, + const AnyAsset& handle) -> bool virtual +
+
Saves an asset.
+
+ auto assetType() const -> const core::reflection::Type& +
+
Gets the type of the assets the bridge loads.
+
+ auto asynchronous() const -> bool +
+
Whether the bridge should load assets asynchronously.
+
+
+
+

Function documentation

+
+

+ cubos::engine::AssetBridge::AssetBridge(const core::reflection::Type& type, + bool asynchronous = true) explicit +

+

Constructs a bridge.

+ + + + + + + + + + + + + + +
Parameters
typeType of assets loaded by the bridge.
asynchronousWhether the bridge should load assets asynchronously.
+
+
+

+ bool cubos::engine::AssetBridge::load(Assets& assets, + const AnyAsset& handle) pure virtual +

+

Loads an asset.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
ReturnsWhether the asset was successfully loaded.
+

The metadata of the given asset should already be present in the asset manager.

+
+
+

+ bool cubos::engine::AssetBridge::save(const Assets& assets, + const AnyAsset& handle) virtual +

+

Saves an asset.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
ReturnsWhether the asset was successfully saved.
+

The asset should be loaded in the asset manager.

+
+
+

+ const core::reflection::Type& cubos::engine::AssetBridge::assetType() const +

+

Gets the type of the assets the bridge loads.

+ + + + + + + +
ReturnsType of the asset.
+
+
+

+ bool cubos::engine::AssetBridge::asynchronous() const +

+

Whether the bridge should load assets asynchronously.

+ + + + + + + +
ReturnsWhether the bridge should load assets asynchronously.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1AssetMeta.html b/preview/pr-1379/classcubos_1_1engine_1_1AssetMeta.html new file mode 100644 index 0000000000..820d797039 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1AssetMeta.html @@ -0,0 +1,280 @@ + + + + + cubos::engine::AssetMeta class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::AssetMeta class final + +

+

Stores metadata about an asset - the data stored in .meta files. Each asset has a corresponding meta object, which contains load or import parameters.

+ +

Serialization:

  • can be serialized and deserialized without context.
  • when serialized with the type AssetMeta::Exclude in the context, the specified keys are excluded from the serialization.
+
+

Public types

+
+
+ struct Exclude +
+
Used as context to exclude parameters from being serialized.
+
+
+
+

Public functions

+
+
+ auto get(std::string_view key) const -> std::optional<std::string> +
+
Gets the value of a parameter on the asset's metadata.
+
+ auto getId() const -> uuids::uuid +
+
Gets the ID of the asset.
+
+ auto getPath() const -> std::optional<std::string> +
+
Gets the path of the asset.
+
+ void set(std::string_view key, + std::string_view value) +
+
Sets a parameter on the asset's metadata.
+
+ void remove(std::string_view key) +
+
Removes a parameter from the asset's metadata.
+
+ auto params() const -> const std::unordered_map<std::string, std::string>& +
+
Gets the parameters of the asset's metadata.
+
+ auto params() -> std::unordered_map<std::string, std::string>& +
+
Gets the parameters of the asset's metadata.
+
+
+
+

Function documentation

+
+

+ std::optional<std::string> cubos::engine::AssetMeta::get(std::string_view key) const +

+

Gets the value of a parameter on the asset's metadata.

+ + + + + + + + + + + + + + + + +
Parameters
keyKey of the parameter.
ReturnsThe value of the parameter, if the parameter exists.
+
+
+

+ uuids::uuid cubos::engine::AssetMeta::getId() const +

+

Gets the ID of the asset.

+ + + + + + + +
ReturnsID of the asset.
+
+
+

+ std::optional<std::string> cubos::engine::AssetMeta::getPath() const +

+

Gets the path of the asset.

+ + + + + + + +
ReturnsPath of the asset.
+
+
+

+ void cubos::engine::AssetMeta::set(std::string_view key, + std::string_view value) +

+

Sets a parameter on the asset's metadata.

+ + + + + + + + + + + + + + +
Parameters
keyKey of the parameter.
valueValue of the parameter.
+
+
+

+ void cubos::engine::AssetMeta::remove(std::string_view key) +

+

Removes a parameter from the asset's metadata.

+ + + + + + + + + + +
Parameters
keyKey of the parameter.
+
+
+

+ const std::unordered_map<std::string, std::string>& cubos::engine::AssetMeta::params() const +

+

Gets the parameters of the asset's metadata.

+ + + + + + + +
ReturnsParameters of the asset.
+
+
+

+ std::unordered_map<std::string, std::string>& cubos::engine::AssetMeta::params() +

+

Gets the parameters of the asset's metadata.

+ + + + + + + +
ReturnsParameters of the asset.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Assets.html b/preview/pr-1379/classcubos_1_1engine_1_1Assets.html new file mode 100644 index 0000000000..fd3a8bf8a8 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Assets.html @@ -0,0 +1,845 @@ + + + + + cubos::engine::Assets class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Assets class final + +

+

Resource which manages all assets. Responsible for loading and unloading assets, storing them in memory, and providing access to them.

+ +

Assets are all identified through Asset handles.

+
+

Public types

+
+
+ enum class Status { Unknown, + Unloaded, + Loading, + Loaded, + Failed } +
+
Possible statuses for an asset.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Assets() +
+
Constructs an empty manager without any bridges or metadata.
+
+
+
+

Public functions

+
+
+ void registerBridge(const std::string& extension, + std::shared_ptr<AssetBridge> bridge) +
+
Registers a new bridge for the given extension.
+
+ void cleanup() +
+
Cleans up all assets that are not in use. Should be called periodically to free up memory.
+
+ void importAll(std::string_view path) +
+
Similar to loadMeta, but also creates new .meta files with random UUIDs for files without one.
+
+ auto find(std::string_view path) -> AnyAsset +
+
Obtains an asset handle with an UUID from a path.
+
+ void loadMeta(std::string_view path) +
+
Loads all metadata from the virtual filesystem, in the given path. If the path points to a directory, it will be recursively searched for metadata files.
+
+ void unloadMeta(std::string_view path) +
+
Unloads all asset metadata from assets within the given path.
+
+ auto load(AnyAsset handle) const -> AnyAsset +
+
Loads the asset with the given handle, upgrading the handle to a strong one.
+
+ auto saveMeta(const AnyAsset& handle) const -> bool +
+
Saves changes made to an asset's metadata.
+
+ auto save(const AnyAsset& handle) const -> bool +
+
Saves changes made to the asset with the given handle.
+
+ auto readMeta(const AnyAsset& handle) const -> AssetMetaRead +
+
Gets read-only access to the metadata associated with the given handle.
+
+ auto writeMeta(const AnyAsset& handle) -> AssetMetaWrite +
+
Gets read-write access to the metadata associated with the given handle.
+
+
template<typename T>
+ auto read(Asset<T> handle) const -> AssetRead<T> +
+
Gets read-only access to the asset data associated with the given handle.
+
+
template<typename T>
+ auto tryRead(Asset<T> handle) const -> core::memory::Opt<AssetRead<T>> +
+
Gets read-only access to the asset data associated with the given handle.
+
+
template<typename T>
+ auto write(Asset<T> handle) -> AssetWrite<T> +
+
Gets read-write access to the asset data associated with the given handle.
+
+ auto status(const AnyAsset& handle) const -> Status +
+
Gets the status of the asset with the given handle.
+
+ auto update(AnyAsset& handle) const -> bool +
+
Updates the given handle to the latest version of the asset.
+
+
template<typename T>
+ auto update(Asset<T>& handle) const -> bool +
+
Updates the given handle to the latest version of the asset.
+
+ void invalidate(const AnyAsset& handle) +
+
Unloads the given asset. Can be used to force assets to be reloaded.
+
+
template<typename T>
+ auto create(T data) -> Asset<T> +
+
Creates a new asset with a random UUID with the given data (and empty metadata).
+
+
template<typename T>
+ auto store(AnyAsset handle, + T data) -> AnyAsset +
+
Stores the given asset data in memory, associated with the given handle.
+
+ auto listAll() const -> std::vector<AnyAsset> +
+
Gets all assets that have been registered.
+
+ auto type(const AnyAsset& handle) const -> const core::reflection::Type& +
+
Gets the type of an asset.
+
+ auto hasKnownType(const AnyAsset& handle) const -> bool +
+
Checks if the asset has a known type.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::engine::Assets::Status +

+

Possible statuses for an asset.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Unknown +

No metadata is associated with the asset.

+
Unloaded +

The asset is not loaded.

+
Loading +

The asset is being loaded.

+
Loaded +

The asset is loaded.

+
Failed +

The asset failed to load.

+
+
+
+
+

Function documentation

+
+

+ void cubos::engine::Assets::registerBridge(const std::string& extension, + std::shared_ptr<AssetBridge> bridge) +

+

Registers a new bridge for the given extension.

+ + + + + + + + + + + + + + +
Parameters
extensionExtension to register the bridge for.
bridgeBridge to register.
+

If more than one extension match a given asset's name, the longest extension is picked.

+
+
+

+ void cubos::engine::Assets::importAll(std::string_view path) +

+

Similar to loadMeta, but also creates new .meta files with random UUIDs for files without one.

+ + + + + + + + + + +
Parameters
pathPath to load metadata from.
+
+
+

+ AnyAsset cubos::engine::Assets::find(std::string_view path) +

+

Obtains an asset handle with an UUID from a path.

+ + + + + + + + + + + + + + + + +
Parameters
pathPath to get handle from.
ReturnsAsset handle with the found UUID, or null if not found.
+
+
+

+ void cubos::engine::Assets::loadMeta(std::string_view path) +

+

Loads all metadata from the virtual filesystem, in the given path. If the path points to a directory, it will be recursively searched for metadata files.

+ + + + + + + + + + +
Parameters
pathPath to load metadata from.
+
+
+

+ void cubos::engine::Assets::unloadMeta(std::string_view path) +

+

Unloads all asset metadata from assets within the given path.

+ + + + + + + + + + +
Parameters
pathPath to unload metadata from.
+

If an asset from the given path is currently loaded, it will not be unloaded, but it will be dissociated from its original metadata path.

+
+
+

+ AnyAsset cubos::engine::Assets::load(AnyAsset handle) const +

+

Loads the asset with the given handle, upgrading the handle to a strong one.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to load the asset for.
ReturnsStrong handle to the asset, or a null handle if an error occurred.
+

This method doesn't block, thus the asset may have not yet been loaded when it returns. If the manager is unable to find the asset or a bridge for loading it, a null handle is returned. If an error occurs while loading the asset, it will only fail in read() or be visible through status().

+
+
+

+ bool cubos::engine::Assets::saveMeta(const AnyAsset& handle) const +

+

Saves changes made to an asset's metadata.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle identifying the asset to save.
ReturnsWhether the operation was successful.
+

This method blocks until the asset is saved.

+
+
+

+ bool cubos::engine::Assets::save(const AnyAsset& handle) const +

+

Saves changes made to the asset with the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle identifying the asset to save.
ReturnsWhether the operation was successful.
+

This method blocks until the asset is saved.

+
+
+

+ AssetMetaRead cubos::engine::Assets::readMeta(const AnyAsset& handle) const +

+

Gets read-only access to the metadata associated with the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle of the asset to get the metadata for.
ReturnsReference to the metadata.
+

Aborts if the asset is unknown.

+
+
+

+ AssetMetaWrite cubos::engine::Assets::writeMeta(const AnyAsset& handle) +

+

Gets read-write access to the metadata associated with the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to get the metadata for.
ReturnsReference to the metadata.
+

If the asset is unknown, an empty metadata object is returned.

+
+
+

+
+ template<typename T> +
+ AssetRead<T> cubos::engine::Assets::read(Asset<T> handle) const +

+

Gets read-only access to the asset data associated with the given handle.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the asset data.
Parameters
handleHandle to get the asset data for.
ReturnsReference to the asset data.
+

If the asset is not loaded, this blocks until it is. If the asset cannot be loaded, abort is called.

+
+
+

+
+ template<typename T> +
+ core::memory::Opt<AssetRead<T>> cubos::engine::Assets::tryRead(Asset<T> handle) const +

+

Gets read-only access to the asset data associated with the given handle.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the asset data.
Parameters
handleHandle to get the asset data for.
ReturnsReference to the asset data.
+

If the asset is not loaded, this blocks until it is. If the asset cannot be loaded, returns a null option.

+
+
+

+
+ template<typename T> +
+ AssetWrite<T> cubos::engine::Assets::write(Asset<T> handle) +

+

Gets read-write access to the asset data associated with the given handle.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the asset data.
Parameters
handleHandle to get the asset data for.
ReturnsReference to the asset data.
+

If the asset is not loaded, this blocks until it is. If the asset cannot be loaded, abort is called. This increases the asset's version.

+
+
+

+ Status cubos::engine::Assets::status(const AnyAsset& handle) const +

+

Gets the status of the asset with the given handle.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to check the status for.
ReturnsStatus of the asset.
+
+
+

+ bool cubos::engine::Assets::update(AnyAsset& handle) const +

+

Updates the given handle to the latest version of the asset.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to update.
ReturnsWhether the version was updated.
+

Can be used to implement hot-reloading.

+
+
+

+
+ template<typename T> +
+ bool cubos::engine::Assets::update(Asset<T>& handle) const +

+

Updates the given handle to the latest version of the asset.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to update.
ReturnsWhether the version was updated.
+

Can be used to implement hot-reloading.

+
+
+

+ void cubos::engine::Assets::invalidate(const AnyAsset& handle) +

+

Unloads the given asset. Can be used to force assets to be reloaded.

+ + + + + + + + + + +
Parameters
handleHandle to unload.
+
+
+

+
+ template<typename T> +
+ Asset<T> cubos::engine::Assets::create(T data) +

+

Creates a new asset with a random UUID with the given data (and empty metadata).

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the asset data.
Parameters
dataAsset data to store.
ReturnsStrong handle to the new asset.
+
+
+

+
+ template<typename T> +
+ AnyAsset cubos::engine::Assets::store(AnyAsset handle, + T data) +

+

Stores the given asset data in memory, associated with the given handle.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TType of the asset data.
Parameters
handleHandle to associate the asset with.
dataAsset data to store.
ReturnsStrong handle to the asset.
+

If an asset with the same handle already exists, it will be replaced. If no metadata is associated with the handle, an empty one will be created. This increases the asset's version.

+
+
+

+ std::vector<AnyAsset> cubos::engine::Assets::listAll() const +

+

Gets all assets that have been registered.

+ + + + + + + +
ReturnsVector with all registered assets.
+
+
+

+ const core::reflection::Type& cubos::engine::Assets::type(const AnyAsset& handle) const +

+

Gets the type of an asset.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to check the type for.
ReturnsAsset type.
+

If the asset is not loaded, its type is deduced from its bridge. If there's also no associated bridge, aborts. If the asset does not exist, aborts.

+
+
+

+ bool cubos::engine::Assets::hasKnownType(const AnyAsset& handle) const +

+

Checks if the asset has a known type.

+ + + + + + + + + + + + + + + + +
Parameters
handleHandle to check the type for.
Returnswheter the asset has a known type
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1AudioBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1AudioBridge.html new file mode 100644 index 0000000000..11237e33a1 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1AudioBridge.html @@ -0,0 +1,221 @@ + + + + + cubos::engine::AudioBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::AudioBridge class + +

+

Bridge which loads and saves Audio assets.

+ +

Uses the default supported file formats from miniaudio.h, which are WAV, FLAC, and MP3.

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ AudioBridge(std::shared_ptr<cubos::core::al::AudioContext> context) +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::AudioBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::AudioBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1DataInspector.html b/preview/pr-1379/classcubos_1_1engine_1_1DataInspector.html new file mode 100644 index 0000000000..caa68d80cd --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1DataInspector.html @@ -0,0 +1,257 @@ + + + + + cubos::engine::DataInspector class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::DataInspector class final + +

+

Resource which allows the user to inspect or modify any reflectable value on the UI.

+ + +
+

Public functions

+
+
+ void show(const core::reflection::Type& type, + const void* value) +
+
Displays a reflectable value on the UI.
+
+ auto edit(const core::reflection::Type& type, + void* value) -> bool +
+
Displays a reflectable value on the UI and allows modifying it.
+
+
template<typename T>
+ void show(const T& value) +
+
Displays a reflectable value on the UI.
+
+
template<typename T>
+ auto edit(T& value) -> bool +
+
Displays a reflectable value on the UI and allows modifying it.
+
+
+
+

Function documentation

+
+

+ void cubos::engine::DataInspector::show(const core::reflection::Type& type, + const void* value) +

+

Displays a reflectable value on the UI.

+ + + + + + + + + + + + + + +
Parameters
typeValue type.
valuePointer to value.
+
+
+

+ bool cubos::engine::DataInspector::edit(const core::reflection::Type& type, + void* value) +

+

Displays a reflectable value on the UI and allows modifying it.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeValue type.
valuePointer to value.
ReturnsWhether the object was modified.
+
+
+

+
+ template<typename T> +
+ void cubos::engine::DataInspector::show(const T& value) +

+

Displays a reflectable value on the UI.

+ + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valuePointer to value.
+
+
+

+
+ template<typename T> +
+ bool cubos::engine::DataInspector::edit(T& value) +

+

Displays a reflectable value on the UI and allows modifying it.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valuePointer to value.
ReturnsWhether the object was modified.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1FileBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1FileBridge.html new file mode 100644 index 0000000000..af69b17721 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1FileBridge.html @@ -0,0 +1,357 @@ + + + + + cubos::engine::FileBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::FileBridge class + +

+

Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.

+ +

This bridge should be used as a base class for bridges which load and save assets. Child classes must implement the loadFromFile() and saveToFile() methods, which are called with a file stream to load and save the asset from and to, respectively.

+
+

Base classes

+
+
+ class AssetBridge +
+
Bridges are the objects responsible for loading and saving assets from/to disk. They form the bridge between the asset manager and the virtual file system.
+
+
+
+

Derived classes

+
+
+ class AudioBridge +
+
Bridge which loads and saves Audio assets.
+
+ class ImageBridge +
+
Bridge which loads and saves Image assets.
+
+
template<typename T>
+ class JSONBridge +
+
Bridge for loading and saving assets which are serialized to and from a JSON file.
+
+ class SceneBridge +
+
Bridge which loads and saves Scene assets.
+
+ class ShaderBridge +
+
Bridge for loading shader assets.
+
+ class VoxelGridBridge +
+
Bridge which loads and saves Grid assets.
+
+ class VoxelModelBridge +
+
Bridge which loads and saves VoxelModel assets.
+
+ class VoxelPaletteBridge +
+
Bridge which loads and saves Palette assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ FileBridge(const core::reflection::Type& type, + bool asynchronous = true) explicit +
+
Constructs a bridge.
+
+
+
+

Public functions

+
+
+ auto load(Assets& assets, + const AnyAsset& handle) -> bool final +
+
Loads an asset.
+
+ auto save(const Assets& assets, + const AnyAsset& handle) -> bool final +
+
Saves an asset.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool pure virtual +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool pure virtual +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ cubos::engine::FileBridge::FileBridge(const core::reflection::Type& type, + bool asynchronous = true) explicit +

+

Constructs a bridge.

+ + + + + + + + + + + + + + +
Parameters
typeType of assets loaded by the bridge.
asynchronousWhether the bridge should load assets asynchronously.
+
+
+

+ bool cubos::engine::FileBridge::load(Assets& assets, + const AnyAsset& handle) final +

+

Loads an asset.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
ReturnsWhether the asset was successfully loaded.
+

The metadata of the given asset should already be present in the asset manager.

+
+
+

+ bool cubos::engine::FileBridge::save(const Assets& assets, + const AnyAsset& handle) final +

+

Saves an asset.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
ReturnsWhether the asset was successfully saved.
+

The asset should be loaded in the asset manager.

+
+
+

+ bool cubos::engine::FileBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) pure virtual protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::FileBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) pure virtual protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Gizmos.html b/preview/pr-1379/classcubos_1_1engine_1_1Gizmos.html new file mode 100644 index 0000000000..408e6dd57c --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Gizmos.html @@ -0,0 +1,736 @@ + + + + + cubos::engine::Gizmos class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Gizmos class final + +

+

Resource which queues commands for drawing gizmos, basic primitives useful for debugging and tools.

+ +
+

Public types

+
+
+ class Gizmo +
+
Class that describes a type of gizmo.
+
+ enum Space { World, + View, + Screen } +
+
Space to draw a gizmo in.
+
+
+
+

Public functions

+
+
+ void color(const glm::vec3& color) +
+
Sets the color to be used when drawing any subsequent gizmos.
+
+ void drawLine(const std::string& id, + glm::vec3 from, + glm::vec3 to, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a line gizmo.
+
+ void drawBox(const std::string& id, + glm::vec3 corner, + glm::vec3 oppositeCorner, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a filled box gizmo.
+
+ void drawBox(const std::string& id, + const glm::mat4& transform, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a filled box gizmo.
+
+ void drawCutCone(const std::string& id, + glm::vec3 firstBaseCenter, + float firstBaseRadius, + glm::vec3 secondBaseCenter, + float secondBaseRadius, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a cut cone gizmo.
+
+ void drawRing(const std::string& id, + glm::vec3 firstBasePosition, + glm::vec3 secondBasePosition, + float outerRadius, + float innerRadius, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a ring gizmo.
+
+ void drawArrow(const std::string& id, + glm::vec3 origin, + glm::vec3 direction, + float girth, + float width, + float ratio = 0.F, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws an arrow gizmo.
+
+ void drawWireBox(const std::string& id, + glm::vec3 corner, + glm::vec3 oppositeCorner, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a wireframe box gizmo.
+
+ void drawWireBox(const std::string& id, + const glm::mat4& transform, + float lifespan = 0.0F, + Space space = Space::World) +
+
Draws a wireframe box gizmo.
+
+ auto pressed(const std::string& id) const -> bool +
+
Checks whether the left mouse button was pressed over a gizmo.
+
+ auto locked(const std::string& id) const -> bool +
+
Checks whether the left mouse button was pressed over a gizmo.
+
+ auto hovered(const std::string& id) const -> bool +
+
Checks whether the mouse cursor is over a gizmo.
+
+ void handleInput(uint32_t hovered, + bool pressed) +
+
Notifies that a given gizmo is being hovered. Called automatically by an internal system.
+
+ void setLocked(uint32_t locked) +
+
Notifies that a given gizmo is locked.
+
+ void releaseLocked() +
+
Notifies that the previously locked gizmo is no longer locked.
+
+
+
+

Public variables

+
+
+ std::vector<std::shared_ptr<Gizmo>> worldGizmos +
+
Queued gizmos to be drawn in world space.
+
+ std::vector<std::shared_ptr<Gizmo>> viewGizmos +
+
Queued gizmos to be drawn in viewport space.
+
+ std::vector<std::shared_ptr<Gizmo>> screenGizmos +
+
Queued gizmos to be drawn in screen space.
+
+ bool mLocking +
+
Whether the mouse has just now been pressed.
+
+
+
+

Enum documentation

+
+

+ enum cubos::engine::Gizmos::Space +

+

Space to draw a gizmo in.

+ + + + + + + + + + + + + + + + +
Enumerators
World +

Draw gizmo in the game world.

+
View +

Draw gizmo in every camera's viewport.

+
Screen +

Draw gizmo in the screen.

+
+
+
+
+

Function documentation

+
+

+ void cubos::engine::Gizmos::color(const glm::vec3& color) +

+

Sets the color to be used when drawing any subsequent gizmos.

+ + + + + + + + + + +
Parameters
colorColor to be used.
+
+
+

+ void cubos::engine::Gizmos::drawLine(const std::string& id, + glm::vec3 from, + glm::vec3 to, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a line gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
fromOne of the ends of the line to be drawn.
toThe other end of the line to be drawn.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawBox(const std::string& id, + glm::vec3 corner, + glm::vec3 oppositeCorner, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a filled box gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
cornerOne of the corners of the box to be drawn.
oppositeCornerThe opposite corner of the box to be drawn.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawBox(const std::string& id, + const glm::mat4& transform, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a filled box gizmo.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
transformTransformation matrix to apply to a unit-sized box centered at the origin.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawCutCone(const std::string& id, + glm::vec3 firstBaseCenter, + float firstBaseRadius, + glm::vec3 secondBaseCenter, + float secondBaseRadius, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a cut cone gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
firstBaseCenterCenter of one of the bases.
firstBaseRadiusRadius of one of the bases.
secondBaseCenterCenter of the second base.
secondBaseRadiusRadius of the second base.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawRing(const std::string& id, + glm::vec3 firstBasePosition, + glm::vec3 secondBasePosition, + float outerRadius, + float innerRadius, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a ring gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
firstBasePositionCenter of one of the bases.
secondBasePositionCenter of the second base.
outerRadiusRadius of one of the ring.
innerRadiusRadius of the of the hole.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawArrow(const std::string& id, + glm::vec3 origin, + glm::vec3 direction, + float girth, + float width, + float ratio = 0.F, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws an arrow gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
originPoint from which the arrow starts.
directionDirection of the arrow.
girthRadius of the cylinder part of the arrow.
widthRadius of the base of the cone at the tip of the arrow.
ratioPoint of the arrow at which the cylinder ends and the cone begins.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawWireBox(const std::string& id, + glm::vec3 corner, + glm::vec3 oppositeCorner, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a wireframe box gizmo.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
cornerOne of the corners of the box to be drawn.
oppositeCornerThe opposite corner of the box to be drawn.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ void cubos::engine::Gizmos::drawWireBox(const std::string& id, + const glm::mat4& transform, + float lifespan = 0.0F, + Space space = Space::World) +

+

Draws a wireframe box gizmo.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
transformTransformation matrix to apply to a unit-sized box centered at the origin.
lifespanHow long the line will be on screen for, in seconds. Defaults to 0, which means a single frame.
spaceSpace to draw the gizmo in.
+
+
+

+ bool cubos::engine::Gizmos::pressed(const std::string& id) const +

+

Checks whether the left mouse button was pressed over a gizmo.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
ReturnsWhether the gizmo was pressed.
+
+
+

+ bool cubos::engine::Gizmos::locked(const std::string& id) const +

+

Checks whether the left mouse button was pressed over a gizmo.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
ReturnsWhether the gizmo was pressed.
+
+
+

+ bool cubos::engine::Gizmos::hovered(const std::string& id) const +

+

Checks whether the mouse cursor is over a gizmo.

+ + + + + + + + + + + + + + + + +
Parameters
idIdentifier of the gizmo.
ReturnsWhether the mouse button is over a gizmo.
+
+
+

+ void cubos::engine::Gizmos::handleInput(uint32_t hovered, + bool pressed) +

+

Notifies that a given gizmo is being hovered. Called automatically by an internal system.

+ + + + + + + + + + + + + + +
Parameters
hoveredGizmo being hovered.
pressedWhether the mouse left button is pressed.
+
+
+

+ void cubos::engine::Gizmos::setLocked(uint32_t locked) +

+

Notifies that a given gizmo is locked.

+ + + + + + + + + + +
Parameters
lockedGizmo being locked.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Gizmos_1_1Gizmo.html b/preview/pr-1379/classcubos_1_1engine_1_1Gizmos_1_1Gizmo.html new file mode 100644 index 0000000000..2fdc365efc --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Gizmos_1_1Gizmo.html @@ -0,0 +1,200 @@ + + + + + cubos::engine::Gizmos::Gizmo class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Gizmos::Gizmo class + +

+

Class that describes a type of gizmo.

+ +
+

Public functions

+
+
+ void draw(GizmosRenderer& renderer, + DrawPhase phase, + const glm::mat<4, 4, float, glm::packed_highp>& mvp) pure virtual +
+
Draws the gizmo to screen.
+
+ auto decreaseLifespan(float delta) -> bool +
+
Decreases the time the gizmo has left before it is destroyed.
+
+
+
+

Public variables

+
+
+ const uint32_t id +
+
Gizmo identifier.
+
+
+
+

Protected variables

+
+
+ glm::vec3 mColor +
+
Color of the gizmo.
+
+ float mLifespan +
+
Time in seconds the gizmo has left to live.
+
+
+
+

Function documentation

+
+

+ void cubos::engine::Gizmos::Gizmo::draw(GizmosRenderer& renderer, + DrawPhase phase, + const glm::mat<4, 4, float, glm::packed_highp>& mvp) pure virtual +

+

Draws the gizmo to screen.

+ + + + + + + + + + + + + + + + + + +
Parameters
rendererRenderer.
phase
mvpThe view projection matrix to use for drawing the gizmo.
+
+
+

+ bool cubos::engine::Gizmos::Gizmo::decreaseLifespan(float delta) +

+

Decreases the time the gizmo has left before it is destroyed.

+ + + + + + + + + + +
Parameters
deltaSeconds since the last frame.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1ImageBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1ImageBridge.html new file mode 100644 index 0000000000..d659cc432d --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1ImageBridge.html @@ -0,0 +1,210 @@ + + + + + cubos::engine::ImageBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ImageBridge class + +

+

Bridge which loads and saves Image assets.

+ +
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::ImageBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::ImageBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Input.html b/preview/pr-1379/classcubos_1_1engine_1_1Input.html new file mode 100644 index 0000000000..9438288b26 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Input.html @@ -0,0 +1,644 @@ + + + + + cubos::engine::Input class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Input class final + +

+

Resource which stores the input bindings for multiple players.

+ +

Its state is updated accordingly as events are received by the Input.

+
+

Public types

+
+
+ using Key = core::io::Key +
+
Alias for core::io::Key.
+
+ using GamepadButton = core::io::GamepadButton +
+
Alias for core::io::GamepadButton.
+
+ using GamepadAxis = core::io::GamepadAxis +
+
Alias for core::io::GamepadAxis.
+
+ using MouseButton = core::io::MouseButton +
+
Alias for core::io::MouseButton.
+
+
+
+

Public static functions

+
+
+ static void handle(const core::io::Window& window, + const core::io::WindowEvent& event) +
+
Handle all other events - discards them.
+
+
+
+

Public functions

+
+
+ void clear() +
+
Clears all bindings.
+
+ void clear(int player) +
+
Clears all bindings for a specific player.
+
+ void bind(const InputBindings& bindings, + int player = 0) +
+
Sets the bindings for a specific player.
+
+ void gamepad(int player, + int gamepad) +
+
Sets the gamepad for a specific player.
+
+ auto gamepad(int player) const -> int +
+
Gets the gamepad for a specific player.
+
+ auto gamepadCount() const -> int +
+
Gets the number of currently connected gamepads.
+
+ auto pressed(const char* actionName, + int player = 0) const -> bool +
+
Gets an action state for a specific player.
+
+ auto justPressed(const char* actionName, + int player = 0) const -> bool +
+
Gets an action state for a specific player.
+
+ auto justReleased(const char* actionName, + int player = 0) const -> bool +
+
Gets an action state for a specific player.
+
+ auto axis(const char* axisName, + int player = 0) const -> float +
+
Gets an axis value for a specific player.
+
+ void handle(const core::io::Window& window, + const core::io::KeyEvent& event) +
+
Handle a key event.
+
+ void handle(const core::io::Window& window, + const core::io::GamepadConnectionEvent& event) +
+
Handle a gamepad connection event.
+
+ void handle(const core::io::Window& window, + const core::io::MouseButtonEvent& event) +
+
Handle a mouse button event.
+
+ void handle(const core::io::Window& window, + const core::io::MouseMoveEvent& event) +
+
Handle a mouse movement event.
+
+ void updateMouse() +
+
Resets the previous mouse position to equal the current.
+
+ void updateActions() +
+
Reset the previous Action justPressed and justReleased states.
+
+ auto mousePosition() const -> glm::ivec2 +
+
Gets the mouse position in screen space.
+
+ auto previousMousePosition() const -> glm::ivec2 +
+
Gets the mouse position in the previous frame in screen space.
+
+ auto mouseDelta() const -> glm::ivec2 +
+
Gets displacement of the mouse during the last frame, in screen space.
+
+ void pollGamepads(const core::io::Window& window) +
+
Polls the input state of the gamepads.
+
+ auto bindings() const -> const std::unordered_map<int, InputBindings>& +
+
Gets the bindings for each player.
+
+
+
+

Function documentation

+
+

+ static void cubos::engine::Input::handle(const core::io::Window& window, + const core::io::WindowEvent& event) +

+

Handle all other events - discards them.

+ + + + + + + + + + + + + + +
Parameters
windowWindow that received the event.
eventEvent to discard.
+

This is method exists so that std::visit can be used with core::io::WindowEvent on handle().

+
+
+

+ void cubos::engine::Input::clear(int player) +

+

Clears all bindings for a specific player.

+ + + + + + + + + + +
Parameters
playerPlayer whose bindings will be cleared.
+
+
+

+ void cubos::engine::Input::bind(const InputBindings& bindings, + int player = 0) +

+

Sets the bindings for a specific player.

+ + + + + + + + + + + + + + +
Parameters
bindingsBindings to set.
playerPlayer whose bindings will be set.
+
+
+

+ void cubos::engine::Input::gamepad(int player, + int gamepad) +

+

Sets the gamepad for a specific player.

+ + + + + + + + + + + + + + +
Parameters
playerPlayer whose gamepad will be set.
gamepadGamepad to set.
+
+
+

+ int cubos::engine::Input::gamepad(int player) const +

+

Gets the gamepad for a specific player.

+ + + + + + + + + + + + + + + + +
Parameters
playerPlayer whose gamepad will be retrieved.
ReturnsGamepad if it exists, -1 otherwise.
+
+
+

+ int cubos::engine::Input::gamepadCount() const +

+

Gets the number of currently connected gamepads.

+ + + + + + + +
ReturnsNumber of connected gamepads.
+
+
+

+ bool cubos::engine::Input::pressed(const char* actionName, + int player = 0) const +

+

Gets an action state for a specific player.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
actionNameName of the action.
playerPlayer whose action state will be retrieved.
ReturnsWhether the action exists and is pressed.
+
+
+

+ bool cubos::engine::Input::justPressed(const char* actionName, + int player = 0) const +

+

Gets an action state for a specific player.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
actionNameName of the action.
playerPlayer whose action state will be retrieved.
ReturnsWhether the action exists and was just pressed.
+
+
+

+ bool cubos::engine::Input::justReleased(const char* actionName, + int player = 0) const +

+

Gets an action state for a specific player.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
actionNameName of the action.
playerPlayer whose action state will be retrieved.
ReturnsWhether the action exists and was just released.
+
+
+

+ float cubos::engine::Input::axis(const char* axisName, + int player = 0) const +

+

Gets an axis value for a specific player.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
axisNameName of the axis.
playerPlayer whose axis value will be retrieved.
ReturnsAxis value if the axis exists, 0.0 otherwise.
+
+
+

+ void cubos::engine::Input::handle(const core::io::Window& window, + const core::io::KeyEvent& event) +

+

Handle a key event.

+ + + + + + + + + + + + + + +
Parameters
windowWindow that received the event.
eventKey event.
+
+
+

+ void cubos::engine::Input::handle(const core::io::Window& window, + const core::io::GamepadConnectionEvent& event) +

+

Handle a gamepad connection event.

+ + + + + + + + + + + + + + +
Parameters
windowWindow that received the event.
eventGamepad connection event.
+
+
+

+ void cubos::engine::Input::handle(const core::io::Window& window, + const core::io::MouseButtonEvent& event) +

+

Handle a mouse button event.

+ + + + + + + + + + + + + + +
Parameters
windowWindow that received the event.
eventMouse button event.
+
+
+

+ void cubos::engine::Input::handle(const core::io::Window& window, + const core::io::MouseMoveEvent& event) +

+

Handle a mouse movement event.

+ + + + + + + + + + + + + + +
Parameters
windowWindow that received the event.
eventMouse movement event.
+
+
+

+ glm::ivec2 cubos::engine::Input::mousePosition() const +

+

Gets the mouse position in screen space.

+ + + + + + + +
ReturnsMouse position.
+
+
+

+ glm::ivec2 cubos::engine::Input::previousMousePosition() const +

+

Gets the mouse position in the previous frame in screen space.

+ + + + + + + +
ReturnsMouse position in the previous frame.
+
+
+

+ glm::ivec2 cubos::engine::Input::mouseDelta() const +

+

Gets displacement of the mouse during the last frame, in screen space.

+ + + + + + + +
ReturnsMouse displacement.
+
+
+

+ void cubos::engine::Input::pollGamepads(const core::io::Window& window) +

+

Polls the input state of the gamepads.

+ + + + + + + + + + +
Parameters
windowWindow to poll the gamepad state from.
+
+
+

+ const std::unordered_map<int, InputBindings>& cubos::engine::Input::bindings() const +

+

Gets the bindings for each player.

+ + + + + + + +
ReturnsBindings for each player.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1InputAction.html b/preview/pr-1379/classcubos_1_1engine_1_1InputAction.html new file mode 100644 index 0000000000..a5a3e391e0 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1InputAction.html @@ -0,0 +1,307 @@ + + + + + cubos::engine::InputAction class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::InputAction class final + +

+

Stores the state of a single input action, such as "jump" or "attack".

+ +

Can be bound to multiple key combinations, and will be considered "pressed" if any of them are pressed.

+
+

Constructors, destructors, conversion operators

+
+
+ InputAction() defaulted +
+
Constructs without any bindings.
+
+ InputAction(std::vector<InputCombination> combinations) +
+
Constructs with existing bindings.
+
+
+
+

Public functions

+
+
+ auto combinations() const -> const std::vector<InputCombination>& +
+
Gets the bound combinations.
+
+ auto combinations() -> std::vector<InputCombination>& +
+
Gets the bound combinations.
+
+ auto pressed() const -> bool +
+
Checks if this action is pressed.
+
+ auto justPressed() const -> bool +
+
Checks if this action was just pressed.
+
+ auto justReleased() const -> bool +
+
Checks if this action was just released.
+
+ void pressed(bool pressed) +
+
Sets whether this action is pressed.
+
+ void justPressed(bool justPressed) +
+
Checks if this action was just pressed.
+
+ void justReleased(bool justReleased) +
+
Checks if this action was just released.
+
+
+
+

Function documentation

+
+

+ cubos::engine::InputAction::InputAction(std::vector<InputCombination> combinations) +

+

Constructs with existing bindings.

+ + + + + + + + + + +
Parameters
combinationsCombinations to bind.
+
+
+

+ const std::vector<InputCombination>& cubos::engine::InputAction::combinations() const +

+

Gets the bound combinations.

+ + + + + + + +
ReturnsVector of combinations.
+
+
+

+ std::vector<InputCombination>& cubos::engine::InputAction::combinations() +

+

Gets the bound combinations.

+ + + + + + + +
ReturnsVector of combinations.
+
+
+

+ bool cubos::engine::InputAction::pressed() const +

+

Checks if this action is pressed.

+ + + + + + + +
ReturnsSets whether this action is pressed.
+
+
+

+ bool cubos::engine::InputAction::justPressed() const +

+

Checks if this action was just pressed.

+ + + + + + + +
ReturnsSets whether this action was just pressed.
+
+
+

+ bool cubos::engine::InputAction::justReleased() const +

+

Checks if this action was just released.

+ + + + + + + +
ReturnsSets whether this action was just released.
+
+
+

+ void cubos::engine::InputAction::pressed(bool pressed) +

+

Sets whether this action is pressed.

+ + + + + + + + + + +
Parameters
pressedNew pressed state.
+
+
+

+ void cubos::engine::InputAction::justPressed(bool justPressed) +

+

Checks if this action was just pressed.

+ + + + + + + + + + +
Parameters
justPressedWhether this action was just pressed.
+
+
+

+ void cubos::engine::InputAction::justReleased(bool justReleased) +

+

Checks if this action was just released.

+ + + + + + + + + + +
Parameters
justReleasedWhether this action was just released.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1InputAxis.html b/preview/pr-1379/classcubos_1_1engine_1_1InputAxis.html new file mode 100644 index 0000000000..916ca8013c --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1InputAxis.html @@ -0,0 +1,358 @@ + + + + + cubos::engine::InputAxis class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::InputAxis class final + +

+

Stores the state of a single input axis, such as "move forward" or "move right".

+ +

Can be bound to multiple keys, and will have a value in the range [-1, 1] based on the the state of its bindings.

+
+

Constructors, destructors, conversion operators

+
+
+ InputAxis() defaulted +
+
Constructs without any bindings.
+
+ InputAxis(std::vector<InputCombination> positive, + std::vector<InputCombination> negative, + std::vector<core::io::GamepadAxis> gamepadAxes, + float deadzone = 0.0F) +
+
Constructs with existing bindings.
+
+
+
+

Public functions

+
+
+ auto positive() const -> const std::vector<InputCombination>& +
+
Gets the positive input combinations.
+
+ auto negative() const -> const std::vector<InputCombination>& +
+
Gets the negative input combinations.
+
+ auto gamepadAxes() const -> const std::vector<core::io::GamepadAxis>& +
+
Gets the gamepad axis bindings.
+
+ auto positive() -> std::vector<InputCombination>& +
+
Gets the positive input combinations.
+
+ auto negative() -> std::vector<InputCombination>& +
+
Gets the negative input combinations.
+
+ auto gamepadAxes() -> std::vector<core::io::GamepadAxis>& +
+
Gets the gamepad axis bindings.
+
+ auto value() const -> float +
+
Gets the value.
+
+ void value(float value) +
+
Sets the value.
+
+ auto deadzone() const -> float +
+
Gets the deadzone.
+
+ void deadzone(float deadzone) +
+
Sets the deadzone.
+
+
+
+

Function documentation

+
+

+ cubos::engine::InputAxis::InputAxis(std::vector<InputCombination> positive, + std::vector<InputCombination> negative, + std::vector<core::io::GamepadAxis> gamepadAxes, + float deadzone = 0.0F) +

+

Constructs with existing bindings.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
positivePositive input combinations.
negativeNegative input combinations.
gamepadAxesGamepad axis bindings.
deadzone
+
+
+

+ const std::vector<InputCombination>& cubos::engine::InputAxis::positive() const +

+

Gets the positive input combinations.

+ + + + + + + +
ReturnsVector of positive input combinations.
+
+
+

+ const std::vector<InputCombination>& cubos::engine::InputAxis::negative() const +

+

Gets the negative input combinations.

+ + + + + + + +
ReturnsVector of negative input combinations.
+
+
+

+ const std::vector<core::io::GamepadAxis>& cubos::engine::InputAxis::gamepadAxes() const +

+

Gets the gamepad axis bindings.

+ + + + + + + +
ReturnsVector of gamepad axes.
+
+
+

+ std::vector<InputCombination>& cubos::engine::InputAxis::positive() +

+

Gets the positive input combinations.

+ + + + + + + +
ReturnsVector of positive input combinations.
+
+
+

+ std::vector<InputCombination>& cubos::engine::InputAxis::negative() +

+

Gets the negative input combinations.

+ + + + + + + +
ReturnsVector of negative input combinations.
+
+
+

+ std::vector<core::io::GamepadAxis>& cubos::engine::InputAxis::gamepadAxes() +

+

Gets the gamepad axis bindings.

+ + + + + + + +
ReturnsVector of gamepad axes.
+
+
+

+ float cubos::engine::InputAxis::value() const +

+

Gets the value.

+ + + + + + + +
ReturnsValue.
+
+
+

+ void cubos::engine::InputAxis::value(float value) +

+

Sets the value.

+ + + + + + + + + + +
Parameters
valueNew value.
+
+
+

+ float cubos::engine::InputAxis::deadzone() const +

+

Gets the deadzone.

+ + + + + + + +
ReturnsDeadzone.
+
+
+

+ void cubos::engine::InputAxis::deadzone(float deadzone) +

+

Sets the deadzone.

+ + + + + + + + + + +
Parameters
deadzoneNew deadzone.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1InputBindings.html b/preview/pr-1379/classcubos_1_1engine_1_1InputBindings.html new file mode 100644 index 0000000000..1baf8b3ea6 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1InputBindings.html @@ -0,0 +1,195 @@ + + + + + cubos::engine::InputBindings class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::InputBindings class final + +

+

Stores the input bindings for a single player.

+ +

It contains a map of input actions and a map of input axes.

+
+

Public functions

+
+
+ auto actions() const -> const std::unordered_map<std::string, InputAction>& +
+
Gets the input actions map.
+
+ auto axes() const -> const std::unordered_map<std::string, InputAxis>& +
+
Gets the input axes map.
+
+ auto actions() -> std::unordered_map<std::string, InputAction>& +
+
Gets the input actions map.
+
+ auto axes() -> std::unordered_map<std::string, InputAxis>& +
+
Gets the input axes map.
+
+
+
+

Function documentation

+
+

+ const std::unordered_map<std::string, InputAction>& cubos::engine::InputBindings::actions() const +

+

Gets the input actions map.

+ + + + + + + +
ReturnsInput actions map.
+
+
+

+ const std::unordered_map<std::string, InputAxis>& cubos::engine::InputBindings::axes() const +

+

Gets the input axes map.

+ + + + + + + +
ReturnsInput axes map.
+
+
+

+ std::unordered_map<std::string, InputAction>& cubos::engine::InputBindings::actions() +

+

Gets the input actions map.

+ + + + + + + +
ReturnsInput actions map.
+
+
+

+ std::unordered_map<std::string, InputAxis>& cubos::engine::InputBindings::axes() +

+

Gets the input axes map.

+ + + + + + + +
ReturnsInput axes map.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1InputCombination.html b/preview/pr-1379/classcubos_1_1engine_1_1InputCombination.html new file mode 100644 index 0000000000..1408fdd1c5 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1InputCombination.html @@ -0,0 +1,307 @@ + + + + + cubos::engine::InputCombination class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::InputCombination class final + +

+

Stores the keys, gamepad buttons, and mouse buttons of a single input combination.

+ +

Composed of multiple keys and buttons, and will be considered "pressed" if all of them are pressed.

+
+

Constructors, destructors, conversion operators

+
+
+ InputCombination() defaulted +
+
Constructs without any keys or buttons.
+
+ InputCombination(std::vector<core::io::Key> keys, + std::vector<core::io::GamepadButton> gamepadButtons = {}, + std::vector<core::io::MouseButton> mouseButtons = {}) +
+
Constructs from sets of keys, gamepad buttons, and mouse buttons.
+
+
+
+

Public functions

+
+
+ auto keys() const -> const std::vector<core::io::Key>& +
+
Gets the keys to be pressed.
+
+ auto keys() -> std::vector<core::io::Key>& +
+
Gets the keys to be pressed.
+
+ auto gamepadButtons() const -> const std::vector<core::io::GamepadButton>& +
+
Gets the gamepad buttons to be pressed.
+
+ auto gamepadButtons() -> std::vector<core::io::GamepadButton>& +
+
Gets the gamepad buttons to be pressed.
+
+ auto mouseButtons() const -> const std::vector<core::io::MouseButton>& +
+
Gets the mouse buttons to be pressed.
+
+ auto mouseButtons() -> std::vector<core::io::MouseButton>& +
+
Gets the mouse buttons to be pressed.
+
+ auto pressed(const core::io::Window& window, + const core::io::GamepadState* gamepad) const -> bool +
+
Checks if the key combination is pressed.
+
+
+
+

Function documentation

+
+

+ cubos::engine::InputCombination::InputCombination(std::vector<core::io::Key> keys, + std::vector<core::io::GamepadButton> gamepadButtons = {}, + std::vector<core::io::MouseButton> mouseButtons = {}) +

+

Constructs from sets of keys, gamepad buttons, and mouse buttons.

+ + + + + + + + + + + + + + + + + + +
Parameters
keysKeys to be pressed.
gamepadButtonsGamepad buttons to be pressed.
mouseButtonsMouse buttons to be pressed.
+
+
+

+ const std::vector<core::io::Key>& cubos::engine::InputCombination::keys() const +

+

Gets the keys to be pressed.

+ + + + + + + +
ReturnsVector of keys.
+
+
+

+ std::vector<core::io::Key>& cubos::engine::InputCombination::keys() +

+

Gets the keys to be pressed.

+ + + + + + + +
ReturnsVector of keys.
+
+
+

+ const std::vector<core::io::GamepadButton>& cubos::engine::InputCombination::gamepadButtons() const +

+

Gets the gamepad buttons to be pressed.

+ + + + + + + +
ReturnsVector of buttons.
+
+
+

+ std::vector<core::io::GamepadButton>& cubos::engine::InputCombination::gamepadButtons() +

+

Gets the gamepad buttons to be pressed.

+ + + + + + + +
ReturnsVector of buttons.
+
+
+

+ const std::vector<core::io::MouseButton>& cubos::engine::InputCombination::mouseButtons() const +

+

Gets the mouse buttons to be pressed.

+ + + + + + + +
ReturnsVector of buttons.
+
+
+

+ std::vector<core::io::MouseButton>& cubos::engine::InputCombination::mouseButtons() +

+

Gets the mouse buttons to be pressed.

+ + + + + + + +
ReturnsVector of buttons.
+
+
+

+ bool cubos::engine::InputCombination::pressed(const core::io::Window& window, + const core::io::GamepadState* gamepad) const +

+

Checks if the key combination is pressed.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
windowWindow to check for key and mouse button presses.
gamepadGamepad to check for button presses.
ReturnsWhether the key combination is pressed
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1JSONBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1JSONBridge.html new file mode 100644 index 0000000000..f1e618a537 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1JSONBridge.html @@ -0,0 +1,239 @@ + + + + + cubos::engine::JSONBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::engine::JSONBridge class +

+

Bridge for loading and saving assets which are serialized to and from a JSON file.

+ + + + + + + + + + +
Template parameters
TType of asset to load and save. Must be default constructible.
+ +

This bridge automatically serializes and deserializes assets of type T to and from a JSON file. Thus, T must be serializable and deserializable. No additional context is given to the serializer or deserializer.

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ JSONBridge() +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+
+ template<typename T> +
+ bool cubos::engine::JSONBridge<T>::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+
+ template<typename T> +
+ bool cubos::engine::JSONBridge<T>::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Raycast.html b/preview/pr-1379/classcubos_1_1engine_1_1Raycast.html new file mode 100644 index 0000000000..8cd9973da4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Raycast.html @@ -0,0 +1,203 @@ + + + + + cubos::engine::Raycast class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Raycast class + +

+

System argument which allows performing raycast queries among all entities with colliders.

+ +

An example of using this system argument:

cubos.system("do raycast")
+.call([](Raycast raycast) {
+    if (auto hit = raycast.fire({origin, direction}))
+    {
+        CUBOS_INFO("Hit {} at {}", hit->entity, hit->point);
+    }
+});
+
+

Public types

+
+
+ struct Hit +
+
Holds the result of a raycast query.
+
+ struct Ray +
+
Describes the ray used in a raycast query.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Raycast(Query<Entity, const LocalToWorld&, const BoxCollisionShape&> boxes, + Query<Entity, const LocalToWorld&, const CapsuleCollisionShape&, const Position&> capsules) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto fire(Ray ray) -> Opt<Hit> +
+
Fires a ray and returns the first hit.
+
+
+
+

Function documentation

+
+

+ cubos::engine::Raycast::Raycast(Query<Entity, const LocalToWorld&, const BoxCollisionShape&> boxes, + Query<Entity, const LocalToWorld&, const CapsuleCollisionShape&, const Position&> capsules) +

+

Constructs.

+ + + + + + + + + + + + + + +
Parameters
boxesQuery for entities with box colliders.
capsulesQuery for entities with capsule colliders.
+
+
+

+ Opt<Hit> cubos::engine::Raycast::fire(Ray ray) +

+

Fires a ray and returns the first hit.

+ + + + + + + + + + + + + + + + +
Parameters
rayRay to fire.
ReturnsHit if a hit was found, otherwise nullopt.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1RenderMeshPool.html b/preview/pr-1379/classcubos_1_1engine_1_1RenderMeshPool.html new file mode 100644 index 0000000000..d54b89e5ac --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1RenderMeshPool.html @@ -0,0 +1,347 @@ + + + + + cubos::engine::RenderMeshPool class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderMeshPool class + +

+

Used to allocate render meshes, which can then be rendered using a single draw call.

+ +

Internally, creates a single large vertex buffer, which is divided into buckets. Allocated meshes must fit within a single bucket. If they don't, they should be split among multiple buckets.

+
+

Public types

+
+
+ struct BucketId +
+
Identifies a bucket in the pool.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ RenderMeshPool(core::gl::RenderDevice& renderDevice, + std::size_t bucketCount, + std::size_t bucketSize) +
+
Constructs.
+
+ RenderMeshPool(const RenderMeshPool&) deleted +
+
Forbid copy constructor.
+
+
+
+

Public functions

+
+
+ auto operator=(const RenderMeshPool&) -> RenderMeshPool& deleted +
+
Forbid copy assignment.
+
+ auto bucketCount() const -> std::size_t +
+
Gets the bucket count.
+
+ auto bucketSize() const -> std::size_t +
+
Gets the bucket size in vertices.
+
+ auto freeBucketCount() const -> std::size_t +
+
Gets the number of free buckets.
+
+ auto vertexBuffer() const -> core::gl::VertexBuffer +
+
Gets the vertex buffer of the pool.
+
+ auto allocate(const RenderMeshVertex* vertices, + std::size_t count) -> BucketId +
+
Creates a new bucket, and copies the given vertices into it.
+
+ void deallocate(BucketId bucketId) +
+
Frees the bucket at the given index, and any other buckets linked to it.
+
+ auto vertexCount(BucketId bucketId) const -> std::size_t +
+
Gets the number of vertices in the given bucket.
+
+ auto next(BucketId bucketId) const -> BucketId +
+
Gets the bucket linked to the given bucket.
+
+
+
+

Function documentation

+
+

+ cubos::engine::RenderMeshPool::RenderMeshPool(core::gl::RenderDevice& renderDevice, + std::size_t bucketCount, + std::size_t bucketSize) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
renderDeviceRender device.
bucketCountBucket count.
bucketSizeBucket size (in vertices).
+
+
+

+ std::size_t cubos::engine::RenderMeshPool::bucketCount() const +

+

Gets the bucket count.

+ + + + + + + +
ReturnsBucket count.
+
+
+

+ std::size_t cubos::engine::RenderMeshPool::bucketSize() const +

+

Gets the bucket size in vertices.

+ + + + + + + +
ReturnsBucket size in vertices.
+
+
+

+ std::size_t cubos::engine::RenderMeshPool::freeBucketCount() const +

+

Gets the number of free buckets.

+ + + + + + + +
ReturnsNumber of free buckets.
+
+
+

+ BucketId cubos::engine::RenderMeshPool::allocate(const RenderMeshVertex* vertices, + std::size_t count) +

+

Creates a new bucket, and copies the given vertices into it.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
verticesPointer to the vertices.
countNumber of vertices.
ReturnsBucket identifier, or BucketId::Invalid on failure.
+

If the mesh does not fit within a single bucket, then buckets are created and linked as needed.

+
+
+

+ void cubos::engine::RenderMeshPool::deallocate(BucketId bucketId) +

+

Frees the bucket at the given index, and any other buckets linked to it.

+ + + + + + + + + + +
Parameters
bucketIdBucket identifier.
+
+
+

+ std::size_t cubos::engine::RenderMeshPool::vertexCount(BucketId bucketId) const +

+

Gets the number of vertices in the given bucket.

+ + + + + + + + + + + + + + + + +
Parameters
bucketIdBucket identifier.
ReturnsBucket size.
+
+
+

+ BucketId cubos::engine::RenderMeshPool::next(BucketId bucketId) const +

+

Gets the bucket linked to the given bucket.

+ + + + + + + + + + + + + + + + +
Parameters
bucketIdBucket identifier.
ReturnsBucket identifier, or BucketId::Invalid if there's none.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1SceneBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1SceneBridge.html new file mode 100644 index 0000000000..e0ff4fae3f --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1SceneBridge.html @@ -0,0 +1,300 @@ + + + + + cubos::engine::SceneBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::SceneBridge class + +

+

Bridge which loads and saves Scene assets.

+ +

Scenes are stored as JSON files with two top-level objects:

  • "imports" - a dictionary of names to asset IDs of other scenes to import.
  • "entities" - a dictionary of names to serialized entities.

Entities imported from sub-scenes can be overriden by defining them in the current scene. For example:

{
+    "imports": {
+        "foo": "6f42ae5a-59d1-5df3-8720-83b8df6dd536"
+    },
+    "entities": {
+        "baz": {
+            "cubos::engine::Position": {
+                "x": 10
+            }
+        },
+        "foo.bar": {
+            "Parent": "baz",
+        }
+    }
+}

This scene will import the sub-scene with ID 6f42ae5a-59d1-5df3-8720-83b8df6dd536, and prefix all of its entities with foo.. The entity foo.bar will override the entity bar from the imported scene, while the entity baz will be added to the scene.

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ SceneBridge(core::reflection::TypeRegistry components, + core::reflection::TypeRegistry relations) +
+
Constructs a bridge.
+
+
+
+

Public functions

+
+
+ auto components() -> core::reflection::TypeRegistry& +
+
Returns the type registry used to deserialize components.
+
+ auto relations() -> core::reflection::TypeRegistry& +
+
Returns the type registry used to deserialize relations.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ cubos::engine::SceneBridge::SceneBridge(core::reflection::TypeRegistry components, + core::reflection::TypeRegistry relations) +

+

Constructs a bridge.

+ + + + + + + + + + + + + + +
Parameters
componentsComponent type registry.
relationsRelation type registry.
+
+
+

+ core::reflection::TypeRegistry& cubos::engine::SceneBridge::components() +

+

Returns the type registry used to deserialize components.

+ + + + + + + +
ReturnsComponent type registry.
+
+
+

+ core::reflection::TypeRegistry& cubos::engine::SceneBridge::relations() +

+

Returns the type registry used to deserialize relations.

+ + + + + + + +
ReturnsRelations type registry.
+
+
+

+ bool cubos::engine::SceneBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::SceneBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Settings.html b/preview/pr-1379/classcubos_1_1engine_1_1Settings.html new file mode 100644 index 0000000000..65a8833940 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Settings.html @@ -0,0 +1,436 @@ + + + + + cubos::engine::Settings class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Settings class final + +

+

Stores settings as key-value pairs and provides methods to retrieve them.

+ +
+

Public functions

+
+
+ void clear() +
+
Clears all the settings.
+
+ void setBool(const std::string& key, + bool value) +
+
Defines a new boolean setting.
+
+ auto getBool(const std::string& key, + bool defaultValue) -> bool +
+
Retrieves the bool setting with the given key.
+
+ void setString(const std::string& key, + const std::string& value) +
+
Defines a new string setting.
+
+ auto getString(const std::string& key, + const std::string& defaultValue) -> std::string +
+
Retrieves the string setting with the given key.
+
+ void setInteger(const std::string& key, + int value) +
+
Defines a new integer setting.
+
+ auto getInteger(const std::string& key, + int defaultValue) -> int +
+
Retrieves the integer setting with the given key.
+
+ void setDouble(const std::string& key, + double value) +
+
Defines a new double setting.
+
+ auto getDouble(const std::string& key, + double defaultValue) -> double +
+
Retrieves the double setting with the given key.
+
+ void merge(const Settings& settingsToMerge) +
+
Merges the settings from settingsToMerge.
+
+ auto getValues() const -> const std::unordered_map<std::string, std::string>& +
+
+
+ auto getValues() -> std::unordered_map<std::string, std::string>& +
+
+
+
+
+

Function documentation

+
+

+ void cubos::engine::Settings::setBool(const std::string& key, + bool value) +

+

Defines a new boolean setting.

+ + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
+

If the setting already exists, overwrites its value.

+
+
+

+ bool cubos::engine::Settings::getBool(const std::string& key, + bool defaultValue) +

+

Retrieves the bool setting with the given key.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey.
defaultValueDefault value.
ReturnsCurrent value.
+

If no setting exists with such key, sets it to defaultValue and returns it. If the setting exists but its value is not "true", returns false.

+
+
+

+ void cubos::engine::Settings::setString(const std::string& key, + const std::string& value) +

+

Defines a new string setting.

+ + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
+

If the setting already exists, overwrites its value.

+
+
+

+ std::string cubos::engine::Settings::getString(const std::string& key, + const std::string& defaultValue) +

+

Retrieves the string setting with the given key.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey.
defaultValueDefault value.
ReturnsCurrent value.
+

If no setting exists with such key, sets it to defaultValue and returns it.

+
+
+

+ void cubos::engine::Settings::setInteger(const std::string& key, + int value) +

+

Defines a new integer setting.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
ReturnsCurrent value.
+

If the setting already exists, overwrites its value.

+
+
+

+ int cubos::engine::Settings::getInteger(const std::string& key, + int defaultValue) +

+

Retrieves the integer setting with the given key.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey.
defaultValueDefault value.
ReturnsCurrent value.
+

If no setting exists with such key, sets it to defaultValue and returns it. If the setting exists but its value is not a valid integer, returns defaultValue.

+
+
+

+ void cubos::engine::Settings::setDouble(const std::string& key, + double value) +

+

Defines a new double setting.

+ + + + + + + + + + + + + + +
Parameters
keyKey.
valueValue.
+

If the setting already exists, overwrites its value.

+
+
+

+ double cubos::engine::Settings::getDouble(const std::string& key, + double defaultValue) +

+

Retrieves the double setting with the given key.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
keyKey.
defaultValueDefault value.
ReturnsCurrent value.
+

If no setting exists with such key, sets it to defaultValue and returns it. If the setting exists but its value is not a valid double, returns the default value.

+
+
+

+ void cubos::engine::Settings::merge(const Settings& settingsToMerge) +

+

Merges the settings from settingsToMerge.

+ + + + + + + + + + +
Parameters
settingsToMergeSettings to be merged to this instance.
+

If a setting from settingsToMerge is already defined in this instance, its value is overwritten.

+
+
+

+ const std::unordered_map<std::string, std::string>& cubos::engine::Settings::getValues() const +

+ + + + + + + +
ReturnsUnderlying std::unordered_map with the settings.
+
+
+

+ std::unordered_map<std::string, std::string>& cubos::engine::Settings::getValues() +

+ + + + + + + +
ReturnsUnderlying std::unordered_map with the settings.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Shader.html b/preview/pr-1379/classcubos_1_1engine_1_1Shader.html new file mode 100644 index 0000000000..5237e32e06 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Shader.html @@ -0,0 +1,167 @@ + + + + + cubos::engine::Shader class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Shader class final + +

+

Contains a shader stage created from GLSL code.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Shader(cubos::core::gl::ShaderStage shaderStage) +
+
Constructs a shader from code.
+
+
+
+

Public functions

+
+
+ auto shaderStage() const -> cubos::core::gl::ShaderStage +
+
Returns the asset's shader stage.
+
+
+
+

Function documentation

+
+

+ cubos::engine::Shader::Shader(cubos::core::gl::ShaderStage shaderStage) +

+

Constructs a shader from code.

+ + + + + + + + + + +
Parameters
shaderStageShader stage created from GLSL code.
+
+
+

+ cubos::core::gl::ShaderStage cubos::engine::Shader::shaderStage() const +

+

Returns the asset's shader stage.

+ + + + + + + +
ReturnsShader stage.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1ShaderBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1ShaderBridge.html new file mode 100644 index 0000000000..967aec2d44 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1ShaderBridge.html @@ -0,0 +1,244 @@ + + + + + cubos::engine::ShaderBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ShaderBridge class + +

+

Bridge for loading shader assets.

+ +

Asynchronous loading is disabled for this bridge, as render device calls must be made from the main thread, and they're needed to create shaders.

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ ShaderBridge(core::gl::RenderDevice& renderDevice, + core::gl::Stage stage) +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + cubos::core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + cubos::core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ cubos::engine::ShaderBridge::ShaderBridge(core::gl::RenderDevice& renderDevice, + core::gl::Stage stage) +

+

Constructs a bridge.

+ + + + + + + + + + + + + + +
Parameters
renderDeviceRender device used to create the shader.
stageShader stage to create.
+
+
+

+ bool cubos::engine::ShaderBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + cubos::core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::ShaderBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + cubos::core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1ShadowAtlas.html b/preview/pr-1379/classcubos_1_1engine_1_1ShadowAtlas.html new file mode 100644 index 0000000000..3608f9468f --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1ShadowAtlas.html @@ -0,0 +1,197 @@ + + + + + cubos::engine::ShadowAtlas class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ShadowAtlas class + +

+

Resource which stores the shadow map atlas, a large texture that holds the shadow maps for each shadow caster in a quadtree structure, reducing texture switching.

+ +
+

Public types

+
+
+ struct Slot +
+
Slot for a shadow map in the shadow atlas.
+
+
+
+

Public functions

+
+
+ auto getSize() const -> glm::uvec2 +
+
Gets the size of the shadow atlas texture.
+
+ void resize(cubos::core::gl::RenderDevice& rd) +
+
Recreates the shadow atlas texture.
+
+
+
+

Public variables

+
+
+ glm::uvec2 configSize +
+
Configured size of the shadow atlas texture, in pixels. Use this to change the resolution of the atlas. Note that the texture isn't immediately resized; use getSize() to get the actual texture size.
+
+ bool cleared +
+
Whether the shadow atlas texture has already been cleared this frame.
+
+ core::gl::Texture2D atlas +
+
Stores shadow maps for each shadow caster component.
+
+ std::vector<std::shared_ptr<Slot>> slots +
+
Stores the sizes, offsets, and caster ids of the shadow maps in the atlas.
+
+ std::map<int, std::shared_ptr<Slot>> slotsMap +
+
Maps shadow caster ids to their corresponding slots.
+
+
+
+

Function documentation

+
+

+ glm::uvec2 cubos::engine::ShadowAtlas::getSize() const +

+

Gets the size of the shadow atlas texture.

+ + + + + + + +
ReturnsSize of the shadow atlas texture, in pixels.
+
+
+

+ void cubos::engine::ShadowAtlas::resize(cubos::core::gl::RenderDevice& rd) +

+

Recreates the shadow atlas texture.

+ + + + + + + + + + +
Parameters
rdRender device used to create the texture.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1Toolbox.html b/preview/pr-1379/classcubos_1_1engine_1_1Toolbox.html new file mode 100644 index 0000000000..728a53953b --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1Toolbox.html @@ -0,0 +1,248 @@ + + + + + cubos::engine::Toolbox class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Toolbox class final + +

+

Manages the visibility of each tool.

+ +
+

Public functions

+
+
+ auto isOpen(const std::string& toolName) -> bool +
+
Checks if the tool with the given name is open.
+
+ void open(const std::string& toolName) +
+
Opens a tool.
+
+ void close(const std::string& toolName) +
+
Closes a tool.
+
+ void toggle(const std::string& toolName) +
+
If the given tool is open, closes it. Otherwise, opens it.
+
+ auto begin() const -> auto +
+
Returns the beginning of the map with known tools.
+
+ auto end() const -> auto +
+
Returns the end of the map with known tools.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::Toolbox::isOpen(const std::string& toolName) +

+

Checks if the tool with the given name is open.

+ + + + + + + + + + + + + + + + +
Parameters
toolNameTool name.
ReturnsWhether the tool is open.
+
+
+

+ void cubos::engine::Toolbox::open(const std::string& toolName) +

+

Opens a tool.

+ + + + + + + + + + +
Parameters
toolNameTool name.
+
+
+

+ void cubos::engine::Toolbox::close(const std::string& toolName) +

+

Closes a tool.

+ + + + + + + + + + +
Parameters
toolNameTool name.
+
+
+

+ void cubos::engine::Toolbox::toggle(const std::string& toolName) +

+

If the given tool is open, closes it. Otherwise, opens it.

+ + + + + + + + + + +
Parameters
toolNameTool name.
+
+
+

+ auto cubos::engine::Toolbox::begin() const +

+

Returns the beginning of the map with known tools.

+ + + + + + + +
ReturnsBeginning of the map.
+
+
+

+ auto cubos::engine::Toolbox::end() const +

+

Returns the end of the map with known tools.

+ + + + + + + +
ReturnsEnd of the map.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList.html b/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList.html new file mode 100644 index 0000000000..2a4cf780e5 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList.html @@ -0,0 +1,363 @@ + + + + + cubos::engine::UIDrawList class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIDrawList class final + +

+

Holds a collections of draw commands and their data.

+ + +
+

Public types

+
+
+ struct Command +
+
Describes a UI draw instruction.
+
+ struct Entry +
+
Describes a draw commands and how it fits into the draw list carrying it.
+
+ class EntryBuilder +
+
Builds an Entry.
+
+ struct Type +
+
Describes a UI draw call type.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ UIDrawList() +
+
Constructs a draw list.
+
+ UIDrawList(UIDrawList&& other) noexcept +
+
Move constructs.
+
+ UIDrawList(const UIDrawList& other) noexcept +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ auto push(const Type& type, + const Command& command, + const void* data) -> EntryBuilder +
+
Adds entry to the draw list.
+
+ auto push(const Type& type, + core::gl::VertexArray vertexArray, + size_t vertexOffset, + size_t vertexCount, + const void* data) -> EntryBuilder +
+
Creates a new entry in the draw list.
+
+ void clear() +
+
Empties draw list.
+
+ auto size() const -> std::size_t +
+
Gets list size.
+
+ auto entry(std::size_t i) const -> const Entry& +
+
Gets an entry from the list.
+
+ auto data(std::size_t i) const -> const void* +
+
Gets the data of an entry.
+
+
+
+

Function documentation

+
+

+ cubos::engine::UIDrawList::UIDrawList(UIDrawList&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther draw list.
+
+
+

+ cubos::engine::UIDrawList::UIDrawList(const UIDrawList& other) noexcept +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther draw list.
+
+
+

+ EntryBuilder cubos::engine::UIDrawList::push(const Type& type, + const Command& command, + const void* data) +

+

Adds entry to the draw list.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeCommand type.
commandUI draw command.
dataCommand data.
ReturnsA builder for the created entry.
+
+
+

+ EntryBuilder cubos::engine::UIDrawList::push(const Type& type, + core::gl::VertexArray vertexArray, + size_t vertexOffset, + size_t vertexCount, + const void* data) +

+

Creates a new entry in the draw list.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeCommand type.
vertexArrayVertex array handle.
vertexOffsetIndex of the first vertex to be drawn.
vertexCountNumber of vertexes to draw.
dataCommand data.
ReturnsA builder for the created entry.
+
+
+

+ std::size_t cubos::engine::UIDrawList::size() const +

+

Gets list size.

+ + + + + + + +
ReturnsNumber of elements in the list.
+
+
+

+ const Entry& cubos::engine::UIDrawList::entry(std::size_t i) const +

+

Gets an entry from the list.

+ + + + + + + + + + + + + + + + +
Parameters
iEntry index.
ReturnsA list entry.
+
+
+

+ const void* cubos::engine::UIDrawList::data(std::size_t i) const +

+

Gets the data of an entry.

+ + + + + + + + + + + + + + + + +
Parameters
iEntry index.
ReturnsA pointer to the entry's data.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList_1_1EntryBuilder.html b/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList_1_1EntryBuilder.html new file mode 100644 index 0000000000..a58b2a9e23 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1UIDrawList_1_1EntryBuilder.html @@ -0,0 +1,188 @@ + + + + + cubos::engine::UIDrawList::EntryBuilder class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIDrawList::EntryBuilder class + +

+

Builds an Entry.

+ +
+

Constructors, destructors, conversion operators

+
+
+ EntryBuilder(Entry& entry) +
+
Constructs builder with required data.
+
+
+
+

Public functions

+
+
+ auto withTexture(int texIndex, + cubos::core::gl::Texture2D texture, + cubos::core::gl::Sampler sampler = nullptr) -> EntryBuilder +
+
Adds a texture to the entry.
+
+
+
+

Function documentation

+
+

+ cubos::engine::UIDrawList::EntryBuilder::EntryBuilder(Entry& entry) +

+

Constructs builder with required data.

+ + + + + + + + + + +
Parameters
entryReference to the associated entry.
+
+
+

+ EntryBuilder cubos::engine::UIDrawList::EntryBuilder::withTexture(int texIndex, + cubos::core::gl::Texture2D texture, + cubos::core::gl::Sampler sampler = nullptr) +

+

Adds a texture to the entry.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
texIndexIndex of the texture to add.
textureTexture to add.
samplerSampler to be used with the texture.
ReturnsThe builder.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelCollisionShape.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelCollisionShape.html new file mode 100644 index 0000000000..48fbfc8569 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelCollisionShape.html @@ -0,0 +1,271 @@ + + + + + cubos::engine::VoxelCollisionShape class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelCollisionShape class + +

+

Component which adds a collision shape corresponding to a given voxel grid to an entity, used with a Collider component.

+ +
+

Public types

+
+
+ struct BoxShiftPair +
+
Struct which holds a sub-box of the voxel collision shape, and its shift from the center of the shape.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ VoxelCollisionShape() defaulted +
+
Constructs voxel shape with no grid.
+
+ VoxelCollisionShape(Asset<VoxelGrid> grid) +
+
Constructs voxel shape with voxel grid.
+
+ ~VoxelCollisionShape() defaulted +
+
Default destructor.
+
+ VoxelCollisionShape(VoxelCollisionShape&& other) noexcept +
+
Move constructor.
+
+ VoxelCollisionShape(const VoxelCollisionShape& shape) +
+
Copy constructor.
+
+
+
+

Public functions

+
+
+ void setGrid(Asset<VoxelGrid>& grid) +
+
Sets the grid.
+
+ void insertBox(const cubos::core::geom::Box& box, + const glm::vec3& shift) +
+
Inserts a new BoxShiftPair to the list of the class.
+
+ auto getBoxes() const -> std::vector<BoxShiftPair> +
+
Getter for the list of BoxShiftPair of the class.
+
+
+
+

Public variables

+
+
+ Asset<VoxelGrid> grid +
+
Entities voxel grid.
+
+
+
+

Function documentation

+
+

+ cubos::engine::VoxelCollisionShape::VoxelCollisionShape(Asset<VoxelGrid> grid) +

+

Constructs voxel shape with voxel grid.

+ + + + + + + + + + +
Parameters
gridVoxelGrid given in constructor.
+
+
+

+ cubos::engine::VoxelCollisionShape::VoxelCollisionShape(VoxelCollisionShape&& other) noexcept +

+

Move constructor.

+ + + + + + + + + + +
Parameters
otherVoxelCollisionShape to move.
+
+
+

+ cubos::engine::VoxelCollisionShape::VoxelCollisionShape(const VoxelCollisionShape& shape) +

+

Copy constructor.

+ + + + + + + + + + +
Parameters
shapeVoxelCollisionSHape to copy.
+
+
+

+ void cubos::engine::VoxelCollisionShape::setGrid(Asset<VoxelGrid>& grid) +

+

Sets the grid.

+ + + + + + + + + + +
Parameters
gridto set.
+
+
+

+ void cubos::engine::VoxelCollisionShape::insertBox(const cubos::core::geom::Box& box, + const glm::vec3& shift) +

+

Inserts a new BoxShiftPair to the list of the class.

+ + + + + + + + + + + + + + +
Parameters
boxBox to insert.
shiftShift vector of the box.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelGrid.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelGrid.html new file mode 100644 index 0000000000..87b18aad10 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelGrid.html @@ -0,0 +1,465 @@ + + + + + cubos::engine::VoxelGrid class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelGrid class final + +

+

Represents a voxel object using a 3D grid.

+ + +
+

Constructors, destructors, conversion operators

+
+
+ VoxelGrid() +
+
Constructs an empty single-voxel grid.
+
+ VoxelGrid(const glm::uvec3& size) +
+
Constructs an empty grid with the given size.
+
+ VoxelGrid(const glm::uvec3& size, + const std::vector<uint16_t>& indices) +
+
Constructs a grid with the given size and initial data.
+
+ VoxelGrid(VoxelGrid&& other) noexcept +
+
Move constructs.
+
+ VoxelGrid(const VoxelGrid& other) +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ auto operator=(VoxelGrid&& other) -> VoxelGrid& noexcept +
+
Move Operator.
+
+ auto operator=(const VoxelGrid& rhs) -> VoxelGrid& +
+
Makes this grid a copy of another grid.
+
+ void setSize(const glm::uvec3& size) +
+
Resizes the grid. New voxels are initialized to 0.
+
+ auto size() const -> const glm::uvec3& +
+
Gets the size of the grid.
+
+ void clear() +
+
Sets all voxels to 0.
+
+ void set(const glm::ivec3& position, + uint16_t mat) +
+
Sets the material index of a voxel.
+
+ auto get(const glm::ivec3& position) const -> uint16_t +
+
Gets the material index of a voxel.
+
+ auto convert(const VoxelPalette& src, + const VoxelPalette& dst, + float minSimilarity) -> bool +
+
Converts the material indices of this grid from one palette to another.
+
+ auto loadFrom(core::memory::Stream& stream) -> bool +
+
Loads the grid's data from the given stream.
+
+ auto writeTo(core::memory::Stream& stream) const -> bool +
+
Writes the grid's data to the given stream.
+
+
+
+

Function documentation

+
+

+ cubos::engine::VoxelGrid::VoxelGrid(const glm::uvec3& size) +

+

Constructs an empty grid with the given size.

+ + + + + + + + + + +
Parameters
sizeSize of the grid.
+
+
+

+ cubos::engine::VoxelGrid::VoxelGrid(const glm::uvec3& size, + const std::vector<uint16_t>& indices) +

+

Constructs a grid with the given size and initial data.

+ + + + + + + + + + + + + + +
Parameters
sizeSize of the grid.
indicesMaterial indices of the voxels.
+ +
+
+

+ cubos::engine::VoxelGrid::VoxelGrid(VoxelGrid&& other) noexcept +

+

Move constructs.

+ + + + + + + + + + +
Parameters
otherOther grid.
+
+
+

+ cubos::engine::VoxelGrid::VoxelGrid(const VoxelGrid& other) +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
otherOther grid.
+
+
+

+ VoxelGrid& cubos::engine::VoxelGrid::operator=(VoxelGrid&& other) noexcept +

+

Move Operator.

+ + + + + + + + + + +
Parameters
otherOther grid.
+
+
+

+ VoxelGrid& cubos::engine::VoxelGrid::operator=(const VoxelGrid& rhs) +

+

Makes this grid a copy of another grid.

+ + + + + + + + + + + + + + + + +
Parameters
rhsOther grid.
ReturnsThis grid, for chaining.
+
+
+

+ void cubos::engine::VoxelGrid::setSize(const glm::uvec3& size) +

+

Resizes the grid. New voxels are initialized to 0.

+ + + + + + + + + + +
Parameters
sizeNew size of the grid.
+
+
+

+ const glm::uvec3& cubos::engine::VoxelGrid::size() const +

+

Gets the size of the grid.

+ + + + + + + +
ReturnsSize of the grid.
+
+
+

+ void cubos::engine::VoxelGrid::set(const glm::ivec3& position, + uint16_t mat) +

+

Sets the material index of a voxel.

+ + + + + + + + + + + + + + +
Parameters
positionVoxel coordinates.
matMaterial index to set.
+
+
+

+ uint16_t cubos::engine::VoxelGrid::get(const glm::ivec3& position) const +

+

Gets the material index of a voxel.

+ + + + + + + + + + + + + + + + +
Parameters
positionVoxel coordinates.
ReturnsMaterial index of the voxel.
+
+
+

+ bool cubos::engine::VoxelGrid::convert(const VoxelPalette& src, + const VoxelPalette& dst, + float minSimilarity) +

+

Converts the material indices of this grid from one palette to another.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
srcOriginal palette.
dstNew palette.
minSimilarityMinimum similarity between two materials to consider them the same.
ReturnsWhether the conversion was successful.
+

For each material, it will search for another material in the second palette which is similar enough to the original one. The conversion fails if no matching index is found.

+
+
+

+ bool cubos::engine::VoxelGrid::loadFrom(core::memory::Stream& stream) +

+

Loads the grid's data from the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to read from.
ReturnsWhether the stream contained valid data.
+

Assumes the data is stored in big-endian (network byte order). The first bytes correspond to three uint32_t, which represent the size of the grid (x, y, z). The next bytes correspond to size.x * size.y * size.z uint16_t, which represent the actual voxel materials. The voxel data is indexed by x + y * size.x + z * size.x * size.y.

+
+
+

+ bool cubos::engine::VoxelGrid::writeTo(core::memory::Stream& stream) const +

+

Writes the grid's data to the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to write to.
ReturnsWhether the write was successful.
+

Writes in the format specified in loadFrom.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelGridBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelGridBridge.html new file mode 100644 index 0000000000..57499e2683 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelGridBridge.html @@ -0,0 +1,221 @@ + + + + + cubos::engine::VoxelGridBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelGridBridge class + +

+

Bridge which loads and saves Grid assets.

+ +

Uses the format specified in VoxelGrid::loadFrom and VoxelGrid::writeTo

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ VoxelGridBridge() +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::VoxelGridBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::VoxelGridBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelModel.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelModel.html new file mode 100644 index 0000000000..21f0806daf --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelModel.html @@ -0,0 +1,350 @@ + + + + + cubos::engine::VoxelModel class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelModel class final + +

+

Holds the data loaded from voxel model files, such as Qubicle models.

+ +
+

Constructors, destructors, conversion operators

+
+
+ VoxelModel() defaulted +
+
Constructs an empty VoxelModel.
+
+
+
+

Public functions

+
+
+ auto gridCount() const -> std::size_t +
+
Returns the number of grids in the model.
+
+ auto palette() const -> const VoxelPalette& +
+
Returns the palette of the model.
+
+ auto palette() -> VoxelPalette& +
+
Returns the palette of the model.
+
+ auto grid(std::size_t index) const -> const VoxelGrid& +
+
Returns the grid at the given index.
+
+ auto grid(std::size_t index) -> VoxelGrid& +
+
Returns the grid at the given index.
+
+ auto gridPosition(std::size_t index) const -> glm::ivec3 +
+
Returns the position of the grid at the given index.
+
+ void gridPosition(std::size_t index, + glm::ivec3 position) +
+
Sets the position of the grid at the given index.
+
+ auto loadFrom(core::memory::Stream& stream) -> bool +
+
Loads the voxel model data from the given stream.
+
+ auto writeTo(core::memory::Stream& stream) const -> bool +
+
Writes the VoxelModel's data to the given stream.
+
+
+
+

Function documentation

+
+

+ std::size_t cubos::engine::VoxelModel::gridCount() const +

+

Returns the number of grids in the model.

+ + + + + + + +
ReturnsNumber of grids.
+
+
+

+ const VoxelPalette& cubos::engine::VoxelModel::palette() const +

+

Returns the palette of the model.

+ + + + + + + +
ReturnsPalette of the model.
+
+
+

+ VoxelPalette& cubos::engine::VoxelModel::palette() +

+

Returns the palette of the model.

+ + + + + + + +
ReturnsPalette of the model.
+
+
+

+ const VoxelGrid& cubos::engine::VoxelModel::grid(std::size_t index) const +

+

Returns the grid at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the grid.
ReturnsGrid at the given index.
+
+
+

+ VoxelGrid& cubos::engine::VoxelModel::grid(std::size_t index) +

+

Returns the grid at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the grid.
ReturnsGrid at the given index.
+
+
+

+ glm::ivec3 cubos::engine::VoxelModel::gridPosition(std::size_t index) const +

+

Returns the position of the grid at the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the grid.
ReturnsPosition of the grid at the given index.
+
+
+

+ void cubos::engine::VoxelModel::gridPosition(std::size_t index, + glm::ivec3 position) +

+

Sets the position of the grid at the given index.

+ + + + + + + + + + + + + + +
Parameters
indexIndex of the grid.
positionPosition to set.
+
+
+

+ bool cubos::engine::VoxelModel::loadFrom(core::memory::Stream& stream) +

+

Loads the voxel model data from the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to read from.
ReturnsWhether the stream contained valid data.
+

This method reads the voxel model data from a stream in a format compatible with Qubicle files. The method assumes the following structure in the stream: https://getqubicle.com/qubicle/documentation/docs/file/qb/

+
+
+

+ bool cubos::engine::VoxelModel::writeTo(core::memory::Stream& stream) const +

+

Writes the VoxelModel's data to the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to write to.
ReturnsWhether the write was successful.
+

Writes in the format specified in loadFrom.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelModelBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelModelBridge.html new file mode 100644 index 0000000000..954c6665fa --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelModelBridge.html @@ -0,0 +1,221 @@ + + + + + cubos::engine::VoxelModelBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelModelBridge class + +

+

Bridge which loads and saves VoxelModel assets.

+ +

Uses the format specified in VoxelModel::loadFrom and VoxelModel::writeTo

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ VoxelModelBridge() +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::VoxelModelBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::VoxelModelBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette.html new file mode 100644 index 0000000000..c072ff16cb --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette.html @@ -0,0 +1,480 @@ + + + + + cubos::engine::VoxelPalette class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelPalette class final + +

+

Holds a palette of materials. Supports up to 65535 materials.

+ +

Instead of storing the materials themselves in voxel data, Cubos uses palettes, and stores the index of the material in the palette instead.

This allows for more efficient storage of voxel data, since now instead of storing the whole material per each voxel, we just store a 16-bit integer.

+
+

Public types

+
+
+ class Iterator +
+
Used to iterate over materials on the palette.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ VoxelPalette(std::vector<VoxelMaterial>&& materials) +
+
Constructs a palette with the given materials.
+
+ VoxelPalette() defaulted +
+
Constructs an empty palette.
+
+ VoxelPalette(const VoxelPalette&) defaulted +
+
Copy constructs.
+
+ VoxelPalette(VoxelPalette&&) defaulted noexcept +
+
Move constructs.
+
+
+
+

Public functions

+
+
+ auto operator=(const VoxelPalette&) -> VoxelPalette& defaulted +
+
Copy assigns.
+
+ auto operator=(VoxelPalette&&) -> VoxelPalette& defaulted noexcept +
+
Move assigns.
+
+ auto data() const -> const VoxelMaterial* +
+
Gets a pointer to the array of materials on the palette.
+
+ auto size() const -> uint16_t +
+
Gets the number of materials in the palette, excluding the empty material.
+
+ auto get(uint16_t index) const -> const VoxelMaterial& +
+
Gets the material with the given index.
+
+ void set(uint16_t index, + const VoxelMaterial& material) +
+
Sets the material at the given index.
+
+ auto find(const VoxelMaterial& material) const -> uint16_t +
+
Searches for the index of the material most similar with the given material.
+
+ auto add(const VoxelMaterial& material, + float similarity = 1.0F) -> uint16_t +
+
Adds a material to the palette, if one not similar enough already exists.
+
+ auto push(const VoxelMaterial& material) -> uint16_t +
+
Pushes a material to the palette without checking for uniqueness.
+
+ void merge(const VoxelPalette& palette, + float similarity = 1.0F) +
+
Merges another palette into this one.
+
+ auto begin() -> Iterator +
+
Returns an iterator to the first material.
+
+ auto end() -> Iterator +
+
Returns an iterator to the last material.
+
+ auto loadFrom(core::memory::Stream& stream) -> bool +
+
Loads the palette's data from the given stream.
+
+ auto writeTo(core::memory::Stream& stream) const -> bool +
+
Writes the palette's data to the given stream.
+
+
+
+

Function documentation

+
+

+ cubos::engine::VoxelPalette::VoxelPalette(std::vector<VoxelMaterial>&& materials) +

+

Constructs a palette with the given materials.

+ + + + + + + + + + +
Parameters
materialsMaterials to add to the palette.
+
+
+

+ const VoxelMaterial* cubos::engine::VoxelPalette::data() const +

+

Gets a pointer to the array of materials on the palette.

+ + + + + + + +
ReturnsPointer to the array of materials on the palette.
+ +
+
+

+ uint16_t cubos::engine::VoxelPalette::size() const +

+

Gets the number of materials in the palette, excluding the empty material.

+ + + + + + + +
ReturnsNumber of materials in the palette.
+
+
+

+ const VoxelMaterial& cubos::engine::VoxelPalette::get(uint16_t index) const +

+

Gets the material with the given index.

+ + + + + + + + + + + + + + + + +
Parameters
indexIndex of the material to get (1-based, 0 is empty).
ReturnsMaterial at the given index.
+
+
+

+ void cubos::engine::VoxelPalette::set(uint16_t index, + const VoxelMaterial& material) +

+

Sets the material at the given index.

+ + + + + + + + + + + + + + +
Parameters
indexIndex of the material to set (1-based, 0 is empty).
materialMaterial to set.
+
+
+

+ uint16_t cubos::engine::VoxelPalette::find(const VoxelMaterial& material) const +

+

Searches for the index of the material most similar with the given material.

+ + + + + + + + + + + + + + + + +
Parameters
materialMaterial to compare with.
ReturnsIndex of the material.
+
+
+

+ uint16_t cubos::engine::VoxelPalette::add(const VoxelMaterial& material, + float similarity = 1.0F) +

+

Adds a material to the palette, if one not similar enough already exists.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
materialMaterial to add.
similarityMinimum similarity for a material to be considered similar enough.
ReturnsIndex of the material in the palette (1-based, 0 is empty).
+ +
+
+

+ uint16_t cubos::engine::VoxelPalette::push(const VoxelMaterial& material) +

+

Pushes a material to the palette without checking for uniqueness.

+ + + + + + + + + + + + + + + + +
Parameters
materialMaterial to push.
ReturnsSize of the palette.
+ +
+
+

+ void cubos::engine::VoxelPalette::merge(const VoxelPalette& palette, + float similarity = 1.0F) +

+

Merges another palette into this one.

+ + + + + + + + + + + + + + +
Parameters
palettePalette to merge.
similarityMinimum similarity for two materials to be merged.
+ +
+
+

+ Iterator cubos::engine::VoxelPalette::begin() +

+

Returns an iterator to the first material.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ Iterator cubos::engine::VoxelPalette::end() +

+

Returns an iterator to the last material.

+ + + + + + + +
ReturnsIterator.
+
+
+

+ bool cubos::engine::VoxelPalette::loadFrom(core::memory::Stream& stream) +

+

Loads the palette's data from the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to read from.
ReturnsWhether the stream contained valid data.
+

Assumes the data is stored in big-endian (network byte order). The first bytes correspond to an uint16_t, which represents the number of materials in the palette. The next bytes correspond to numMaterials * 4 floats (each material is represented by 4 floats (r, g, b, a)), which represents the actual palette data.

+
+
+

+ bool cubos::engine::VoxelPalette::writeTo(core::memory::Stream& stream) const +

+

Writes the palette's data to the given stream.

+ + + + + + + + + + + + + + + + +
Parameters
streamStream to write to.
ReturnsWhether the write was successful.
+

Writes in the format specified in loadFrom.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelPaletteBridge.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPaletteBridge.html new file mode 100644 index 0000000000..114cc30dd7 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPaletteBridge.html @@ -0,0 +1,221 @@ + + + + + cubos::engine::VoxelPaletteBridge class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelPaletteBridge class + +

+

Bridge which loads and saves Palette assets.

+ +

Uses the format specified in VoxelPalette::loadFrom and VoxelPalette::writeTo

+
+

Base classes

+
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ VoxelPaletteBridge() +
+
Constructs a bridge.
+
+
+
+

Protected functions

+
+
+ auto loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Loads an asset from a file stream.
+
+ auto saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) -> bool override +
+
Saves an asset to a file stream.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::VoxelPaletteBridge::loadFromFile(Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Loads an asset from a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to write into.
handleHandle of the asset being loaded.
streamFile stream.
ReturnsWhether the asset was successfully loaded.
+
+
+

+ bool cubos::engine::VoxelPaletteBridge::saveToFile(const Assets& assets, + const AnyAsset& handle, + core::memory::Stream& stream) override protected +

+

Saves an asset to a file stream.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
assetsManager to read from.
handleHandle of the asset being saved.
streamFile stream.
ReturnsWhether the asset was successfully saved.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette_1_1Iterator.html b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette_1_1Iterator.html new file mode 100644 index 0000000000..d5d8698be4 --- /dev/null +++ b/preview/pr-1379/classcubos_1_1engine_1_1VoxelPalette_1_1Iterator.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::VoxelPalette::Iterator class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelPalette::Iterator class + +

+

Used to iterate over materials on the palette.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/classtesseratos_1_1ProjectManager.html b/preview/pr-1379/classtesseratos_1_1ProjectManager.html new file mode 100644 index 0000000000..fc7a33020d --- /dev/null +++ b/preview/pr-1379/classtesseratos_1_1ProjectManager.html @@ -0,0 +1,240 @@ + + + + + tesseratos::ProjectManager class | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos::ProjectManager class + +

+

System argument which can be used to manage the currently loaded project.

+ +
+

Constructors, destructors, conversion operators

+
+
+ ProjectManager(State& state, + cubos::engine::Assets& assets, + Debugger& debugger) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto open(std::string projectOSPath, + std::string binaryOSPath) -> bool +
+
Opens a project directory.
+
+ auto open() const -> bool +
+
Checks whether a project is currently open.
+
+ void close() +
+
Closes the currently open project.
+
+ auto launch() -> bool +
+
Launches the project's binary and attaches the debugger.
+
+ void terminate() +
+
Stops the project's binary.
+
+
+
+

Function documentation

+
+

+ tesseratos::ProjectManager::ProjectManager(State& state, + cubos::engine::Assets& assets, + Debugger& debugger) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
stateState of the project manager.
assetsAsset manager.
debuggerDebugger.
+
+
+

+ bool tesseratos::ProjectManager::open(std::string projectOSPath, + std::string binaryOSPath) +

+

Opens a project directory.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
projectOSPathProject's directory path in the operating system.
binaryOSPathProject's binary directory path in the operating system.
ReturnsWhether the project could be opened successfully.
+

The given project directory is mounted in the /project directory in the virtual file system. Unmounts any previously opened project directory.

+
+
+

+ bool tesseratos::ProjectManager::open() const +

+

Checks whether a project is currently open.

+ + + + + + + +
ReturnsWhether a project is currently open.
+
+
+

+ bool tesseratos::ProjectManager::launch() +

+

Launches the project's binary and attaches the debugger.

+ + + + + + + +
ReturnsWhether the project could be launched successfully.
+

If the binary is already running, it is stopped first.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/collider_8hpp.html b/preview/pr-1379/collider_8hpp.html new file mode 100644 index 0000000000..6a8d623039 --- /dev/null +++ b/preview/pr-1379/collider_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/collisions/collider.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/collider.hpp file +

+

Component cubos::engine::Collider.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Collider +
+
Component which adds a collider to an entity.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/colliding__with_8hpp.html b/preview/pr-1379/colliding__with_8hpp.html new file mode 100644 index 0000000000..f592ec0caa --- /dev/null +++ b/preview/pr-1379/colliding__with_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/collisions/colliding_with.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/colliding_with.hpp file +

+

Relation cubos::engine::CollidingWith.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::CollidingWith +
+
Relation which represents a collision.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/color__rect_8hpp.html b/preview/pr-1379/color__rect_8hpp.html new file mode 100644 index 0000000000..6a2ff7cbde --- /dev/null +++ b/preview/pr-1379/color__rect_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/color_rect/color_rect.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/color_rect/color_rect.hpp file +

+

Component cubos::engine::UIColorRect.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIColorRect +
+
Component that draws a UI element as a solid color.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/column_8hpp.html b/preview/pr-1379/column_8hpp.html new file mode 100644 index 0000000000..fdfa311050 --- /dev/null +++ b/preview/pr-1379/column_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/table/column.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/column.hpp file +

+

Struct cubos::core::ecs::DenseTableId.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::ColumnId +
+
Identifies a data column type.
+
+ struct cubos::core::ecs::ColumnIdHash +
+
Used to hash ColumnId objects.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/combination_8hpp.html b/preview/pr-1379/combination_8hpp.html new file mode 100644 index 0000000000..22d2a5909c --- /dev/null +++ b/preview/pr-1379/combination_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/input/combination.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/combination.hpp file +

+

Class cubos::engine::InputCombination.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::InputCombination +
+
Stores the keys, gamepad buttons, and mouse buttons of a single input combination.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/command__buffer_8hpp.html b/preview/pr-1379/command__buffer_8hpp.html new file mode 100644 index 0000000000..e2aa5eb489 --- /dev/null +++ b/preview/pr-1379/command__buffer_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/command_buffer.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/command_buffer.hpp file +

+

Class cubos::core::ecs::CommandBuffer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
namespace cubos::core::memory
+
Memory module.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::CommandBuffer +
+
Stores commands to execute them later.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/commands_8hpp.html b/preview/pr-1379/commands_8hpp.html new file mode 100644 index 0000000000..1f1c774d03 --- /dev/null +++ b/preview/pr-1379/commands_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/system/arguments/commands.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/arguments/commands.hpp file +

+

Class cubos::core::ecs::Commands.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Commands +
+
System argument used to write ECS commands and execute them at a later time.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/comparison_8hpp.html b/preview/pr-1379/comparison_8hpp.html new file mode 100644 index 0000000000..a062b41664 --- /dev/null +++ b/preview/pr-1379/comparison_8hpp.html @@ -0,0 +1,136 @@ + + + + + core/reflection/comparison.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/comparison.hpp file +

+

Function cubos::core::reflection::compare.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Functions

+
+
+ auto compare(const Type& type, + const void* a, + const void* b) -> CUBOS_CORE_API bool +
+
Compares two instances of the same type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/constructible_8hpp.html b/preview/pr-1379/constructible_8hpp.html new file mode 100644 index 0000000000..abea811e1e --- /dev/null +++ b/preview/pr-1379/constructible_8hpp.html @@ -0,0 +1,139 @@ + + + + + core/reflection/traits/constructible.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/constructible.hpp file +

+

Class cubos::core::reflection::ConstructibleTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::ConstructibleTrait +
+
Describes how a reflected type may be constructed and destructed.
+
+
template<typename T>
+ class cubos::core::reflection::ConstructibleTrait::Builder +
+
Builder for ConstructibleTrait.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/constructible__utils_8hpp.html b/preview/pr-1379/constructible__utils_8hpp.html new file mode 100644 index 0000000000..83f9a46723 --- /dev/null +++ b/preview/pr-1379/constructible__utils_8hpp.html @@ -0,0 +1,136 @@ + + + + + core/reflection/traits/constructible_utils.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/constructible_utils.hpp file +

+

Utilities for cubos::core::reflection::ConstructibleTrait.

+ + +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Functions

+
+
+
template<typename T>
+ auto autoConstructibleTrait() -> ConstructibleTrait +
+
Returns a ConstructibleTrait with the default, copy and move constructors, set only if the type has them.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/contact__manifold_8hpp.html b/preview/pr-1379/contact__manifold_8hpp.html new file mode 100644 index 0000000000..78382acfd0 --- /dev/null +++ b/preview/pr-1379/contact__manifold_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/collisions/contact_manifold.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/contact_manifold.hpp file +

+

Relation cubos::engine::ContactManifold.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ContactPointData +
+
Contains info regarding a contact point of a @ContactManifold.
+
+ struct cubos::engine::ContactManifold +
+
Represents a contact interface between two bodies.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/contribution.html b/preview/pr-1379/contribution.html new file mode 100644 index 0000000000..c978cb3ec7 --- /dev/null +++ b/preview/pr-1379/contribution.html @@ -0,0 +1,114 @@ + + + + + Contribution guidelines | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Contribution guidelines +

+

Guide on the project's conventions and code style.

+

Commits

Commits should be concise and small, such that they are easy to review. Avoid at all costs including non-related changes in a commit - use git add -p or something similar to force yourself to review the changes you are commiting, and to avoid accidentally commiting unrelated changes.

Commits should follow Conventional Commits and be written in imperative mood. As scopes, we use the names of the labels that start by B- in the label list (e.g.: assets, audio). If the commit affects multiple of those areas, then pick one of the labels that start by A- (e.g.: core, engine, tesseratos). If a commit affects more than one of those, then you can ommit the scope.

If your description is too long, you can add a body to the commit message. The body should be separated from the description by a blank line.

Examples of good commit messages:

feat(core): add CUBOS_FAIL, CUBOS_UNREACHABLE and CUBOS_DEBUG_ASSERT 
+test(core): move filesystem tests to data/fs
+fix(core): fix segfault when popping a sub context
+feat(engine): implement system for sweeping the markers  
+docs(engine): add comments to colliders
+chore: replace GoogleTest submodule with doctest

Examples of bad commit messages:

fix: fix bug
+make it work
+feat(core): Add CUBOS_FAIL
+docs(engine): added comments to colliders

Pull Requests

Pull requests should be concise and small, and if needed, split into multiple smaller PRs so that they are easier to review. If your PR is still not finished, mark it as a draft. When working on new features, draft PRs should be created so that other contributors can have an idea of what is being worked on.

Any features added in a PR should be covered by tests and documentation, including new examples demonstrating the feature.

Documentation

We use Doxygen for documentation, which means that the documentation is mostly written in the code itself. When adding new files, classes, functions, etc, make sure to at least add a triple slash comment (///) with a @brief section describing what it does, otherwise Doxygen will omit it from the documentation.

Make sure to document all function parameters, template parameters and return values. Take a look at other files to get a grasp of the documentation style we use.

When changing the code, the documentation should be updated accordingly.

Plugins

Engine plugins should document which components and resources they add, which tags and settings are used, and how to use them. Take a look at the documentation of other plugins such as the renderer plugin to get an idea of how it should look like.

Every type or function that is part of the public API of a plugin should be added to its corresponding group in the Doxygen documentation, using the @ingroup tag.

Code Style

Casing

We use camelCase for functions, methods, local variables and fields. Private fields are prefixed with m (e.g. mMyField). PascalCase is used for class names and constants. UPPER_CASE is used for macros. snake_case is used for namespaces, folders and files.

Formatting

Code is formatted using clang format. Although we have an action that runs clang format on every PR, it is recommended that you run it locally before commiting your changes, to make it easier for the reviewers to read your code.

We also check the code with clang tidy, which is a static analysis tool which picks up many common mistakes and code smell. This runs on every commit you push to your branch.

Macros

Avoid using macros whenever possible - use constexpr variables or functions instead. If you do need to use a macro to make an implementation more readable, restrict the macro to the source file where it is used. Defining macros in header files is heavily discouraged.

Namespaces

Avoid using namespace in header files. In source files, prefer using foo::bar::X over using namespace foo::bar. If your code is under the namespace foo::bar, you can use using namespace foo::bar in the source files, to make the code more readable.

When closing a namespace the namespace name should be added as a comment. E.g.:

namespace foo
+{
+    ...
+} // namespace foo
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/controller_8hpp.html b/preview/pr-1379/controller_8hpp.html new file mode 100644 index 0000000000..d0de305a64 --- /dev/null +++ b/preview/pr-1379/controller_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/utils/free_camera/controller.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/utils/free_camera/controller.hpp file +

+

Component cubos::engine::FreeCameraController.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::FreeCameraController +
+
Component which moves the camera.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2api_2core_2api_8h.html b/preview/pr-1379/core_2include_2cubos_2api_2core_2api_8h.html new file mode 100644 index 0000000000..40e25521bd --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2api_2core_2api_8h.html @@ -0,0 +1,102 @@ + + + + + cubos/api/core/api.h file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos/api/core/api.h file +

+

Macro CUBOS_CORE_C_API.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2api_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2api_8hpp.html new file mode 100644 index 0000000000..39e5b7c6e6 --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2api_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/api.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/api.hpp file +

+

Macro CUBOS_CORE_API.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2data_2des_2json_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2data_2des_2json_8hpp.html new file mode 100644 index 0000000000..3e46d0a2b9 --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2data_2des_2json_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/des/json.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/des/json.hpp file +

+

Class cubos::core::data::JSONDeserializer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::JSONDeserializer +
+
Deserializer implementation which allows reading data from a JSON object.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2data_2fs_2file_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2data_2fs_2file_8hpp.html new file mode 100644 index 0000000000..38f3d29d3e --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2data_2fs_2file_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/fs/file.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/file.hpp file +

+

Class cubos::core::data::File.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::File +
+
Represents a file in the virtual file system of the engine.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2data_2ser_2json_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2data_2ser_2json_8hpp.html new file mode 100644 index 0000000000..48dbffc76d --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2data_2ser_2json_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/ser/json.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/ser/json.hpp file +

+

Class cubos::core::data::JSONSerializer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::JSONSerializer +
+
Implementation of the abstract Serializer class for serializing to JSON.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2ecs_2entity_2pool_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2ecs_2entity_2pool_8hpp.html new file mode 100644 index 0000000000..42348383f4 --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2ecs_2entity_2pool_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/entity/pool.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/pool.hpp file +

+

Class cubos::core::ecs::EntityPool.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::EntityPool +
+
Manages the creation and destruction of entity identifiers, as well as storing their archetype identifiers.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2geom_2box_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2geom_2box_8hpp.html new file mode 100644 index 0000000000..63f62fb7dd --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2geom_2box_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/geom/box.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/box.hpp file +

+

Class cubos::core::geom::Box.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::geom
+
Geometry module.
+
+
+
+

Classes

+
+
+ struct cubos::core::geom::Box +
+
Represents a box shape.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2geom_2capsule_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2geom_2capsule_8hpp.html new file mode 100644 index 0000000000..61b53a2b18 --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2geom_2capsule_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/geom/capsule.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/capsule.hpp file +

+

Class cubos::core::geom::Capsule.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::geom
+
Geometry module.
+
+
+
+

Classes

+
+
+ struct cubos::core::geom::Capsule +
+
Represents a capsule or sphere shape.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/core_2include_2cubos_2core_2thread_2pool_8hpp.html b/preview/pr-1379/core_2include_2cubos_2core_2thread_2pool_8hpp.html new file mode 100644 index 0000000000..489b0b6ae3 --- /dev/null +++ b/preview/pr-1379/core_2include_2cubos_2core_2thread_2pool_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/thread/pool.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/thread/pool.hpp file +

+

Class cubos::core::thread::ThreadPool.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::thread
+
Threading module.
+
+
+
+

Classes

+
+
+ class cubos::core::thread::ThreadPool +
+
Manages a pool of threads, to which tasks can be submitted.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/cstring_8hpp.html b/preview/pr-1379/cstring_8hpp.html new file mode 100644 index 0000000000..e988a2af3c --- /dev/null +++ b/preview/pr-1379/cstring_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/cstring.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/cstring.hpp file +

+

Reflection declaration for C-strings.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/cubos_8hpp.html b/preview/pr-1379/cubos_8hpp.html new file mode 100644 index 0000000000..ada5e3c873 --- /dev/null +++ b/preview/pr-1379/cubos_8hpp.html @@ -0,0 +1,146 @@ + + + + + core/ecs/cubos.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/cubos.hpp file +

+

Class cubos::core::ecs::Cubos.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::DeltaTime +
+
Resource which stores the time since the last iteration of the main loop started.
+
+ struct cubos::core::ecs::ShouldQuit +
+
Resource used as a flag to indicate whether the main loop should stop running.
+
+ struct cubos::core::ecs::Arguments +
+
Resource which stores the command-line arguments.
+
+ class cubos::core::ecs::Cubos +
+
Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/cursor_8hpp.html b/preview/pr-1379/cursor_8hpp.html new file mode 100644 index 0000000000..223a797990 --- /dev/null +++ b/preview/pr-1379/cursor_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/io/cursor.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/io/cursor.hpp file +

+

Class cubos::core::io::Cursor.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::io
+
Input and output module.
+
+
+
+

Classes

+
+
+ class cubos::core::io::Cursor +
+
Handle for a custom mouse cursor.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/damping_8hpp.html b/preview/pr-1379/damping_8hpp.html new file mode 100644 index 0000000000..5c30e02f3c --- /dev/null +++ b/preview/pr-1379/damping_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/resources/damping.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/resources/damping.hpp file +

+

Resource cubos::engine::Damping.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Damping +
+
Resource which holds the damping value for integration.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/data_8hpp.html b/preview/pr-1379/data_8hpp.html new file mode 100644 index 0000000000..c5f8a73f3d --- /dev/null +++ b/preview/pr-1379/data_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/query/data.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/data.hpp file +

+

Class cubos::core::ecs::QueryData.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+
template<typename... Ts>
+ class cubos::core::ecs::QueryData +
+
Holds the data necessary to execute a query.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/data__inspector_8hpp.html b/preview/pr-1379/data__inspector_8hpp.html new file mode 100644 index 0000000000..d87620d387 --- /dev/null +++ b/preview/pr-1379/data__inspector_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/imgui/data_inspector.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/imgui/data_inspector.hpp file +

+

Resource cubos::engine::DataInspector.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::DataInspector +
+
Resource which allows the user to inspect or modify any reflectable value on the UI.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/debug_8hpp.html b/preview/pr-1379/debug_8hpp.html new file mode 100644 index 0000000000..157606061b --- /dev/null +++ b/preview/pr-1379/debug_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/ser/debug.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/ser/debug.hpp file +

+

Class cubos::core::data::DebugSerializer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::DebugSerializer +
+
Serializer implementation which prints the given data to a stream in a human-readable format not meant to be parsed.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/debugger_8hpp.html b/preview/pr-1379/debugger_8hpp.html new file mode 100644 index 0000000000..e1d91e2aaa --- /dev/null +++ b/preview/pr-1379/debugger_8hpp.html @@ -0,0 +1,120 @@ + + + + + tesseratos/debugger/debugger.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/debugger/debugger.hpp file +

+

Resource tesseratos::Debugger.

+ +
+

Namespaces

+
+
namespace tesseratos
+
Tesseratos namespace.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/deferred__shading_8hpp.html b/preview/pr-1379/deferred__shading_8hpp.html new file mode 100644 index 0000000000..53773501a5 --- /dev/null +++ b/preview/pr-1379/deferred__shading_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/deferred_shading/deferred_shading.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/deferred_shading/deferred_shading.hpp file +

+

Component cubos::engine::DeferredShading.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DeferredShading +
+
Component which stores the Deferred Shading state for a render target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dense_2table_8hpp.html b/preview/pr-1379/dense_2table_8hpp.html new file mode 100644 index 0000000000..3798d6590f --- /dev/null +++ b/preview/pr-1379/dense_2table_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/table/dense/table.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/dense/table.hpp file +

+

Class cubos::core::ecs::DenseTable.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::DenseTable +
+
Stores the dense data associated to entities of a given archetype.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/depth_8hpp.html b/preview/pr-1379/depth_8hpp.html new file mode 100644 index 0000000000..24a8aeee3e --- /dev/null +++ b/preview/pr-1379/depth_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/depth/depth.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/depth/depth.hpp file +

+

Component cubos::engine::RenderDepth.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderDepth +
+
Component which stores the depth texture of a render target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/des_2binary_8hpp.html b/preview/pr-1379/des_2binary_8hpp.html new file mode 100644 index 0000000000..4d2b56661b --- /dev/null +++ b/preview/pr-1379/des_2binary_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/des/binary.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/des/binary.hpp file +

+

Class cubos::core::data::BinaryDeserializer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::BinaryDeserializer +
+
Implementation of the abstract Deserializer class meant to deserialize data written by a BinarySerializer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/deserializer_8hpp.html b/preview/pr-1379/deserializer_8hpp.html new file mode 100644 index 0000000000..7c9209931d --- /dev/null +++ b/preview/pr-1379/deserializer_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/des/deserializer.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/des/deserializer.hpp file +

+

Class cubos::core::data::Deserializer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::Deserializer +
+
Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dictionary_8hpp.html b/preview/pr-1379/dictionary_8hpp.html new file mode 100644 index 0000000000..cb2a1fba7c --- /dev/null +++ b/preview/pr-1379/dictionary_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/reflection/traits/dictionary.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/dictionary.hpp file +

+

Class cubos::core::reflection::DictionaryTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::DictionaryTrait +
+
Exposes dictionary-like functionality of a type.
+
+ struct cubos::core::reflection::DictionaryTrait::Entry +
+
Output structure for the iterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_0835e003fa277f66ce5cf543d578f6a2.html b/preview/pr-1379/dir_0835e003fa277f66ce5cf543d578f6a2.html new file mode 100644 index 0000000000..da2ee7f42d --- /dev/null +++ b/preview/pr-1379/dir_0835e003fa277f66ce5cf543d578f6a2.html @@ -0,0 +1,136 @@ + + + + + engine/assets/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/ directory +

+

Assets plugin directory.

+ +
+

Directories

+
+
directory bridges/
+
cubos::engine::AssetBridge implementations directory.
+
+
+
+

Files

+
+
file asset.hpp
+
Classes cubos::engine::AnyAsset and cubos::engine::Asset.
+
file assets.hpp
+
Resource cubos::engine::Assets.
+
file bridge.hpp
+
Class cubos::engine::AssetBridge.
+
file meta.hpp
+
Class cubos::engine::AssetMeta.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_09b27b38bda38a38c8db8e2b7eccb1c7.html b/preview/pr-1379/dir_09b27b38bda38a38c8db8e2b7eccb1c7.html new file mode 100644 index 0000000000..d4680c2705 --- /dev/null +++ b/preview/pr-1379/dir_09b27b38bda38a38c8db8e2b7eccb1c7.html @@ -0,0 +1,122 @@ + + + + + engine/render/bloom/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/bloom/ directory +

+

Bloom plugin directory.

+ +
+

Files

+
+
file bloom.hpp
+
Component cubos::engine::Bloom.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_0b39c986537c7114081f36bbdae17547.html b/preview/pr-1379/dir_0b39c986537c7114081f36bbdae17547.html new file mode 100644 index 0000000000..dac99681b4 --- /dev/null +++ b/preview/pr-1379/dir_0b39c986537c7114081f36bbdae17547.html @@ -0,0 +1,132 @@ + + + + + core/ecs/table/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/ directory +

+

Table directory.

+ +
+

Directories

+
+
directory dense/
+
Dense storage types.
+
directory sparse_relation/
+
Sparse relation storage types.
+
+
+
+

Files

+
+
file column.hpp
+
Struct cubos::core::ecs::DenseTableId.
+
file tables.hpp
+
Class cubos::core::ecs::Tables.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_0c7f3d8946d52cecc547acb4b9830a15.html b/preview/pr-1379/dir_0c7f3d8946d52cecc547acb4b9830a15.html new file mode 100644 index 0000000000..19363e2030 --- /dev/null +++ b/preview/pr-1379/dir_0c7f3d8946d52cecc547acb4b9830a15.html @@ -0,0 +1,126 @@ + + + + + engine/render/voxels/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/voxels/ directory +

+

Render Voxels plugin directory.

+ +
+

Files

+
+
file grid.hpp
+
Component cubos::engine::RenderVoxelGrid.
+
file load.hpp
+
Component cubos::engine::LoadRenderVoxels.
+
file palette.hpp
+
Resource cubos::engine::RenderPalette.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_11cfbdb00ac213b58382581863cabf17.html b/preview/pr-1379/dir_11cfbdb00ac213b58382581863cabf17.html new file mode 100644 index 0000000000..b6aa77d61e --- /dev/null +++ b/preview/pr-1379/dir_11cfbdb00ac213b58382581863cabf17.html @@ -0,0 +1,122 @@ + + + + + engine/tools/selection/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/selection/ directory +

+

Selection plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file selection.hpp
+
Resource cubos::engine::Selection.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_13f5e2b140054f355a8f8a8c95923a6a.html b/preview/pr-1379/dir_13f5e2b140054f355a8f8a8c95923a6a.html new file mode 100644 index 0000000000..3c19f8db46 --- /dev/null +++ b/preview/pr-1379/dir_13f5e2b140054f355a8f8a8c95923a6a.html @@ -0,0 +1,162 @@ + + + + + engine/render/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/ directory +

+

Render module.

+ +
+

Directories

+
+
directory bloom/
+
Bloom plugin directory.
+
directory camera/
+
Camera plugin directory.
+
directory cascaded_shadow_maps/
+
Cascaded shadow maps plugin directory.
+
directory cascaded_shadow_maps_rasterizer/
+
Cascaded shadow maps rasterizer plugin directory.
+
directory defaults/
+
Defaults plugin directory.
+
directory deferred_shading/
+
Deferred Shading plugin directory.
+
directory depth/
+
Depth plugin directory.
+
directory g_buffer/
+
G-Buffer plugin directory.
+
directory g_buffer_rasterizer/
+
G-Buffer Rasterizer plugin directory.
+
directory hdr/
+
HDR plugin directory.
+
directory lights/
+
Lights plugin directory.
+
directory mesh/
+
Mesh plugin directory.
+
directory picker/
+
RenderPicker plugin directory.
+
directory shader/
+
Shader plugin directory.
+
directory shadow_atlas/
+
Shadow atlas plugin directory.
+
directory shadow_atlas_rasterizer/
+
Shadow atlas rasterizer plugin directory.
+
directory shadows/
+
Shadows plugin directory.
+
directory split_screen/
+
Splitscreen plugin directory.
+
directory ssao/
+
Screen Space Ambient Occlusion plugin directory.
+
directory target/
+
Render Target plugin directory.
+
directory tone_mapping/
+
Tone Mapping plugin directory.
+
directory voxels/
+
Render Voxels plugin directory.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_177ee48433dab19643d478e7bbffc374.html b/preview/pr-1379/dir_177ee48433dab19643d478e7bbffc374.html new file mode 100644 index 0000000000..8b144726a3 --- /dev/null +++ b/preview/pr-1379/dir_177ee48433dab19643d478e7bbffc374.html @@ -0,0 +1,122 @@ + + + + + tesseratos/debugger/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/debugger/ directory +

+

Debugger plugin directory.

+ +
+

Files

+
+
file debugger.hpp
+
Resource tesseratos::Debugger.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_1849b6590c20a7c40f18c0337f505edf.html b/preview/pr-1379/dir_1849b6590c20a7c40f18c0337f505edf.html new file mode 100644 index 0000000000..2ec41f48c6 --- /dev/null +++ b/preview/pr-1379/dir_1849b6590c20a7c40f18c0337f505edf.html @@ -0,0 +1,142 @@ + + + + + core/ecs/system/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/ directory +

+

System directory.

+ +
+

Directories

+
+
directory arguments/
+
Arguments directory.
+
+
+
+

Files

+
+
file access.hpp
+
Struct cubos::core::ecs::SystemAccess.
+
file fetcher.hpp
+
Class cubos::core::ecs::SystemFetcher.
+
file options.hpp
+
Struct cubos::core::ecs::SystemOptions.
+
file planner.hpp
+
Class cubos::core::ecs::Planner.
+
file registry.hpp
+
Class cubos::core::ecs::SystemRegistry.
+
file schedule.hpp
+
Class cubos::core::ecs::Schedule.
+
file system.hpp
+
Class cubos::core::ecs::System.
+
file tag.hpp
+
Class cubos::core::ecs::Tag.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_1df0034ddb3bcba614277f72ec51c76d.html b/preview/pr-1379/dir_1df0034ddb3bcba614277f72ec51c76d.html new file mode 100644 index 0000000000..a1106f433c --- /dev/null +++ b/preview/pr-1379/dir_1df0034ddb3bcba614277f72ec51c76d.html @@ -0,0 +1,140 @@ + + + + + engine/ui/canvas/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/ directory +

+

Canvas plugin directory.

+ +
+

Files

+
+
file canvas.hpp
+
Component cubos::engine::UICanvas.
+
file draw_list.hpp
+
Class cubos::engine::UIDrawList.
+
file element.hpp
+
Component cubos::engine::UIElement.
+
file expand.hpp
+
Component cubos::engine::UIExpand.
+
file horizontal_stretch.hpp
+
Component cubos::engine::UIHorizontalStretch.
+
file keep_pixel_size.hpp
+
Component cubos::engine::UIKeepPixelSize.
+
file match_height.hpp
+
Component cubos::engine::UIMatchHeight.
+
file match_width.hpp
+
Component cubos::engine::UIMatchWidth.
+
file native_aspect_ratio.hpp
+
Component cubos::engine::UINativeAspectRatio.
+
file plugin.hpp
+
Plugin entry point.
+
file vertical_stretch.hpp
+
Component cubos::engine::UIVerticalStretch.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_1fe0540947f1155f1757713697a54f9f.html b/preview/pr-1379/dir_1fe0540947f1155f1757713697a54f9f.html new file mode 100644 index 0000000000..5eb3b851c7 --- /dev/null +++ b/preview/pr-1379/dir_1fe0540947f1155f1757713697a54f9f.html @@ -0,0 +1,122 @@ + + + + + engine/tools/toolbox/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/toolbox/ directory +

+

Toolbox plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file toolbox.hpp
+
Resource cubos::engine::Toolbox.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_23fcce69fcc2a3ecb2dfa75692de6094.html b/preview/pr-1379/dir_23fcce69fcc2a3ecb2dfa75692de6094.html new file mode 100644 index 0000000000..7f2780ea3b --- /dev/null +++ b/preview/pr-1379/dir_23fcce69fcc2a3ecb2dfa75692de6094.html @@ -0,0 +1,124 @@ + + + + + engine/render/shader/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shader/ directory +

+

Shader plugin directory.

+ +
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::ShaderBridge.
+
file plugin.hpp
+
Plugin entry point.
+
file shader.hpp
+
Class cubos::engine::Shader.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_26a5878ebb5e9988b6ffa6f152301254.html b/preview/pr-1379/dir_26a5878ebb5e9988b6ffa6f152301254.html new file mode 100644 index 0000000000..1d15382aa8 --- /dev/null +++ b/preview/pr-1379/dir_26a5878ebb5e9988b6ffa6f152301254.html @@ -0,0 +1,126 @@ + + + + + core/ecs/query/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/ directory +

+

Query directory.

+ +
+

Files

+
+
file data.hpp
+
Class cubos::core::ecs::QueryData.
+
file fetcher.hpp
+
Class cubos::core::ecs::QueryFetcher.
+
file filter.hpp
+
Class cubos::core::ecs::QueryFilter.
+
file term.hpp
+
Struct cubos::core::ecs::QueryTerm.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_2827d018769f4a802aae3f2d6321447f.html b/preview/pr-1379/dir_2827d018769f4a802aae3f2d6321447f.html new file mode 100644 index 0000000000..523f45e6fb --- /dev/null +++ b/preview/pr-1379/dir_2827d018769f4a802aae3f2d6321447f.html @@ -0,0 +1,120 @@ + + + + + engine/tools/play_pause/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/play_pause/ directory +

+

Play Pause plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_2a3f20446d92cb0b384d0cf4f4d26d60.html b/preview/pr-1379/dir_2a3f20446d92cb0b384d0cf4f4d26d60.html new file mode 100644 index 0000000000..4c0b66de41 --- /dev/null +++ b/preview/pr-1379/dir_2a3f20446d92cb0b384d0cf4f4d26d60.html @@ -0,0 +1,120 @@ + + + + + engine/window/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/window/ directory +

+

Window plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_2db6703e4efb80ffed6492f96c6c4431.html b/preview/pr-1379/dir_2db6703e4efb80ffed6492f96c6c4431.html new file mode 100644 index 0000000000..5626f7a84b --- /dev/null +++ b/preview/pr-1379/dir_2db6703e4efb80ffed6492f96c6c4431.html @@ -0,0 +1,120 @@ + + + + + engine/tools/console/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/console/ directory +

+

Console plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_3504744c369d3ac8de67ffae1d44d2b4.html b/preview/pr-1379/dir_3504744c369d3ac8de67ffae1d44d2b4.html new file mode 100644 index 0000000000..33174b0714 --- /dev/null +++ b/preview/pr-1379/dir_3504744c369d3ac8de67ffae1d44d2b4.html @@ -0,0 +1,122 @@ + + + + + engine/fixed_step/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/fixed_step/ directory +

+

Fixed Time Step plugin directory.

+ +
+

Files

+
+
file fixed_delta_time.hpp
+
Resource cubos::engine::FixedDeltaTime.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_36ae399c191ecbb6a79e4b7a36274912.html b/preview/pr-1379/dir_36ae399c191ecbb6a79e4b7a36274912.html new file mode 100644 index 0000000000..51dffd14d2 --- /dev/null +++ b/preview/pr-1379/dir_36ae399c191ecbb6a79e4b7a36274912.html @@ -0,0 +1,120 @@ + + + + + cubos/api/engine/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos/api/engine/ directory +

+

Engine API module.

+ +
+

Files

+
+
file api.h
+
Macro CUBOS_ENGINE_C_API.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_3764e76d8ec4e739fc24b5bb90adc3af.html b/preview/pr-1379/dir_3764e76d8ec4e739fc24b5bb90adc3af.html new file mode 100644 index 0000000000..9bb767fe21 --- /dev/null +++ b/preview/pr-1379/dir_3764e76d8ec4e739fc24b5bb90adc3af.html @@ -0,0 +1,128 @@ + + + + + core/ecs/entity/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/ directory +

+

Entity directory.

+ +
+

Files

+
+
file archetype_graph.hpp
+
Class cubos::core::ecs::ArchetypeGraph.
+
file archetype_id.hpp
+
Struct cubos::core::ecs::ArchetypeId.
+
file entity.hpp
+
Struct cubos::core::ecs::Entity.
+
file hash.hpp
+
Struct cubos::core::ecs::EntityHash.
+
file pool.hpp
+
Class cubos::core::ecs::EntityPool.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_38aac728ad33877355e223e23ac4ab7a.html b/preview/pr-1379/dir_38aac728ad33877355e223e23ac4ab7a.html new file mode 100644 index 0000000000..734f11544e --- /dev/null +++ b/preview/pr-1379/dir_38aac728ad33877355e223e23ac4ab7a.html @@ -0,0 +1,126 @@ + + + + + core/data/ser/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/ser/ directory +

+

Serialization directory.

+ +
+

Files

+
+
file binary.hpp
+
Class cubos::core::data::BinarySerializer.
+
file debug.hpp
+
Class cubos::core::data::DebugSerializer.
+
file json.hpp
+
Class cubos::core::data::JSONSerializer.
+
file serializer.hpp
+
Class cubos::core::data::Serializer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_38e9fb064544086d3594e70a41f6b257.html b/preview/pr-1379/dir_38e9fb064544086d3594e70a41f6b257.html new file mode 100644 index 0000000000..e688e15bc6 --- /dev/null +++ b/preview/pr-1379/dir_38e9fb064544086d3594e70a41f6b257.html @@ -0,0 +1,124 @@ + + + + + engine/scene/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/scene/ directory +

+

Scene plugin directory.

+ +
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::SceneBridge.
+
file plugin.hpp
+
Plugin entry point.
+
file scene.hpp
+
Class cubos::engine::Scene.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_459dda10180a6131eb62bc74e02d0b6e.html b/preview/pr-1379/dir_459dda10180a6131eb62bc74e02d0b6e.html new file mode 100644 index 0000000000..9d15d48777 --- /dev/null +++ b/preview/pr-1379/dir_459dda10180a6131eb62bc74e02d0b6e.html @@ -0,0 +1,124 @@ + + + + + engine/imgui/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/imgui/ directory +

+

ImGui integration ImGui plugin directory.

+ +
+

Files

+
+
file data_inspector.hpp
+
Resource cubos::engine::DataInspector.
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::ImGuiTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_469a1cbbeb8e9adaf7b2463b187d9ad1.html b/preview/pr-1379/dir_469a1cbbeb8e9adaf7b2463b187d9ad1.html new file mode 100644 index 0000000000..e4646aa47a --- /dev/null +++ b/preview/pr-1379/dir_469a1cbbeb8e9adaf7b2463b187d9ad1.html @@ -0,0 +1,124 @@ + + + + + core/ecs/system/arguments/event/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/arguments/event/ directory +

+

Event arguments.

+ +
+

Files

+
+
file pipe.hpp
+
Resource cubos::core::ecs::EventPipe.
+
file reader.hpp
+
Class cubos::core::ecs::EventReader.
+
file writer.hpp
+
Class cubos::core::ecs::EventWriter.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_46c6a4a310169812045f09ba6135aa36.html b/preview/pr-1379/dir_46c6a4a310169812045f09ba6135aa36.html new file mode 100644 index 0000000000..d5158d6ac7 --- /dev/null +++ b/preview/pr-1379/dir_46c6a4a310169812045f09ba6135aa36.html @@ -0,0 +1,124 @@ + + + + + engine/collisions/shapes/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/shapes/ directory +

+

Collision shapes components directory.

+ +
+

Files

+
+
file box.hpp
+
Component cubos::engine::BoxCollisionShape.
+
file capsule.hpp
+
Component cubos::engine::CapsuleCollisionShape.
+
file voxel.hpp
+
Component cubos::engine::VoxelCollisionShape.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_4b5164e2977dbb20cc762d7848ca7aa4.html b/preview/pr-1379/dir_4b5164e2977dbb20cc762d7848ca7aa4.html new file mode 100644 index 0000000000..60fb667f2d --- /dev/null +++ b/preview/pr-1379/dir_4b5164e2977dbb20cc762d7848ca7aa4.html @@ -0,0 +1,122 @@ + + + + + engine/render/g_buffer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer/ directory +

+

G-Buffer plugin directory.

+ +
+

Files

+
+
file g_buffer.hpp
+
Component cubos::engine::GBuffer.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_58bcc439fef7d22afea6648bed6b7e2f.html b/preview/pr-1379/dir_58bcc439fef7d22afea6648bed6b7e2f.html new file mode 100644 index 0000000000..07818356a6 --- /dev/null +++ b/preview/pr-1379/dir_58bcc439fef7d22afea6648bed6b7e2f.html @@ -0,0 +1,120 @@ + + + + + engine/tools/ecs_statistics/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/ecs_statistics/ directory +

+

ECS Statistics plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_5bfb929504efd2928af00ae5299c5a8d.html b/preview/pr-1379/dir_5bfb929504efd2928af00ae5299c5a8d.html new file mode 100644 index 0000000000..b4f9b6400c --- /dev/null +++ b/preview/pr-1379/dir_5bfb929504efd2928af00ae5299c5a8d.html @@ -0,0 +1,128 @@ + + + + + engine/render/camera/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/camera/ directory +

+

Camera plugin directory.

+ +
+

Files

+
+
file camera.hpp
+
Component cubos::engine::Camera.
+
file draws_to.hpp
+
Relation cubos::engine::DrawsTo.
+
file orthographic.hpp
+
Component cubos::engine::OrthographicCamera.
+
file perspective.hpp
+
Component cubos::engine::PerspectiveCamera.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_5f701044e65d6c264a6c1dc66b1052c2.html b/preview/pr-1379/dir_5f701044e65d6c264a6c1dc66b1052c2.html new file mode 100644 index 0000000000..74e469ffdb --- /dev/null +++ b/preview/pr-1379/dir_5f701044e65d6c264a6c1dc66b1052c2.html @@ -0,0 +1,132 @@ + + + + + engine/transform/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/transform/ directory +

+

Transform plugin directory.

+ +
+

Files

+
+
file child_of.hpp
+
Relation cubos::engine::ChildOf.
+
file local_to_parent.hpp
+
Component cubos::engine::LocalToParent.
+
file local_to_world.hpp
+
Component cubos::engine::LocalToWorld.
+
file plugin.hpp
+
Plugin entry point.
+
file position.hpp
+
Component cubos::engine::Position.
+
file rotation.hpp
+
Component cubos::engine::Rotation.
+
file scale.hpp
+
Component cubos::engine::Scale.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_64c0bc212f9cc506a5640976d13811b9.html b/preview/pr-1379/dir_64c0bc212f9cc506a5640976d13811b9.html new file mode 100644 index 0000000000..c467168d16 --- /dev/null +++ b/preview/pr-1379/dir_64c0bc212f9cc506a5640976d13811b9.html @@ -0,0 +1,122 @@ + + + + + core/ecs/observer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/observer/ directory +

+

Observer directory.

+ +
+

Files

+
+
file id.hpp
+
Struct cubos::core::ecs::ObserverId.
+
file observers.hpp
+
Class cubos::core::ecs::Observers.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_664a4fefda8991295bf9834347bf2d7a.html b/preview/pr-1379/dir_664a4fefda8991295bf9834347bf2d7a.html new file mode 100644 index 0000000000..009c8f097e --- /dev/null +++ b/preview/pr-1379/dir_664a4fefda8991295bf9834347bf2d7a.html @@ -0,0 +1,122 @@ + + + + + tesseratos/asset_explorer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/asset_explorer/ directory +

+

Asset explorer plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file popup.hpp
+
Utility function to show up a popup containing assets with given type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_66ee469e7479b8bd292626243a0daea9.html b/preview/pr-1379/dir_66ee469e7479b8bd292626243a0daea9.html new file mode 100644 index 0000000000..b549a592d3 --- /dev/null +++ b/preview/pr-1379/dir_66ee469e7479b8bd292626243a0daea9.html @@ -0,0 +1,130 @@ + + + + + tesseratos/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/ directory +

+

Tesseratos module.

+ +
+

Directories

+
+
directory asset_explorer/
+
Asset explorer plugin directory.
+
directory debugger/
+
Debugger plugin directory.
+
directory importer/
+
Asset explorer plugin directory.
+
directory project/
+
Project plugin directory.
+
directory scene_editor/
+
Scene editor plugin directory.
+
directory voxel_palette_editor/
+
Palette editor plugin directory.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_69c88e5af9faf72eaf159ee3e83d9db2.html b/preview/pr-1379/dir_69c88e5af9faf72eaf159ee3e83d9db2.html new file mode 100644 index 0000000000..86a0546df6 --- /dev/null +++ b/preview/pr-1379/dir_69c88e5af9faf72eaf159ee3e83d9db2.html @@ -0,0 +1,136 @@ + + + + + core/ecs/system/arguments/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/arguments/ directory +

+

Arguments directory.

+ +
+

Directories

+
+
directory event/
+
Event arguments.
+
+
+
+

Files

+
+
file commands.hpp
+
Class cubos::core::ecs::Commands.
+
file plugins.hpp
+
Class cubos::core::ecs::Plugins.
+
file query.hpp
+
Class cubos::core::ecs::Query.
+
file resources.hpp
+
Resource system argument specializations.
+
file world.hpp
+
World system argument specializations.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6b0d37726886bfe27960609e7ba49868.html b/preview/pr-1379/dir_6b0d37726886bfe27960609e7ba49868.html new file mode 100644 index 0000000000..52493d34bd --- /dev/null +++ b/preview/pr-1379/dir_6b0d37726886bfe27960609e7ba49868.html @@ -0,0 +1,122 @@ + + + + + engine/render/split_screen/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/split_screen/ directory +

+

Splitscreen plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file split_screen.hpp
+
Component cubos::engine::SplitScreen.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6c4c9e5f04768b915dbc2edba08d4f5c.html b/preview/pr-1379/dir_6c4c9e5f04768b915dbc2edba08d4f5c.html new file mode 100644 index 0000000000..562264c1b3 --- /dev/null +++ b/preview/pr-1379/dir_6c4c9e5f04768b915dbc2edba08d4f5c.html @@ -0,0 +1,124 @@ + + + + + core/data/des/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/des/ directory +

+

Deserialization directory.

+ +
+

Files

+
+
file binary.hpp
+
Class cubos::core::data::BinaryDeserializer.
+
file deserializer.hpp
+
Class cubos::core::data::Deserializer.
+
file json.hpp
+
Class cubos::core::data::JSONDeserializer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6c897dd97bedf3914ee8a4d9f7f6549c.html b/preview/pr-1379/dir_6c897dd97bedf3914ee8a4d9f7f6549c.html new file mode 100644 index 0000000000..ba7c91127d --- /dev/null +++ b/preview/pr-1379/dir_6c897dd97bedf3914ee8a4d9f7f6549c.html @@ -0,0 +1,144 @@ + + + + + core/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ directory +

+

Core module.

+ +
+

Directories

+
+
directory al/
+
Audio module.
+
directory data/
+
Data module.
+
directory ecs/
+
ECS module.
+
directory geom/
+
Geometry module.
+
directory gl/
+
Graphics module.
+
directory io/
+
Input and output module.
+
directory memory/
+
Memory module.
+
directory reflection/
+
Reflection module.
+
directory thread/
+
Threading module.
+
+
+
+

Files

+
+
file api.hpp
+
Macro CUBOS_CORE_API.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6e7fefd5d33489e77ed24a475a1b2d04.html b/preview/pr-1379/dir_6e7fefd5d33489e77ed24a475a1b2d04.html new file mode 100644 index 0000000000..7e3437fa20 --- /dev/null +++ b/preview/pr-1379/dir_6e7fefd5d33489e77ed24a475a1b2d04.html @@ -0,0 +1,122 @@ + + + + + engine/utils/free_camera/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/utils/free_camera/ directory +

+

Free Camera plugin directory.

+ +
+

Files

+
+
file controller.hpp
+
Component cubos::engine::FreeCameraController.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6f143c86fb405225577d25476fe3714b.html b/preview/pr-1379/dir_6f143c86fb405225577d25476fe3714b.html new file mode 100644 index 0000000000..22f22e36ec --- /dev/null +++ b/preview/pr-1379/dir_6f143c86fb405225577d25476fe3714b.html @@ -0,0 +1,128 @@ + + + + + engine/render/lights/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/lights/ directory +

+

Lights plugin directory.

+ +
+

Files

+
+
file directional.hpp
+
Component cubos::engine::DirectionalLight.
+
file environment.hpp
+
Resource cubos::engine::RenderEnvironment.
+
file plugin.hpp
+
Plugin entry point.
+
file point.hpp
+
Component cubos::engine::PointLight.
+
file spot.hpp
+
Component cubos::engine::SpotLight.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6f2fb1e9f25fad7fd8fdc6632a3a7bd0.html b/preview/pr-1379/dir_6f2fb1e9f25fad7fd8fdc6632a3a7bd0.html new file mode 100644 index 0000000000..5cc196ab12 --- /dev/null +++ b/preview/pr-1379/dir_6f2fb1e9f25fad7fd8fdc6632a3a7bd0.html @@ -0,0 +1,120 @@ + + + + + engine/render/cascaded_shadow_maps_rasterizer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/cascaded_shadow_maps_rasterizer/ directory +

+

Cascaded shadow maps rasterizer plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_6fb3a959c473bcaa8e87a7f48a855643.html b/preview/pr-1379/dir_6fb3a959c473bcaa8e87a7f48a855643.html new file mode 100644 index 0000000000..3ff8781d7a --- /dev/null +++ b/preview/pr-1379/dir_6fb3a959c473bcaa8e87a7f48a855643.html @@ -0,0 +1,120 @@ + + + + + cubos/api/core/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos/api/core/ directory +

+

Core API module.

+ +
+

Files

+
+
file api.h
+
Macro CUBOS_CORE_C_API.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_72574b031b178e1a49d0d05377e0afd9.html b/preview/pr-1379/dir_72574b031b178e1a49d0d05377e0afd9.html new file mode 100644 index 0000000000..9e66bbd5f6 --- /dev/null +++ b/preview/pr-1379/dir_72574b031b178e1a49d0d05377e0afd9.html @@ -0,0 +1,120 @@ + + + + + engine/tools/collider_gizmos/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/collider_gizmos/ directory +

+

Collider Gizmos plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_7376bacbd9e6243f425bd4c56d48edd9.html b/preview/pr-1379/dir_7376bacbd9e6243f425bd4c56d48edd9.html new file mode 100644 index 0000000000..703d44a058 --- /dev/null +++ b/preview/pr-1379/dir_7376bacbd9e6243f425bd4c56d48edd9.html @@ -0,0 +1,126 @@ + + + + + core/io/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/io/ directory +

+

Input and output module.

+ +
+

Files

+
+
file cursor.hpp
+
Class cubos::core::io::Cursor.
+
file gamepad.hpp
+
Struct cubos::core::io::GamepadState and related enums.
+
file keyboard.hpp
+
Enums cubos::core::io::Key and cubos::core::io::Modifiers.
+
file window.hpp
+
Class cubos::core::io::Window and related types.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_73cd920be1d9b25db5feb4d2a202c641.html b/preview/pr-1379/dir_73cd920be1d9b25db5feb4d2a202c641.html new file mode 100644 index 0000000000..cd9d262480 --- /dev/null +++ b/preview/pr-1379/dir_73cd920be1d9b25db5feb4d2a202c641.html @@ -0,0 +1,136 @@ + + + + + core/reflection/external/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/ directory +

+

Reflection declarations for external types.

+ +
+

Files

+
+
file cstring.hpp
+
Reflection declaration for C-strings.
+
file glm.hpp
+
Reflection declarations for external glm types.
+
file map.hpp
+
Reflection declaration for std::map.
+
file primitives.hpp
+
Reflection declarations for primitive types.
+
file string.hpp
+
Reflection declaration for std::string.
+
file string_view.hpp
+
Reflection declaration for std::string_view.
+
file unordered_map.hpp
+
Reflection declaration for std::unordered_map.
+
file uuid.hpp
+
Reflection declaration for uuids::uuid.
+
file vector.hpp
+
Reflection declaration for std::vector.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_7481e7c81bc3e1c88ceca30cd652cd13.html b/preview/pr-1379/dir_7481e7c81bc3e1c88ceca30cd652cd13.html new file mode 100644 index 0000000000..6cd543813c --- /dev/null +++ b/preview/pr-1379/dir_7481e7c81bc3e1c88ceca30cd652cd13.html @@ -0,0 +1,122 @@ + + + + + engine/render/depth/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/depth/ directory +

+

Depth plugin directory.

+ +
+

Files

+
+
file depth.hpp
+
Component cubos::engine::RenderDepth.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_760e40915e75c3ed62a13dde84a9d084.html b/preview/pr-1379/dir_760e40915e75c3ed62a13dde84a9d084.html new file mode 100644 index 0000000000..64d5815411 --- /dev/null +++ b/preview/pr-1379/dir_760e40915e75c3ed62a13dde84a9d084.html @@ -0,0 +1,120 @@ + + + + + engine/render/cascaded_shadow_maps/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/cascaded_shadow_maps/ directory +

+

Cascaded shadow maps plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_764b6913e5a035b506325f3918f13ed7.html b/preview/pr-1379/dir_764b6913e5a035b506325f3918f13ed7.html new file mode 100644 index 0000000000..409bcd87ce --- /dev/null +++ b/preview/pr-1379/dir_764b6913e5a035b506325f3918f13ed7.html @@ -0,0 +1,120 @@ + + + + + engine/tools/world_inspector/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/world_inspector/ directory +

+

World Inspector plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_7655738dfda0c2f560bc46cf945f3e7d.html b/preview/pr-1379/dir_7655738dfda0c2f560bc46cf945f3e7d.html new file mode 100644 index 0000000000..6b06892cc3 --- /dev/null +++ b/preview/pr-1379/dir_7655738dfda0c2f560bc46cf945f3e7d.html @@ -0,0 +1,120 @@ + + + + + tesseratos/importer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/importer/ directory +

+

Asset explorer plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_76725f6eeb0dc8b6973b8d5f1645994e.html b/preview/pr-1379/dir_76725f6eeb0dc8b6973b8d5f1645994e.html new file mode 100644 index 0000000000..eb63154a8b --- /dev/null +++ b/preview/pr-1379/dir_76725f6eeb0dc8b6973b8d5f1645994e.html @@ -0,0 +1,122 @@ + + + + + engine/ui/color_rect/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/color_rect/ directory +

+

Color Rect plugin directory.

+ +
+

Files

+
+
file color_rect.hpp
+
Component cubos::engine::UIColorRect.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_79f402fdd7bbb1d73f9fd1aa85f618da.html b/preview/pr-1379/dir_79f402fdd7bbb1d73f9fd1aa85f618da.html new file mode 100644 index 0000000000..e04d651c00 --- /dev/null +++ b/preview/pr-1379/dir_79f402fdd7bbb1d73f9fd1aa85f618da.html @@ -0,0 +1,130 @@ + + + + + core/data/fs/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/ directory +

+

Filesystem utilities directory.

+ +
+

Files

+
+
file archive.hpp
+
Class cubos::core::data::Archive.
+
file embedded_archive.hpp
+
Class cubos::core::data::EmbeddedArchive.
+
file file.hpp
+
Class cubos::core::data::File.
+
file file_stream.hpp
+
Class cubos::core::data::FileStream.
+
file file_system.hpp
+
Class cubos::core::data::FileSystem.
+
file standard_archive.hpp
+
Class cubos::core::data::StandardArchive.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_7b909ba8d9da7f57f6483ac5a4ecdca1.html b/preview/pr-1379/dir_7b909ba8d9da7f57f6483ac5a4ecdca1.html new file mode 100644 index 0000000000..95ad11ae92 --- /dev/null +++ b/preview/pr-1379/dir_7b909ba8d9da7f57f6483ac5a4ecdca1.html @@ -0,0 +1,126 @@ + + + + + engine/render/mesh/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/mesh/ directory +

+

Mesh plugin directory.

+ +
+

Files

+
+
file mesh.hpp
+
Component cubos::engine::RenderMesh.
+
file plugin.hpp
+
Plugin entry point.
+
file pool.hpp
+
Resource cubos::engine::RenderMeshPool.
+
file vertex.hpp
+
Struct cubos::engine::RenderMeshVeretx.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_813047b950d372893fd1f8cd570e3b39.html b/preview/pr-1379/dir_813047b950d372893fd1f8cd570e3b39.html new file mode 100644 index 0000000000..11836883e3 --- /dev/null +++ b/preview/pr-1379/dir_813047b950d372893fd1f8cd570e3b39.html @@ -0,0 +1,122 @@ + + + + + engine/render/shadow_atlas/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadow_atlas/ directory +

+

Shadow atlas plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file shadow_atlas.hpp
+
Resource cubos::engine::ShadowAtlas.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_8244526c0e804a7f60caacc8241c20e8.html b/preview/pr-1379/dir_8244526c0e804a7f60caacc8241c20e8.html new file mode 100644 index 0000000000..038fc6c202 --- /dev/null +++ b/preview/pr-1379/dir_8244526c0e804a7f60caacc8241c20e8.html @@ -0,0 +1,122 @@ + + + + + engine/render/tone_mapping/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/tone_mapping/ directory +

+

Tone Mapping plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file tone_mapping.hpp
+
Component cubos::engine::ToneMapping.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_85f1b5bc6fb8e602e74068211760bfae.html b/preview/pr-1379/dir_85f1b5bc6fb8e602e74068211760bfae.html new file mode 100644 index 0000000000..362b8ed6ac --- /dev/null +++ b/preview/pr-1379/dir_85f1b5bc6fb8e602e74068211760bfae.html @@ -0,0 +1,138 @@ + + + + + core/reflection/traits/ directory | Cubos Docs + + + + + + + +
+
+ +
+ + + + + + diff --git a/preview/pr-1379/dir_8711f680e2d25dedddc79c2be2b1fda2.html b/preview/pr-1379/dir_8711f680e2d25dedddc79c2be2b1fda2.html new file mode 100644 index 0000000000..e580e1b8bb --- /dev/null +++ b/preview/pr-1379/dir_8711f680e2d25dedddc79c2be2b1fda2.html @@ -0,0 +1,122 @@ + + + + + engine/settings/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/settings/ directory +

+

Settings plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file settings.hpp
+
Class cubos::engine::Settings.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_8e5f84d20b1aa89c94160461e78e26c4.html b/preview/pr-1379/dir_8e5f84d20b1aa89c94160461e78e26c4.html new file mode 100644 index 0000000000..ad81539fbf --- /dev/null +++ b/preview/pr-1379/dir_8e5f84d20b1aa89c94160461e78e26c4.html @@ -0,0 +1,130 @@ + + + + + engine/input/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/ directory +

+

Input plugin directory.

+ +
+

Files

+
+
file action.hpp
+
Class cubos::engine::InputAction.
+
file axis.hpp
+
Class cubos::engine::InputAxis.
+
file bindings.hpp
+
Class cubos::engine::InputBindings.
+
file combination.hpp
+
Class cubos::engine::InputCombination.
+
file input.hpp
+
Resource cubos::engine::Input.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_92ebc664f32c6dcbbbb45cff447e468b.html b/preview/pr-1379/dir_92ebc664f32c6dcbbbb45cff447e468b.html new file mode 100644 index 0000000000..a835b8f2e8 --- /dev/null +++ b/preview/pr-1379/dir_92ebc664f32c6dcbbbb45cff447e468b.html @@ -0,0 +1,122 @@ + + + + + engine/render/deferred_shading/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/deferred_shading/ directory +

+

Deferred Shading plugin directory.

+ +
+

Files

+
+
file deferred_shading.hpp
+
Component cubos::engine::DeferredShading.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_95549d37735ad5b142799f042eef0d37.html b/preview/pr-1379/dir_95549d37735ad5b142799f042eef0d37.html new file mode 100644 index 0000000000..df8d6d64f2 --- /dev/null +++ b/preview/pr-1379/dir_95549d37735ad5b142799f042eef0d37.html @@ -0,0 +1,124 @@ + + + + + core/data/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/ directory +

+

Data module.

+ +
+

Directories

+
+
directory des/
+
Deserialization directory.
+
directory fs/
+
Filesystem utilities directory.
+
directory ser/
+
Serialization directory.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_98bd0872c878d6fa2d8a66c2174847b1.html b/preview/pr-1379/dir_98bd0872c878d6fa2d8a66c2174847b1.html new file mode 100644 index 0000000000..a8e11130ab --- /dev/null +++ b/preview/pr-1379/dir_98bd0872c878d6fa2d8a66c2174847b1.html @@ -0,0 +1,122 @@ + + + + + tesseratos/project/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/project/ directory +

+

Project plugin directory.

+ +
+

Files

+
+
file manager.hpp
+
System argument tesseratos::ProjectManager.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_9ab085ddc2d9241d457700c933c55f50.html b/preview/pr-1379/dir_9ab085ddc2d9241d457700c933c55f50.html new file mode 100644 index 0000000000..fb408d4fb1 --- /dev/null +++ b/preview/pr-1379/dir_9ab085ddc2d9241d457700c933c55f50.html @@ -0,0 +1,120 @@ + + + + + engine/tools/transform_gizmo/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/transform_gizmo/ directory +

+

Transform Gizmo plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_9b04cf786b414c0d644db09287f665e6.html b/preview/pr-1379/dir_9b04cf786b414c0d644db09287f665e6.html new file mode 100644 index 0000000000..47c657862a --- /dev/null +++ b/preview/pr-1379/dir_9b04cf786b414c0d644db09287f665e6.html @@ -0,0 +1,134 @@ + + + + + engine/voxels/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/voxels/ directory +

+

Voxels plugin directory.

+ +
+

Files

+
+
file grid.hpp
+
Class cubos::engine::VoxelGrid.
+
file grid_bridge.hpp
+
Class cubos::engine::GridBridge.
+
file material.hpp
+
Class cubos::engine::VoxelMaterial.
+
file model.hpp
+
Class cubos::engine::VoxelModel.
+
file model_bridge.hpp
+
Class cubos::engine::VoxelModelBridge.
+
file palette.hpp
+
Class cubos::engine::VoxelPalette.
+
file palette_bridge.hpp
+
Class cubos::engine::PaletteBridge.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_9bdaf8f561be1ffd03f616379797b70b.html b/preview/pr-1379/dir_9bdaf8f561be1ffd03f616379797b70b.html new file mode 100644 index 0000000000..c5213fa887 --- /dev/null +++ b/preview/pr-1379/dir_9bdaf8f561be1ffd03f616379797b70b.html @@ -0,0 +1,142 @@ + + + + + core/memory/ directory | Cubos Docs + + + + + + + +
+
+ +
+ + + + + + diff --git a/preview/pr-1379/dir_9e8f7e3ec841d98f48e2fdaca345f420.html b/preview/pr-1379/dir_9e8f7e3ec841d98f48e2fdaca345f420.html new file mode 100644 index 0000000000..17e7782e85 --- /dev/null +++ b/preview/pr-1379/dir_9e8f7e3ec841d98f48e2fdaca345f420.html @@ -0,0 +1,122 @@ + + + + + engine/render/ssao/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/ssao/ directory +

+

Screen Space Ambient Occlusion plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file ssao.hpp
+
Component cubos::engine::SSAO.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_9f228de11f2fc2633236213a3ef5c992.html b/preview/pr-1379/dir_9f228de11f2fc2633236213a3ef5c992.html new file mode 100644 index 0000000000..1937a097f7 --- /dev/null +++ b/preview/pr-1379/dir_9f228de11f2fc2633236213a3ef5c992.html @@ -0,0 +1,124 @@ + + + + + core/ecs/table/sparse_relation/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/sparse_relation/ directory +

+

Sparse relation storage types.

+ +
+

Files

+
+
file id.hpp
+
Struct cubos::core::ecs::SparseRelationTableId.
+
file registry.hpp
+
Class cubos::core::ecs::SparseRelationTableRegistry.
+
file table.hpp
+
Class cubos::core::ecs::SparseRelationTable.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_9f893dc9290503d725756bc20abb7c28.html b/preview/pr-1379/dir_9f893dc9290503d725756bc20abb7c28.html new file mode 100644 index 0000000000..2a30ed61c6 --- /dev/null +++ b/preview/pr-1379/dir_9f893dc9290503d725756bc20abb7c28.html @@ -0,0 +1,120 @@ + + + + + engine/tools/metrics_panel/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/metrics_panel/ directory +

+

Metrics Panel plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_a0e345b5ef3f916fe64ce8826d84a921.html b/preview/pr-1379/dir_a0e345b5ef3f916fe64ce8826d84a921.html new file mode 100644 index 0000000000..d99b1576ed --- /dev/null +++ b/preview/pr-1379/dir_a0e345b5ef3f916fe64ce8826d84a921.html @@ -0,0 +1,124 @@ + + + + + engine/ui/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/ directory +

+

UI module.

+ +
+

Directories

+
+
directory canvas/
+
Canvas plugin directory.
+
directory color_rect/
+
Color Rect plugin directory.
+
directory image/
+
Color Rect plugin directory.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_ab77bb0355291d2f79b9c1d5e755a44c.html b/preview/pr-1379/dir_ab77bb0355291d2f79b9c1d5e755a44c.html new file mode 100644 index 0000000000..1a6d8f4ff7 --- /dev/null +++ b/preview/pr-1379/dir_ab77bb0355291d2f79b9c1d5e755a44c.html @@ -0,0 +1,120 @@ + + + + + tesseratos/scene_editor/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/scene_editor/ directory +

+

Scene editor plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_b3628534f645523dfa2d021cded97bf6.html b/preview/pr-1379/dir_b3628534f645523dfa2d021cded97bf6.html new file mode 100644 index 0000000000..dd7429ef26 --- /dev/null +++ b/preview/pr-1379/dir_b3628534f645523dfa2d021cded97bf6.html @@ -0,0 +1,124 @@ + + + + + core/thread/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/thread/ directory +

+

Threading module.

+ +
+

Files

+
+
file pool.hpp
+
Class cubos::core::thread::ThreadPool.
+
file process.hpp
+
Class cubos::core::thread::Process.
+
file task.hpp
+
Class cubos::core::thread::Task.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_b6daa990b896c2c0c53126427e4d978d.html b/preview/pr-1379/dir_b6daa990b896c2c0c53126427e4d978d.html new file mode 100644 index 0000000000..330b66c12b --- /dev/null +++ b/preview/pr-1379/dir_b6daa990b896c2c0c53126427e4d978d.html @@ -0,0 +1,152 @@ + + + + + core/ecs/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/ directory +

+

ECS module.

+ +
+

Directories

+
+
directory entity/
+
Entity directory.
+
directory observer/
+
Observer directory.
+
directory query/
+
Query directory.
+
directory system/
+
System directory.
+
directory table/
+
Table directory.
+
+
+
+

Files

+
+
file blueprint.hpp
+
Class cubos::core::ecs::Blueprint.
+
file command_buffer.hpp
+
Class cubos::core::ecs::CommandBuffer.
+
file cubos.hpp
+
Class cubos::core::ecs::Cubos.
+
file dynamic.hpp
+
Class cubos::core::ecs::DynamicPlugin.
+
file name.hpp
+
Class cubos::core::ecs::Name.
+
file plugin_queue.hpp
+
Class cubos::core::ecs::PluginQueue.
+
file reflection.hpp
+
Class cubos::core::ecs::TypeBuilder.
+
file types.hpp
+
Class cubos::core::ecs::Types.
+
file world.hpp
+
Class cubos::core::ecs::World.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_bafb7af0e03e95b24a45ff63060ab57b.html b/preview/pr-1379/dir_bafb7af0e03e95b24a45ff63060ab57b.html new file mode 100644 index 0000000000..4130a5530b --- /dev/null +++ b/preview/pr-1379/dir_bafb7af0e03e95b24a45ff63060ab57b.html @@ -0,0 +1,162 @@ + + + + + engine/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ directory +

+

Engine module.

+ +
+

Directories

+
+
directory assets/
+
Assets plugin directory.
+
directory collisions/
+
Collisions plugin directory.
+
directory defaults/
+
Defaults plugin directory.
+
directory fixed_step/
+
Fixed Time Step plugin directory.
+
directory gizmos/
+
Gizmos plugin directory.
+
directory image/
+
Image plugin directory.
+
directory imgui/
+
ImGui integration ImGui plugin directory.
+
directory input/
+
Input plugin directory.
+
directory physics/
+
Physics plugin directory.
+
directory render/
+
Render module.
+
directory scene/
+
Scene plugin directory.
+
directory settings/
+
Settings plugin directory.
+
directory tools/
+
Tools module.
+
directory transform/
+
Transform plugin directory.
+
directory ui/
+
UI module.
+
directory voxels/
+
Voxels plugin directory.
+
directory window/
+
Window plugin directory.
+
+
+
+

Files

+
+
file api.hpp
+
Macro CUBOS_ENGINE_API.
+
file prelude.hpp
+
Includes commonly used headers and defines aliases for commonly used types.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_bce346eeec19b808253a94d4aac47d05.html b/preview/pr-1379/dir_bce346eeec19b808253a94d4aac47d05.html new file mode 100644 index 0000000000..41335c2a11 --- /dev/null +++ b/preview/pr-1379/dir_bce346eeec19b808253a94d4aac47d05.html @@ -0,0 +1,120 @@ + + + + + tesseratos/voxel_palette_editor/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/voxel_palette_editor/ directory +

+

Palette editor plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_bd9be39c2ccf4132268583193b02b48c.html b/preview/pr-1379/dir_bd9be39c2ccf4132268583193b02b48c.html new file mode 100644 index 0000000000..f11626477b --- /dev/null +++ b/preview/pr-1379/dir_bd9be39c2ccf4132268583193b02b48c.html @@ -0,0 +1,122 @@ + + + + + engine/assets/bridges/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/bridges/ directory +

+

cubos::engine::AssetBridge implementations directory.

+ +
+

Files

+
+
file file.hpp
+
Class cubos::engine::FileBridge.
+
file json.hpp
+
Class cubos::engine::JSONBridge.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c185369e92e3603c6d00fa8343148da7.html b/preview/pr-1379/dir_c185369e92e3603c6d00fa8343148da7.html new file mode 100644 index 0000000000..42319e3835 --- /dev/null +++ b/preview/pr-1379/dir_c185369e92e3603c6d00fa8343148da7.html @@ -0,0 +1,150 @@ + + + + + engine/tools/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/ directory +

+

Tools module.

+ +
+

Directories

+
+
directory collider_gizmos/
+
Collider Gizmos plugin directory.
+
directory console/
+
Console plugin directory.
+
directory debug_camera/
+
Debug Camera plugin directory.
+
directory ecs_statistics/
+
ECS Statistics plugin directory.
+
directory entity_inspector/
+
Entity Inspector plugin directory.
+
directory metrics_panel/
+
Metrics Panel plugin directory.
+
directory play_pause/
+
Play Pause plugin directory.
+
directory selection/
+
Selection plugin directory.
+
directory settings_inspector/
+
Settings Inspector plugin directory.
+
directory toolbox/
+
Toolbox plugin directory.
+
directory transform_gizmo/
+
Transform Gizmo plugin directory.
+
directory world_inspector/
+
World Inspector plugin directory.
+
+
+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c1b5957eb0512b9978230dfb34d9655b.html b/preview/pr-1379/dir_c1b5957eb0512b9978230dfb34d9655b.html new file mode 100644 index 0000000000..6f083f8644 --- /dev/null +++ b/preview/pr-1379/dir_c1b5957eb0512b9978230dfb34d9655b.html @@ -0,0 +1,122 @@ + + + + + core/ecs/table/dense/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/dense/ directory +

+

Dense storage types.

+ +
+

Files

+
+
file registry.hpp
+
Class cubos::core::ecs::DenseTableRegistry.
+
file table.hpp
+
Class cubos::core::ecs::DenseTable.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c1deef5baf41393ad8a994c3fd53e62f.html b/preview/pr-1379/dir_c1deef5baf41393ad8a994c3fd53e62f.html new file mode 100644 index 0000000000..46c731e5f0 --- /dev/null +++ b/preview/pr-1379/dir_c1deef5baf41393ad8a994c3fd53e62f.html @@ -0,0 +1,130 @@ + + + + + core/geom/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/ directory +

+

Geometry module.

+ +
+

Files

+
+
file aabb.hpp
+
Component cubos::core::geom::AABB.
+
file box.hpp
+
Class cubos::core::geom::Box.
+
file capsule.hpp
+
Class cubos::core::geom::Capsule.
+
file intersections.hpp
+
Class cubos::core::geom::Intersections.
+
file plane.hpp
+
Class cubos::core::geom::Plane.
+
file utils.hpp
+
Class cubos::core::geom::Utils.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c3c1b680e788fc2780e791a47272f92a.html b/preview/pr-1379/dir_c3c1b680e788fc2780e791a47272f92a.html new file mode 100644 index 0000000000..ff7ec6a59b --- /dev/null +++ b/preview/pr-1379/dir_c3c1b680e788fc2780e791a47272f92a.html @@ -0,0 +1,122 @@ + + + + + engine/render/defaults/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/defaults/ directory +

+

Defaults plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::RenderTargetDefaults.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c4311188e9cc606330f5e3e0b9dd5059.html b/preview/pr-1379/dir_c4311188e9cc606330f5e3e0b9dd5059.html new file mode 100644 index 0000000000..b783b3e395 --- /dev/null +++ b/preview/pr-1379/dir_c4311188e9cc606330f5e3e0b9dd5059.html @@ -0,0 +1,122 @@ + + + + + core/gl/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/gl/ directory +

+

Graphics module.

+ +
+

Files

+
+
file render_device.hpp
+
Class cubos::core::gl::RenderDevice and related types.
+
file util.hpp
+
Function cubos::core::gl::generateScreenQuad.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c4c5f5e680dd7084a81d07dcedbcea10.html b/preview/pr-1379/dir_c4c5f5e680dd7084a81d07dcedbcea10.html new file mode 100644 index 0000000000..bc5cafadbe --- /dev/null +++ b/preview/pr-1379/dir_c4c5f5e680dd7084a81d07dcedbcea10.html @@ -0,0 +1,122 @@ + + + + + engine/render/shadow_atlas_rasterizer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadow_atlas_rasterizer/ directory +

+

Shadow atlas rasterizer plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file shadow_atlas_rasterizer.hpp
+
Resource cubos::engine::ShadowAtlasRasterizer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c65eef5797bb1e2bc1793302872b5915.html b/preview/pr-1379/dir_c65eef5797bb1e2bc1793302872b5915.html new file mode 100644 index 0000000000..2c5a1c8f88 --- /dev/null +++ b/preview/pr-1379/dir_c65eef5797bb1e2bc1793302872b5915.html @@ -0,0 +1,120 @@ + + + + + engine/defaults/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/defaults/ directory +

+

Defaults plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c6b1990f794fae67b78c89a0497d989e.html b/preview/pr-1379/dir_c6b1990f794fae67b78c89a0497d989e.html new file mode 100644 index 0000000000..118ae425d0 --- /dev/null +++ b/preview/pr-1379/dir_c6b1990f794fae67b78c89a0497d989e.html @@ -0,0 +1,122 @@ + + + + + engine/ui/image/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/image/ directory +

+

Color Rect plugin directory.

+ +
+

Files

+
+
file image.hpp
+
Component cubos::engine::UIImage.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c8e8895f6f196d6cff73dfabc4287131.html b/preview/pr-1379/dir_c8e8895f6f196d6cff73dfabc4287131.html new file mode 100644 index 0000000000..1fcb3cd923 --- /dev/null +++ b/preview/pr-1379/dir_c8e8895f6f196d6cff73dfabc4287131.html @@ -0,0 +1,122 @@ + + + + + engine/render/hdr/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/hdr/ directory +

+

HDR plugin directory.

+ +
+

Files

+
+
file hdr.hpp
+
Component cubos::engine::HDR.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_c90b2122b3bee447f4984b9c3103b182.html b/preview/pr-1379/dir_c90b2122b3bee447f4984b9c3103b182.html new file mode 100644 index 0000000000..b99823d3b2 --- /dev/null +++ b/preview/pr-1379/dir_c90b2122b3bee447f4984b9c3103b182.html @@ -0,0 +1,120 @@ + + + + + engine/tools/debug_camera/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/debug_camera/ directory +

+

Debug Camera plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_cbbe2c367f05f2003d65e7dca7d78889.html b/preview/pr-1379/dir_cbbe2c367f05f2003d65e7dca7d78889.html new file mode 100644 index 0000000000..5a69b04a77 --- /dev/null +++ b/preview/pr-1379/dir_cbbe2c367f05f2003d65e7dca7d78889.html @@ -0,0 +1,122 @@ + + + + + engine/render/g_buffer_rasterizer/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer_rasterizer/ directory +

+

G-Buffer Rasterizer plugin directory.

+ +
+

Files

+
+
file g_buffer_rasterizer.hpp
+
Component cubos::engine::GBufferRasterizer.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_ce4a27e99b2102cfb79fc5b09181f4e6.html b/preview/pr-1379/dir_ce4a27e99b2102cfb79fc5b09181f4e6.html new file mode 100644 index 0000000000..2d9e810a2f --- /dev/null +++ b/preview/pr-1379/dir_ce4a27e99b2102cfb79fc5b09181f4e6.html @@ -0,0 +1,124 @@ + + + + + engine/gizmos/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/gizmos/ directory +

+

Gizmos plugin directory.

+ +
+

Files

+
+
file gizmos.hpp
+
Resource cubos::engine::Gizmos.
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::GizmosTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_d0ac2003a3c19c21d7ab7ff2f06fbec3.html b/preview/pr-1379/dir_d0ac2003a3c19c21d7ab7ff2f06fbec3.html new file mode 100644 index 0000000000..81ae67b167 --- /dev/null +++ b/preview/pr-1379/dir_d0ac2003a3c19c21d7ab7ff2f06fbec3.html @@ -0,0 +1,120 @@ + + + + + engine/tools/entity_inspector/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/entity_inspector/ directory +

+

Entity Inspector plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_d56b3b460aaf5e63a90e3ed12bfd34f7.html b/preview/pr-1379/dir_d56b3b460aaf5e63a90e3ed12bfd34f7.html new file mode 100644 index 0000000000..526a9c5967 --- /dev/null +++ b/preview/pr-1379/dir_d56b3b460aaf5e63a90e3ed12bfd34f7.html @@ -0,0 +1,128 @@ + + + + + engine/render/shadows/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadows/ directory +

+

Shadows plugin directory.

+ +
+

Files

+
+
file caster.hpp
+
Struct cubos::engine::ShadowCaster.
+
file directional_caster.hpp
+
Component cubos::engine::DirectionalShadowCaster.
+
file plugin.hpp
+
Plugin entry point.
+
file point_caster.hpp
+
Component cubos::engine::PointShadowCaster.
+
file spot_caster.hpp
+
Component cubos::engine::SpotShadowCaster.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_db86702e1371d7558db3699dd3786a14.html b/preview/pr-1379/dir_db86702e1371d7558db3699dd3786a14.html new file mode 100644 index 0000000000..0161673b0b --- /dev/null +++ b/preview/pr-1379/dir_db86702e1371d7558db3699dd3786a14.html @@ -0,0 +1,136 @@ + + + + + engine/collisions/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/ directory +

+

Collisions plugin directory.

+ +
+

Directories

+
+
directory shapes/
+
Collision shapes components directory.
+
+
+
+

Files

+
+
file collider.hpp
+
Component cubos::engine::Collider.
+
file colliding_with.hpp
+
Relation cubos::engine::CollidingWith.
+
file contact_manifold.hpp
+
Relation cubos::engine::ContactManifold.
+
file plugin.hpp
+
Plugin entry point.
+
file raycast.hpp
+
System argument cubos::engine::Raycast.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_ddad818fed94430a78a5fc586974a184.html b/preview/pr-1379/dir_ddad818fed94430a78a5fc586974a184.html new file mode 100644 index 0000000000..53041d3f27 --- /dev/null +++ b/preview/pr-1379/dir_ddad818fed94430a78a5fc586974a184.html @@ -0,0 +1,122 @@ + + + + + engine/render/picker/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/picker/ directory +

+

RenderPicker plugin directory.

+ +
+

Files

+
+
file picker.hpp
+
Component cubos::engine::RenderPicker.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_dfa289e7a2f966c30a6253fe4e079bad.html b/preview/pr-1379/dir_dfa289e7a2f966c30a6253fe4e079bad.html new file mode 100644 index 0000000000..8248ce8e67 --- /dev/null +++ b/preview/pr-1379/dir_dfa289e7a2f966c30a6253fe4e079bad.html @@ -0,0 +1,124 @@ + + + + + engine/image/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/image/ directory +

+

Image plugin directory.

+ +
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::ImageBridge.
+
file image.hpp
+
Class cubos::engine::Image.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_e2800062499d708ff36c18b90e00a4f0.html b/preview/pr-1379/dir_e2800062499d708ff36c18b90e00a4f0.html new file mode 100644 index 0000000000..420fadf720 --- /dev/null +++ b/preview/pr-1379/dir_e2800062499d708ff36c18b90e00a4f0.html @@ -0,0 +1,122 @@ + + + + + engine/render/target/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/target/ directory +

+

Render Target plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::RenderTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_e42c9d7813efab99826f1cb60398c3fa.html b/preview/pr-1379/dir_e42c9d7813efab99826f1cb60398c3fa.html new file mode 100644 index 0000000000..b034e43ab3 --- /dev/null +++ b/preview/pr-1379/dir_e42c9d7813efab99826f1cb60398c3fa.html @@ -0,0 +1,120 @@ + + + + + engine/tools/settings_inspector/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/settings_inspector/ directory +

+

Settings Inspector plugin directory.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_f4414684a5bb1e1b8e9ba236e8bdb594.html b/preview/pr-1379/dir_f4414684a5bb1e1b8e9ba236e8bdb594.html new file mode 100644 index 0000000000..d1efd6e539 --- /dev/null +++ b/preview/pr-1379/dir_f4414684a5bb1e1b8e9ba236e8bdb594.html @@ -0,0 +1,140 @@ + + + + + core/reflection/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/ directory +

+

Reflection module.

+ +
+

Directories

+
+
directory external/
+
Reflection declarations for external types.
+
directory traits/
+
Reflection module built-in traits.
+
+
+
+

Files

+
+
file comparison.hpp
+
Function cubos::core::reflection::compare.
+
file reflect.hpp
+
Function cubos::core::reflection::reflect and related macros.
+
file type.hpp
+
Class cubos::core::reflection::Type.
+
file type_client.hpp
+
Class cubos::core::reflection::TypeClient.
+
file type_registry.hpp
+
Class cubos::core::reflection::TypeRegistry.
+
file type_server.hpp
+
Class cubos::core::reflection::TypeServer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_f6f65ff657bd34b22e5078310628f4e7.html b/preview/pr-1379/dir_f6f65ff657bd34b22e5078310628f4e7.html new file mode 100644 index 0000000000..df917884b0 --- /dev/null +++ b/preview/pr-1379/dir_f6f65ff657bd34b22e5078310628f4e7.html @@ -0,0 +1,120 @@ + + + + + core/al/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/al/ directory +

+

Audio module.

+ +
+

Files

+
+
file audio_context.hpp
+
Class cubos::core::al::AudioContext and related types.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dir_fc8110eaf6ef50e82d21b749d50a1849.html b/preview/pr-1379/dir_fc8110eaf6ef50e82d21b749d50a1849.html new file mode 100644 index 0000000000..cbd52b8cb5 --- /dev/null +++ b/preview/pr-1379/dir_fc8110eaf6ef50e82d21b749d50a1849.html @@ -0,0 +1,122 @@ + + + + + engine/physics/ directory | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/ directory +

+

Physics plugin directory.

+ +
+

Files

+
+
file physics_bundle.hpp
+
Component cubos::engine::PhysicsBundle.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/directional_8hpp.html b/preview/pr-1379/directional_8hpp.html new file mode 100644 index 0000000000..7909e04ac1 --- /dev/null +++ b/preview/pr-1379/directional_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/lights/directional.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/lights/directional.hpp file +

+

Component cubos::engine::DirectionalLight.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DirectionalLight +
+
Component which makes an entity behave like a directional light.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/directional__caster_8hpp.html b/preview/pr-1379/directional__caster_8hpp.html new file mode 100644 index 0000000000..3abd0423c3 --- /dev/null +++ b/preview/pr-1379/directional__caster_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadows/directional_caster.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadows/directional_caster.hpp file +

+

Component cubos::engine::DirectionalShadowCaster.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DirectionalShadowCaster +
+
Component which enables shadow casting on a directional light.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/draw__list_8hpp.html b/preview/pr-1379/draw__list_8hpp.html new file mode 100644 index 0000000000..a132647671 --- /dev/null +++ b/preview/pr-1379/draw__list_8hpp.html @@ -0,0 +1,148 @@ + + + + + engine/ui/canvas/draw_list.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/draw_list.hpp file +

+

Class cubos::engine::UIDrawList.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::UIDrawList +
+
Holds a collections of draw commands and their data.
+
+ struct cubos::engine::UIDrawList::Type +
+
Describes a UI draw call type.
+
+ struct cubos::engine::UIDrawList::Command +
+
Describes a UI draw instruction.
+
+ struct cubos::engine::UIDrawList::Entry +
+
Describes a draw commands and how it fits into the draw list carrying it.
+
+ class cubos::engine::UIDrawList::EntryBuilder +
+
Builds an Entry.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/draws__to_8hpp.html b/preview/pr-1379/draws__to_8hpp.html new file mode 100644 index 0000000000..b1c4868283 --- /dev/null +++ b/preview/pr-1379/draws__to_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/camera/draws_to.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/camera/draws_to.hpp file +

+

Relation cubos::engine::DrawsTo.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DrawsTo +
+
Relation which indicates the 'from' entity is a camera that draws to the 'to' target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/dynamic_8hpp.html b/preview/pr-1379/dynamic_8hpp.html new file mode 100644 index 0000000000..f22587c373 --- /dev/null +++ b/preview/pr-1379/dynamic_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/dynamic.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/dynamic.hpp file +

+

Class cubos::core::ecs::DynamicPlugin.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::DynamicPlugin +
+
Manages the loading and unloading of a plugin from a shared library.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/element_8hpp.html b/preview/pr-1379/element_8hpp.html new file mode 100644 index 0000000000..9d56cc9ed9 --- /dev/null +++ b/preview/pr-1379/element_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/element.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/element.hpp file +

+

Component cubos::engine::UIElement.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIElement +
+
Component which defines the space an element of the UI occupies as a rect.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/embedded__archive_8hpp.html b/preview/pr-1379/embedded__archive_8hpp.html new file mode 100644 index 0000000000..03add368e6 --- /dev/null +++ b/preview/pr-1379/embedded__archive_8hpp.html @@ -0,0 +1,142 @@ + + + + + core/data/fs/embedded_archive.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/embedded_archive.hpp file +

+

Class cubos::core::data::EmbeddedArchive.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::EmbeddedArchive +
+
Archive implementation which reads data embedded in the application. Meant to be used with the quadrados embed tool.
+
+ struct cubos::core::data::EmbeddedArchive::Data +
+
Describes the structure of the embedded data.
+
+ struct cubos::core::data::EmbeddedArchive::Data::Entry +
+
Describes a file entry in the embedded data.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/endianness_8hpp.html b/preview/pr-1379/endianness_8hpp.html new file mode 100644 index 0000000000..d4b4f80b40 --- /dev/null +++ b/preview/pr-1379/endianness_8hpp.html @@ -0,0 +1,159 @@ + + + + + core/memory/endianness.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/endianness.hpp file +

+

Endianness utility functions.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Functions

+
+
+
template<typename T>
+ auto swapBytes(T value) -> T +
+
Swaps the bytes of a value, changing its endianness.
+
+ auto isLittleEndian() -> bool +
+
Checks if the current platform is little endian.
+
+
template<typename T>
+ auto fromLittleEndian(T value) -> T +
+
Converts a value from little endianness to local endianness.
+
+
template<typename T>
+ auto toLittleEndian(T value) -> T +
+
Converts a value from local endianness to little endianness.
+
+
template<typename T>
+ auto fromBigEndian(T value) -> T +
+
Converts a value from big endianness to local endianness.
+
+
template<typename T>
+ auto toBigEndian(T value) -> T +
+
Converts a value from local endianness to big endianness.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2api_2engine_2api_8h.html b/preview/pr-1379/engine_2include_2cubos_2api_2engine_2api_8h.html new file mode 100644 index 0000000000..586af00ffe --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2api_2engine_2api_8h.html @@ -0,0 +1,102 @@ + + + + + cubos/api/engine/api.h file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos/api/engine/api.h file +

+

Macro CUBOS_ENGINE_C_API.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2api_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2api_8hpp.html new file mode 100644 index 0000000000..728781295f --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2api_8hpp.html @@ -0,0 +1,102 @@ + + + + + engine/api.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/api.hpp file +

+

Macro CUBOS_ENGINE_API.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2file_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2file_8hpp.html new file mode 100644 index 0000000000..2d8df6f86b --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2file_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/assets/bridges/file.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/bridges/file.hpp file +

+

Class cubos::engine::FileBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2json_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2json_8hpp.html new file mode 100644 index 0000000000..ec9fd57385 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2bridges_2json_8hpp.html @@ -0,0 +1,133 @@ + + + + + engine/assets/bridges/json.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/bridges/json.hpp file +

+

Class cubos::engine::JSONBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+
template<typename T>
+ class cubos::engine::JSONBridge +
+
Bridge for loading and saving assets which are serialized to and from a JSON file.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2plugin_8hpp.html new file mode 100644 index 0000000000..27cb590d7d --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2assets_2plugin_8hpp.html @@ -0,0 +1,154 @@ + + + + + engine/assets/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto assetsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag assetsInitTag +
+
Initializes the assets manager and loads the meta files (after settingsTag).
+
+ CUBOS_ENGINE_API Tag assetsBridgeTag +
+
Systems which add bridges to the asset manager should be tagged with this.
+
+ CUBOS_ENGINE_API Tag assetsCleanupTag +
+
Frees any assets no longer in use.
+
+ CUBOS_ENGINE_API Tag assetsTag +
+
Startup systems which load assets should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2plugin_8hpp.html new file mode 100644 index 0000000000..210e88d4bf --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/collisions/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto collisionsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag collisionsTag +
+
Detects collisions and updates colliders.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2box_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2box_8hpp.html new file mode 100644 index 0000000000..eae2d2e9be --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2box_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/collisions/shapes/box.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/shapes/box.hpp file +

+

Component cubos::engine::BoxCollisionShape.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::BoxCollisionShape +
+
Component which adds a box collision shape to an entity, used with a Collider component.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2capsule_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2capsule_8hpp.html new file mode 100644 index 0000000000..a6950be449 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2collisions_2shapes_2capsule_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/collisions/shapes/capsule.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/shapes/capsule.hpp file +

+

Component cubos::engine::CapsuleCollisionShape.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::CapsuleCollisionShape +
+
Component which adds a capsule collision shape to an entity, used with a Collider component.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2defaults_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2defaults_2plugin_8hpp.html new file mode 100644 index 0000000000..92a4f1ae64 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2defaults_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/defaults/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/defaults/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ void defaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2fixed__step_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2fixed__step_2plugin_8hpp.html new file mode 100644 index 0000000000..cafc9f234a --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2fixed__step_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/fixed_step/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/fixed_step/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto fixedStepPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag fixedStepTag +
+
Systems with this tag run at a fixed framerate.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2gizmos_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2gizmos_2plugin_8hpp.html new file mode 100644 index 0000000000..4f3842c281 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2gizmos_2plugin_8hpp.html @@ -0,0 +1,150 @@ + + + + + engine/gizmos/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/gizmos/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto gizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag gizmosInitTag +
+
Gizmos renderer is initialized, after windowInitTag.
+
+ CUBOS_ENGINE_API Tag gizmosInputTag +
+
Gizmos interaction is handled, after windowPollTag and before gizmosDrawTag.
+
+ CUBOS_ENGINE_API Tag gizmosDrawTag +
+
Gizmos are drawn to all render targets with GizmosTarget components.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2image_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2image_2plugin_8hpp.html new file mode 100644 index 0000000000..fa3aebe2e9 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2image_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/image/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/image/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto imagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2imgui_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2imgui_2plugin_8hpp.html new file mode 100644 index 0000000000..6927b7df49 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2imgui_2plugin_8hpp.html @@ -0,0 +1,154 @@ + + + + + engine/imgui/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/imgui/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto imguiPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag imguiInitTag +
+
ImGui is initialized, after windowInitTag.
+
+ CUBOS_ENGINE_API Tag imguiBeginTag +
+
The ImGui frame begins, after windowPollTag.
+
+ CUBOS_ENGINE_API Tag imguiEndTag +
+
The ImGui frame ends and is rendered to the window's render target.
+
+ CUBOS_ENGINE_API Tag imguiTag +
+
Tag to be used by all systems which call ImGui functions. Runs between imguiBeginTag and imguiEndTag.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2input_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2input_2plugin_8hpp.html new file mode 100644 index 0000000000..82935d0a59 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2input_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/input/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto inputPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag inputUpdateTag +
+
Updates the input state.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2plugin_8hpp.html new file mode 100644 index 0000000000..a31dc9b84b --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/physics/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto physicsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag physicsApplyForcesTag +
+
Tag which should be used on all systems that modify velocity or apply forces or impulses.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2solver_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2solver_2plugin_8hpp.html new file mode 100644 index 0000000000..a7c6151792 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2physics_2solver_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/solver/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/solver/plugin.hpp file +

+

Solver plugin, resource cubos::engine::Solver.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto physicsSolverPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2bloom_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2bloom_2plugin_8hpp.html new file mode 100644 index 0000000000..c58542e49c --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2bloom_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/bloom/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/bloom/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto bloomPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag bloomTag +
+
Tags the system which applies the Bloom effect.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2camera_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2camera_2plugin_8hpp.html new file mode 100644 index 0000000000..b9145f4f65 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2camera_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/camera/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/camera/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto cameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps_2plugin_8hpp.html new file mode 100644 index 0000000000..18b8936d19 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/cascaded_shadow_maps/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/cascaded_shadow_maps/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto cascadedShadowMapsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createCascadedShadowMapsTag +
+
Creates the shadow maps.
+
+ CUBOS_ENGINE_API Tag drawToCascadedShadowMapsTag +
+
Systems which draw to the cascaded shadow maps should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps__rasterizer_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps__rasterizer_2plugin_8hpp.html new file mode 100644 index 0000000000..dc90b1a4ea --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2cascaded__shadow__maps__rasterizer_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/cascaded_shadow_maps_rasterizer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/cascaded_shadow_maps_rasterizer/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto cascadedShadowMapsRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2defaults_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2defaults_2plugin_8hpp.html new file mode 100644 index 0000000000..88389851bc --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2defaults_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/defaults/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/defaults/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ void renderDefaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2deferred__shading_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2deferred__shading_2plugin_8hpp.html new file mode 100644 index 0000000000..124ee6c6b3 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2deferred__shading_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/deferred_shading/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/deferred_shading/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto deferredShadingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag deferredShadingTag +
+
Tags the system which applies the Deferred Shading technique.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2depth_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2depth_2plugin_8hpp.html new file mode 100644 index 0000000000..7728f3c043 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2depth_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/depth/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/depth/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto renderDepthPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createRenderDepthTag +
+
Recreates the RenderDepth texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderDepthTag +
+
Systems which draw to RenderDepth textures should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer_2plugin_8hpp.html new file mode 100644 index 0000000000..17592ecad1 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/g_buffer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto gBufferPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createGBufferTag +
+
Recreates the GBuffer if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToGBufferTag +
+
Systems which draw to GBuffer textures should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer__rasterizer_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer__rasterizer_2plugin_8hpp.html new file mode 100644 index 0000000000..da43daed62 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2g__buffer__rasterizer_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/g_buffer_rasterizer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer_rasterizer/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto gBufferRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag rasterizeToGBufferTag +
+
Rasterizes RenderMesh components to the GBuffer textures.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2hdr_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2hdr_2plugin_8hpp.html new file mode 100644 index 0000000000..efa0e39f8c --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2hdr_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/hdr/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/hdr/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto hdrPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createHDRTag +
+
Recreates the HDR texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToHDRTag +
+
Systems which draw to HDR textures should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2lights_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2lights_2plugin_8hpp.html new file mode 100644 index 0000000000..7dfe1d1774 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2lights_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/lights/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/lights/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto lightsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2plugin_8hpp.html new file mode 100644 index 0000000000..34d88c5897 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/mesh/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/mesh/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto renderMeshPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag renderMeshPoolInitTag +
+
Render mesh pool is initialized (startup).
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2pool_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2pool_8hpp.html new file mode 100644 index 0000000000..769c12ccc8 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2mesh_2pool_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/render/mesh/pool.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/mesh/pool.hpp file +

+

Resource cubos::engine::RenderMeshPool.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::RenderMeshPool +
+
Used to allocate render meshes, which can then be rendered using a single draw call.
+
+ struct cubos::engine::RenderMeshPool::BucketId +
+
Identifies a bucket in the pool.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2picker_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2picker_2plugin_8hpp.html new file mode 100644 index 0000000000..84408095d0 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2picker_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/picker/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/picker/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto renderPickerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createRenderPickerTag +
+
Recreates the RenderPicker if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderPickerTag +
+
Systems which draw to RenderPicker textures should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shader_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shader_2plugin_8hpp.html new file mode 100644 index 0000000000..c134e54dc6 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shader_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shader/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shader/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto shaderPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas_2plugin_8hpp.html new file mode 100644 index 0000000000..5454ab5020 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas_2plugin_8hpp.html @@ -0,0 +1,150 @@ + + + + + engine/render/shadow_atlas/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadow_atlas/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto shadowAtlasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createShadowAtlasTag +
+
Creates the shadow atlas.
+
+ CUBOS_ENGINE_API Tag reserveShadowCastersTag +
+
Reserves space for shadow casters.
+
+ CUBOS_ENGINE_API Tag drawToShadowAtlasTag +
+
Systems which draw to the shadow atlas texture should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas__rasterizer_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas__rasterizer_2plugin_8hpp.html new file mode 100644 index 0000000000..bf3a8dfcb8 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadow__atlas__rasterizer_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadow_atlas_rasterizer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadow_atlas_rasterizer/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto shadowAtlasRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadows_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadows_2plugin_8hpp.html new file mode 100644 index 0000000000..1a803e7816 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2shadows_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadows/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadows/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto shadowsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2split__screen_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2split__screen_2plugin_8hpp.html new file mode 100644 index 0000000000..26b780d838 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2split__screen_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/split_screen/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/split_screen/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto splitScreenPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag splitScreenTag +
+
Tags the system which adjusts the viewports.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2ssao_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2ssao_2plugin_8hpp.html new file mode 100644 index 0000000000..0a5f06be3c --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2ssao_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/ssao/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/ssao/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto ssaoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag drawToSSAOTag +
+
Tags the system which applies the Screen Space Ambient Occlusion technique.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2target_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2target_2plugin_8hpp.html new file mode 100644 index 0000000000..c502c85f05 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2target_2plugin_8hpp.html @@ -0,0 +1,146 @@ + + + + + engine/render/target/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/target/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto renderTargetPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag resizeRenderTargetTag +
+
Resizes the Render Target if necessary - for example, due to a window resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderTargetTag +
+
Systems which draw to Render Target framebuffers should be tagged with this.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2tone__mapping_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2tone__mapping_2plugin_8hpp.html new file mode 100644 index 0000000000..fc7d449c73 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2tone__mapping_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/render/tone_mapping/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/tone_mapping/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto toneMappingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag toneMappingTag +
+
Tags the system which does the tone mapping.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2render_2voxels_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2voxels_2plugin_8hpp.html new file mode 100644 index 0000000000..d5d82f69b5 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2render_2voxels_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/voxels/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/voxels/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto renderVoxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2scene_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2scene_2plugin_8hpp.html new file mode 100644 index 0000000000..e4c2e8790b --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2scene_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/scene/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/scene/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto scenePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2settings_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2settings_2plugin_8hpp.html new file mode 100644 index 0000000000..0a6e77bc37 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2settings_2plugin_8hpp.html @@ -0,0 +1,142 @@ + + + + + engine/settings/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/settings/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto settingsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag settingsTag +
+
The settings are loaded, overriding values set previously.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2collider__gizmos_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2collider__gizmos_2plugin_8hpp.html new file mode 100644 index 0000000000..647510be5c --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2collider__gizmos_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/collider_gizmos/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/collider_gizmos/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto colliderGizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2console_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2console_2plugin_8hpp.html new file mode 100644 index 0000000000..69fffd0ccb --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2console_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/console/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/console/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto consolePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2debug__camera_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2debug__camera_2plugin_8hpp.html new file mode 100644 index 0000000000..7529c9e22d --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2debug__camera_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/debug_camera/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/debug_camera/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto debugCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2ecs__statistics_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2ecs__statistics_2plugin_8hpp.html new file mode 100644 index 0000000000..7ee5b4a993 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2ecs__statistics_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/ecs_statistics/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/ecs_statistics/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto ecsStatisticsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2entity__inspector_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2entity__inspector_2plugin_8hpp.html new file mode 100644 index 0000000000..7b6c10738e --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2entity__inspector_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/entity_inspector/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/entity_inspector/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto entityInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2metrics__panel_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2metrics__panel_2plugin_8hpp.html new file mode 100644 index 0000000000..0fa71a9cc5 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2metrics__panel_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/metrics_panel/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/metrics_panel/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto metricsPanelPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2play__pause_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2play__pause_2plugin_8hpp.html new file mode 100644 index 0000000000..623ef2742a --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2play__pause_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/play_pause/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/play_pause/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto playPauseToolPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2plugin_8hpp.html new file mode 100644 index 0000000000..80fadd5500 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto toolsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2selection_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2selection_2plugin_8hpp.html new file mode 100644 index 0000000000..9f8ac53614 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2selection_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/selection/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/selection/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto selectionPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2settings__inspector_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2settings__inspector_2plugin_8hpp.html new file mode 100644 index 0000000000..16b7634683 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2settings__inspector_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/settings_inspector/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/settings_inspector/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto settingsInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2toolbox_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2toolbox_2plugin_8hpp.html new file mode 100644 index 0000000000..8adb855748 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2toolbox_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/toolbox/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/toolbox/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto toolboxPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2transform__gizmo_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2transform__gizmo_2plugin_8hpp.html new file mode 100644 index 0000000000..b5123e58d1 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2transform__gizmo_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/transform_gizmo/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/transform_gizmo/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto transformGizmoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2world__inspector_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2world__inspector_2plugin_8hpp.html new file mode 100644 index 0000000000..baa833b91d --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2tools_2world__inspector_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/world_inspector/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/tools/world_inspector/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto worldInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2transform_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2transform_2plugin_8hpp.html new file mode 100644 index 0000000000..1a420b870b --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2transform_2plugin_8hpp.html @@ -0,0 +1,158 @@ + + + + + engine/transform/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/transform/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto transformPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag transformMissingLocalTag +
+
The LocalToWorld components are added to entities with Position, Rotation or Scale components.
+
+ CUBOS_ENGINE_API Tag transformMissingTag +
+
The Position, Rotation, Scale and possibly LocalToParent components are added to entities with LocalToWorld components.
+
+ CUBOS_ENGINE_API Tag transformUpdateRelativeTag +
+
The LocalToWorld or LocalToParent components are updated with the information from the Position, Rotation and Scale components.
+
+ CUBOS_ENGINE_API Tag transformUpdateTag +
+
The LocalToWorld components are updated with the information from the LocalToParent component and the LocalToWorld components of the parent.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2canvas_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2canvas_2plugin_8hpp.html new file mode 100644 index 0000000000..2c9de1e057 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2canvas_2plugin_8hpp.html @@ -0,0 +1,158 @@ + + + + + engine/ui/canvas/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto uiCanvasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag uiCanvasChildrenUpdateTag +
+
UICanvas components' information is passed to related UIElement components.
+
+ CUBOS_ENGINE_API Tag uiElementPropagateTag +
+
The UIElement components are updated with information from their parents.
+
+ CUBOS_ENGINE_API Tag uiBeginTag +
+
Readies canvas for drawing.
+
+ CUBOS_ENGINE_API Tag uiDrawTag +
+
Systems which draw to canvas should be tagged with this.
+
+ CUBOS_ENGINE_API Tag uiEndTag +
+
All queued draw commands are collected and executed to the render targets.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2color__rect_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2color__rect_2plugin_8hpp.html new file mode 100644 index 0000000000..a97723fec0 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2color__rect_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/color_rect/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/color_rect/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto colorRectPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2image_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2image_2plugin_8hpp.html new file mode 100644 index 0000000000..879b6904e2 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2ui_2image_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/image/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/image/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto uiImagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2utils_2free__camera_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2utils_2free__camera_2plugin_8hpp.html new file mode 100644 index 0000000000..68af4e885d --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2utils_2free__camera_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/utils/free_camera/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/utils/free_camera/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto freeCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2voxels_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2voxels_2plugin_8hpp.html new file mode 100644 index 0000000000..ac6653217b --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2voxels_2plugin_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/voxels/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto voxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/engine_2include_2cubos_2engine_2window_2plugin_8hpp.html b/preview/pr-1379/engine_2include_2cubos_2engine_2window_2plugin_8hpp.html new file mode 100644 index 0000000000..566bd30aa4 --- /dev/null +++ b/preview/pr-1379/engine_2include_2cubos_2engine_2window_2plugin_8hpp.html @@ -0,0 +1,150 @@ + + + + + engine/window/plugin.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/window/plugin.hpp file +

+

Plugin entry point.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Functions

+
+
+ auto windowPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag windowInitTag +
+
Window is opened, runs after settingsTag.
+
+ CUBOS_ENGINE_API Tag windowPollTag +
+
The window is polled for events, sending core::io::WindowEvent's.
+
+ CUBOS_ENGINE_API Tag windowRenderTag +
+
The window's back buffers are swapped.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/entity_8hpp.html b/preview/pr-1379/entity_8hpp.html new file mode 100644 index 0000000000..41b24b59fb --- /dev/null +++ b/preview/pr-1379/entity_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/entity/entity.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/entity.hpp file +

+

Struct cubos::core::ecs::Entity.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::Entity +
+
Identifies an entity.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/enum_8hpp.html b/preview/pr-1379/enum_8hpp.html new file mode 100644 index 0000000000..ae89eaf96e --- /dev/null +++ b/preview/pr-1379/enum_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/enum.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/enum.hpp file +

+

Class cubos::core::reflection::EnumTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::EnumTrait +
+
Provides enumeration functionality to an enumerated type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/environment_8hpp.html b/preview/pr-1379/environment_8hpp.html new file mode 100644 index 0000000000..10568caa7b --- /dev/null +++ b/preview/pr-1379/environment_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/lights/environment.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/lights/environment.hpp file +

+

Resource cubos::engine::RenderEnvironment.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderEnvironment +
+
Resource which stores the scene's ambient light and sky colors.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data-des-custom.html b/preview/pr-1379/examples-core-data-des-custom.html new file mode 100644 index 0000000000..dce8b317a9 --- /dev/null +++ b/preview/pr-1379/examples-core-data-des-custom.html @@ -0,0 +1,197 @@ + + + + + Examples » Core » Data » Deserialization » Custom Deserializer | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data » + Deserialization » + Custom Deserializer +

+

Implementing your own Deserializer.

+

To define your own deserializer type, you'll need to include core/data/des/deserializer.hpp. For simplicity, in this sample we'll use the following aliases:

#include <cubos/core/data/des/deserializer.hpp>
+
+using cubos::core::data::Deserializer;
+using cubos::core::reflection::Type;

We'll define a deserializer that will print the data to the standard output.

class MyDeserializer : public Deserializer
+{
+public:
+    MyDeserializer();
+
+protected:
+    bool decompose(const Type& type, void* value) override;
+};

In the constructor, we should set hooks to be called for deserializing primitive types or any other type we want to handle specifically.

In this example, we'll only handle int32_t, but usually you should at least cover all primitive types.

#include <cubos/core/reflection/external/primitives.hpp>
+
+using cubos::core::reflection::reflect;
+
+MyDeserializer::MyDeserializer()
+{
+    this->hook<int32_t>([](int32_t& value) {
+        Stream::stdOut.print("enter an int32_t: ");
+        Stream::stdIn.parse(value);
+        return true;
+    });
+}

The only other thing you need to do is implement the deserializer::decompose method, which acts as a catch-all for any type without a specific hook.

Here, we can use traits such as FieldsTrait to access the fields of a type and write to them.

In this sample, we'll only be handling fields and arrays, but you should try to cover as many kinds of data as possible.

#include <cubos/core/reflection/traits/array.hpp>
+#include <cubos/core/reflection/traits/fields.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::ArrayTrait;
+using cubos::core::reflection::FieldsTrait;
+
+bool MyDeserializer::decompose(const Type& type, void* value)
+{
+    if (type.has<ArrayTrait>())
+    {
+        const auto& arrayTrait = type.get<ArrayTrait>();
+        auto arrayView = arrayTrait.view(value);
+
+        auto length = static_cast<uint64_t>(arrayView.length());
+        Stream::stdOut.printf("enter array size: ", length);
+        Stream::stdIn.parse(length);
+
+        for (std::size_t i = 0; i < static_cast<std::size_t>(length); ++i)
+        {
+            if (i == arrayView.length())
+            {
+                arrayView.insertDefault(i);
+            }
+
+            Stream::stdOut.printf("writing array[{}]: ", i);
+            this->read(arrayTrait.elementType(), arrayView.get(i));
+        }
+
+        while (arrayView.length() > static_cast<std::size_t>(length))
+        {
+            arrayView.erase(static_cast<std::size_t>(length));
+        }
+
+        return true;
+    }

We start by checking if the type can be viewed as an array. If it can, we'll ask the user how many elements they want the array to have. We resize it, and then, we recurse into the elements. If the type doesn't have this trait, we'll fallback into checking if it has fields.

    if (type.has<FieldsTrait>())
+    {
+        for (const auto& [field, fieldValue] : type.get<FieldsTrait>().view(value))
+        {
+            Stream::stdOut.printf("writing field '{}': ", field->name());
+            if (!this->read(field->type(), fieldValue))
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    CUBOS_WARN("Cannot decompose {}", type.name());
+    return false;
+}

If the type has fields, we'll iterate over them and ask the user to enter values for them. Otherwise, we'll fail by returning false.

Using our deserializer is as simple as constructing it and calling Deserializer::read on the data we want to deserialize.

In this case, we'll be deserializing a std::vector<glm::ivec3>, which is an array of objects with three int32_t fields.

#include <glm/vec3.hpp>
+
+#include <cubos/core/reflection/external/glm.hpp>
+#include <cubos/core/reflection/external/vector.hpp>
+
+int main()
+{
+    std::vector<glm::ivec3> vec{};
+    MyDeserializer des{};
+    des.read(vec);
+
+    Stream::stdOut.print("-----------\n");
+    Stream::stdOut.print("Resulting vec: [ ");
+    for (const auto& v : vec)
+    {
+        Stream::stdOut.printf("({}, {}, {}) ", v.x, v.y, v.z);
+    }
+    Stream::stdOut.print("]\n");
+}

This should output the values you enter when you execute it.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data-des.html b/preview/pr-1379/examples-core-data-des.html new file mode 100644 index 0000000000..d0e73b69f5 --- /dev/null +++ b/preview/pr-1379/examples-core-data-des.html @@ -0,0 +1,106 @@ + + + + + Examples » Core » Data » Deserialization | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data » + Deserialization +

+

Using the Deserialization module.

+

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data-ser-custom.html b/preview/pr-1379/examples-core-data-ser-custom.html new file mode 100644 index 0000000000..48edc5ee26 --- /dev/null +++ b/preview/pr-1379/examples-core-data-ser-custom.html @@ -0,0 +1,182 @@ + + + + + Examples » Core » Data » Serialization » Custom Serializer | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data » + Serialization » + Custom Serializer +

+

Implementing your own Serializer.

+

To define your own serializer type, you'll need to include core/data/ser/serializer.hpp. For simplicity, in this sample we'll use the following aliases:

#include <cubos/core/data/ser/serializer.hpp>
+
+using cubos::core::data::Serializer;
+using cubos::core::reflection::Type;

We'll define a serializer that will print the data to the standard output.

class MySerializer : public Serializer
+{
+public:
+    MySerializer();
+
+protected:
+    bool decompose(const Type& type, const void* value) override;
+};

In the constructor, we should set hooks to be called for serializing primitive types or any other type we want to handle specifically.

In this example, we'll only handle int32_t, but usually you should at least cover all primitive types.

#include <cubos/core/reflection/external/primitives.hpp>
+
+using cubos::core::reflection::reflect;
+
+MySerializer::MySerializer()
+{
+    this->hook<int32_t>([](const int32_t& value) {
+        Stream::stdOut.print(value);
+        return true;
+    });
+}

The only other thing you need to do is implement the Serializer::decompose method, which acts as a catch-all for any type without a specific hook.

Here, we can use traits such as FieldsTrait to get the fields of a type and print them.

In this sample, we'll only be handling fields and arrays, but you should try to cover as many kinds of data as possible.

#include <cubos/core/reflection/traits/array.hpp>
+#include <cubos/core/reflection/traits/fields.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::ArrayTrait;
+using cubos::core::reflection::FieldsTrait;
+
+bool MySerializer::decompose(const Type& type, const void* value)
+{
+    if (type.has<ArrayTrait>())
+    {
+        const auto& arrayTrait = type.get<ArrayTrait>();
+
+        Stream::stdOut.put('[');
+        for (const auto* element : arrayTrait.view(value))
+        {
+            if (!this->write(arrayTrait.elementType(), element))
+            {
+                return false;
+            }
+            Stream::stdOut.print(", ");
+        }
+        Stream::stdOut.put(']');
+
+        return true;
+    }

We start by checking if the type can be viewed as an array. If it can, we recurse into its elements. Otherwise, we'll fallback to the fields of the type.

    if (type.has<FieldsTrait>())
+    {
+        Stream::stdOut.put('{');
+        for (const auto& [field, fieldValue] : type.get<FieldsTrait>().view(value))
+        {
+            Stream::stdOut.printf("{}: ", field->name());
+            if (!this->write(field->type(), fieldValue))
+            {
+                return false;
+            }
+            Stream::stdOut.print(", ");
+        }
+        Stream::stdOut.put('}');
+
+        return true;
+    }
+
+    CUBOS_WARN("Cannot decompose {}", type.name());
+    return false;
+}

If the type has fields, we'll iterate over them and print them. Otherwise, we'll fail by returning false.

Using our serializer is as simple as constructing it and calling Serializer::write on the data we want to serialize.

In this case, we'll be serializing a std::vector<glm::ivec3>, which is an array of objects with three int32_t fields.

#include <glm/vec3.hpp>
+
+#include <cubos/core/reflection/external/glm.hpp>
+#include <cubos/core/reflection/external/vector.hpp>
+
+int main()
+{
+    std::vector<glm::ivec3> vec{{1, 2, 3}, {4, 5, 6}};
+
+    MySerializer ser{};
+    ser.write(vec);
+}

This should output:

// [{x: 1, y: 2, z: 3, }, {x: 4, y: 5, z: 6, }, ]
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data-ser-json.html b/preview/pr-1379/examples-core-data-ser-json.html new file mode 100644 index 0000000000..42ded47292 --- /dev/null +++ b/preview/pr-1379/examples-core-data-ser-json.html @@ -0,0 +1,121 @@ + + + + + Examples » Core » Data » Serialization » JSON Serializer | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data » + Serialization » + JSON Serializer +

+

Implementing JSONSerializer.

+

You'll need to include core/data/ser/json.hpp. For simplicity, in this sample we'll use the following aliases:

#include <cubos/core/data/ser/serializer.hpp>
+
+using cubos::core::data::Serializer;
+using cubos::core::reflection::Type;

Using the JSON serializer is as simple as calling JSONSerializer::write on the data we want to serialize.

In this case, we'll be serializing a std::vector<std::vector<std::vector<glm::ivec3>>>, which is a nested array of objects with three int32_t fields.

#include <glm/vec3.hpp>
+
+#include <cubos/core/reflection/external/glm.hpp>
+#include <cubos/core/reflection/external/vector.hpp>
+
+int main()
+{
+    std::vector<glm::ivec3> vec{{1, 2, 3}, {4, 5, 6}};
+
+    MySerializer ser{};
+    ser.write(vec);
+}

This should output:

// [{x: 1, y: 2, z: 3, }, {x: 4, y: 5, z: 6, }, ]
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data-ser.html b/preview/pr-1379/examples-core-data-ser.html new file mode 100644 index 0000000000..59f9289a7a --- /dev/null +++ b/preview/pr-1379/examples-core-data-ser.html @@ -0,0 +1,106 @@ + + + + + Examples » Core » Data » Serialization | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data » + Serialization +

+

Using the Serialization module.

+

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-data.html b/preview/pr-1379/examples-core-data.html new file mode 100644 index 0000000000..f1d206dbee --- /dev/null +++ b/preview/pr-1379/examples-core-data.html @@ -0,0 +1,105 @@ + + + + + Examples » Core » Data | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Data +

+

Using the Data module.

+

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-net-tcp-sockets.html b/preview/pr-1379/examples-core-net-tcp-sockets.html new file mode 100644 index 0000000000..72fbc63582 --- /dev/null +++ b/preview/pr-1379/examples-core-net-tcp-sockets.html @@ -0,0 +1,145 @@ + + + + + Examples » Core » Networking » Tcp Sockets | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Networking » + Tcp Sockets +

+

Using TCP sockets for communication between a server and a client.

+

This example demonstrates how to set up a TCP server and client, exchanging data, using the Cubos engine.

The TCP sockets are wrapped around a cubos::core::net::TcpListener and cubos::core::net::TcpStream classes for a better API and simpler usage.

First, we need the network dependencies:

#include <cubos/core/net/tcp_listener.hpp>
+#include <cubos/core/net/tcp_stream.hpp>

We'll also define some dummy constants for demonstration purposes:

#define SERVER_ADDRESS Address::LocalHost
+#define SERVER_PORT 8080

Now, let's launch the "TCP server", which will be a cubos::core::net::TcpListener waiting for a new connection, and quit after receveing a message from client via cubos::core::net::TcpStream .

void runServer()
+{
+    TcpListener listener;
+    listener.listen(SERVER_ADDRESS, SERVER_PORT, 1);
+
+    CUBOS_DEBUG("Server is listening");
+
+    TcpStream clientStream;
+    while (listener.accept(clientStream))
+    {
+        char buffer[1024];
+        if (std::size_t bytesRead = clientStream.read(buffer, sizeof(buffer)); bytesRead > 0)
+        {
+            CUBOS_INFO("Received message: {} with size {}", buffer, bytesRead);
+            break;
+        }
+    }
+
+    listener.close();
+}

Server is up and waiting, so let's create the client which will send a message to the server.

void runClient()
+{
+    TcpStream stream;
+    stream.connect(SERVER_ADDRESS, SERVER_PORT);
+
+    const char* message = "Hello Cubos!";
+    stream.write(message, std::strlen(message));
+    stream.disconnect();
+}

To finish off, let's launch them in separate threads, because we are using blocking methods (such as accept).

Output:

[20:36:53.918] [tcp_listener.cpp:67 listen] info: TCP listener socket '3' at address "127.0.0.1" with port '8080'
+[20:36:53.919] [main.cpp:28 runServer] debug: Server is listening
+[20:36:54.918] [tcp_listener.cpp:80 accept] info: Connecting stream to socket
+[20:36:54.919] [tcp_stream.cpp:45 connect] info: New TCP stream at address "127.0.0.1" and port '8080'
+[20:36:54.919] [tcp_stream.cpp:54 inner] info: New TCP stream at socket 4
+[20:36:54.919] [tcp_stream.cpp:136 write] info: Sent TCP message
+[20:36:54.919] [tcp_stream.cpp:111 read] info: Incoming TCP message
+[20:36:54.920] [main.cpp:36 runServer] info: Received message: "Hello Cubos!" with size 12
+[20:36:54.920] [tcp_stream.cpp:62 disconnect] warn: Closing TCP stream socket: '5'
+[20:36:54.920] [tcp_listener.cpp:89 close] warn: Closing TCP listener socket: '3'
+[20:36:54.921] [tcp_stream.cpp:62 disconnect] warn: Closing TCP stream socket: '4'
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-net-udp-sockets.html b/preview/pr-1379/examples-core-net-udp-sockets.html new file mode 100644 index 0000000000..0ff155143e --- /dev/null +++ b/preview/pr-1379/examples-core-net-udp-sockets.html @@ -0,0 +1,156 @@ + + + + + Examples » Core » Networking » Udp Sockets | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Networking » + Udp Sockets +

+

Using UDP sockets for communication between a server and a client.

+

This example demonstrates how to set up a UDP server and client using the Cubos engine.

First, we need the network dependencies

#include <cubos/core/net/udp_socket.hpp>

We'll also define some dummy constants for demonstration purposes

#define SERVER_ADDRESS Address::LocalHost
+#define SERVER_PORT 8080
+
+#define CLIENT_ADDRESS Address::LocalHost
+#define CLIENT_PORT 8081

Now, let's launch the UDP server, which will wait for a message and stop once it receives it

void runServer()
+{
+    UdpSocket server;
+    CUBOS_INFO("Server is running and waiting for messages at port {}", SERVER_PORT);
+
+    char buffer[1024];
+    size_t received;
+    Address senderAddress;
+    while (true)
+    {
+        if (server.receive(buffer, sizeof(buffer), received, senderAddress))
+        {
+            buffer[received] = '\0'; // C strings :)
+            CUBOS_INFO("Received message: {} with size {}", buffer, received);
+            break;
+        }
+
+        CUBOS_ERROR("Receive error");
+    }
+}

Server is up, so let's create the UDP client which will send a message to the server

void runClient()
+{
+    UdpSocket client;
+    CUBOS_ASSERT(client.bind(CLIENT_PORT, CLIENT_ADDRESS), "Failed to bind client socket");
+
+    // sleep for a bit to make sure server is up before sending message
+    std::this_thread::sleep_for(std::chrono::seconds(1));
+
+    const char* msg = "Hello, I'm a Cubos UDP client!";
+    if (!client.send(msg, std::strlen(msg), SERVER_ADDRESS, SERVER_PORT))
+    {
+        CUBOS_ERROR("Failed to send message");
+        return;
+    }
+
+    CUBOS_INFO("Message sent to server");
+}

Pretty easy huh? To finish off, let's launch them in separate threads

int main()
+{
+    std::thread serverThread(runServer);
+    std::thread clientThread(runClient);
+
+    serverThread.join();
+    clientThread.join();
+
+    return 0;
+}

Output:

[15:14:06.503] [main.cpp:25 runServer] info: Server is running and waiting for messages at port 8080
+[15:14:07.503] [main.cpp:60 runClient] info: Message sent to server
+[15:14:07.503] [main.cpp:34 runServer] info: Received message: "Hello, I'm a Cubos UDP client!" with size 30
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-networking.html b/preview/pr-1379/examples-core-networking.html new file mode 100644 index 0000000000..b0909f5adc --- /dev/null +++ b/preview/pr-1379/examples-core-networking.html @@ -0,0 +1,105 @@ + + + + + Examples » Core » Networking | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Networking +

+

Using the core-net module.

+

  • Udp Sockets - Using UDP sockets for communication between a server and a client.
  • Tcp Sockets - Using TCP sockets for communication between a server and a client.
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-basic.html b/preview/pr-1379/examples-core-reflection-basic.html new file mode 100644 index 0000000000..caa8e50918 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-basic.html @@ -0,0 +1,144 @@ + + + + + Examples » Core » Reflection » Basic Usage | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Basic Usage +

+

Defining and using reflectable types.

+

Lets say you have a type Person, which you want to be able to reflect. You can declare it as reflectable using the macro CUBOS_REFLECT, for example, in your header, like this:

#include <cubos/core/reflection/reflect.hpp>
+
+struct Person
+{
+    CUBOS_REFLECT;
+    int age;
+    float weight;
+};

The file core/reflection/reflect.hpp is a very lightweight header which you should include when declaring types as reflectable. It only defines the reflection macros and the reflection function. Avoid including other unnecessary reflection headers, which might be heavier, in order to reduce compile times.

In your source file, you must define the reflection data for your type. This is done through the CUBOS_REFLECT_IMPL macro:

#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(Person)
+{
+    return Type::create("Person");
+}

To access this reflection data, you should use the cubos::core::reflection::reflect function, which is also defined in the core/reflection/reflect.hpp header.

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& personType = reflect<Person>();
+    CUBOS_ASSERT(personType.name() == "Person");

Lets say you want to associate your own data to your types, to describe them further. For example, imagine you're making a GUI editor for your game and you which to display the fields of your types in a tree view, with different colors for different types. You could associate colors to your types by defining a trait:

struct ColorTrait
+{
+    CUBOS_REFLECT;
+    float r, g, b;
+};

Now, when you define your type reflection, you add your trait with the Type::with method.

CUBOS_REFLECT_IMPL(ColorTrait)
+{
+    return Type::create("ColorTrait");
+}
+
+CUBOS_REFLECT_IMPL(Position)
+{
+    return Type::create("Position").with(ColorTrait{.r = 0.0F, .g = 1.0F, .b = 0.0F});
+}

To check if a type has a trait, you use the Type::has method.

    const auto& positionType = reflect<Position>();
+    CUBOS_ASSERT(positionType.has<ColorTrait>());
+    CUBOS_ASSERT(!personType.has<ColorTrait>());

To actually access the trait data, you use the Type::get method.

    const auto& colorTrait = positionType.get<ColorTrait>();
+    CUBOS_ASSERT(colorTrait.r == 0.0F);
+    CUBOS_ASSERT(colorTrait.g == 1.0F);
+    CUBOS_ASSERT(colorTrait.b == 0.0F);
+    return 0;
+}
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-array.html b/preview/pr-1379/examples-core-reflection-traits-array.html new file mode 100644 index 0000000000..617a0fe394 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-array.html @@ -0,0 +1,145 @@ + + + + + Examples » Core » Reflection » Array Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Array Trait +

+

Exposing and using array functionality of a type.

+

The ArrayTrait trait is used to expose the array functionality of a type. In this example, we will write a function which takes a type and an instance of that type, and prints its elements:

#include <cubos/core/reflection/traits/array.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::ArrayTrait;
+using cubos::core::reflection::Type;
+
+void printArray(const Type& type, const void* instance)
+{
+    const auto& arrayTrait = type.get<ArrayTrait>();

Through the trait, we can access the size of the array and its element type:

    auto arrayView = arrayTrait.view(instance);
+    CUBOS_INFO("Array with {} elements of type {}", arrayView.length(), arrayTrait.elementType().name());

We can also get pointers to the elements of the array and iterate over them:

    if (!arrayTrait.elementType().is<int32_t>())
+    {
+        CUBOS_INFO("This function does not support printing arrays of types other than int32_t");
+        return;
+    }
+
+    for (const auto* element : arrayView)
+    {
+        CUBOS_INFO("{}", *static_cast<const int32_t*>(element));
+    }
+}

In this example, we're only supporting arrays of int32_ts, but we could for example implement a printing function which supports all primitive types.

To make calling our function easier, we can add a convenience typed wrapper:

template <typename T>
+void printArray(const T& array)
+{
+    using cubos::core::reflection::reflect;
+
+    printArray(reflect<T>(), &array);
+}

Using this function is now as simple as:

// You must also include <cubos/core/reflection/external/primitives.hpp> :)
+#include <cubos/core/reflection/external/vector.hpp>
+
+int main()
+{
+    std::vector<int32_t> vec = {1, 1, 2, 3, 5, 8, 13};
+    printArray(vec);
+}

Its important to note that both the includes above are necessary, as we're reflecting the type std::vector<int32_t>, which also means reflecting int32_t.

Executing the sample should output:

// Array with 7 elements of type int32_t
+// 1
+// 1
+// 2
+// 3
+// 5
+// 8
+// 13
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-constructible.html b/preview/pr-1379/examples-core-reflection-traits-constructible.html new file mode 100644 index 0000000000..abbb152f0a --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-constructible.html @@ -0,0 +1,133 @@ + + + + + Examples » Core » Reflection » Constructible Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Constructible Trait +

+

Exposing the destructor and constructors of a type.

+

You may find it useful while working with type-erased data to be able to create copies of the data, destroy it, or move it around. The ConstructibleTrait trait exposes the size, alignment, destructor and constructors of a type.

Lets say you have a type Scale, which you want to be able to reflect, with a default value of 1.0:

#include <cubos/core/reflection/reflect.hpp>
+
+struct Scale
+{
+    CUBOS_REFLECT;
+    float value = 1.0F;
+};

We're going to add the ConstructibleTrait trait to it, so that we can create instances of it at runtime:

#include <cubos/core/reflection/traits/constructible.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::ConstructibleTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(Scale)
+{
+    return Type::create("Scale").with(ConstructibleTrait::typed<Scale>().withDefaultConstructor().build());
+}

Now, we can access the trait from the reflected type:

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& scaleType = reflect<Scale>();
+    CUBOS_ASSERT(scaleType.has<ConstructibleTrait>());
+    const auto& constructible = scaleType.get<ConstructibleTrait>();

Imagine for a moment that you don't know the type of the data you're working, and you only have access to its reflection data through scaleType. If you want to create a default instance of the type, you can call the default constructor stored in the trait:

    // Allocate memory for the instance and default-construct it.
+    void* instance = operator new(constructible.size());
+    constructible.defaultConstruct(instance);
+    CUBOS_ASSERT(static_cast<Scale*>(instance)->value == 1.0F);

Don't forget to destroy the instance manually when you're done with it:

    // Destroy the instance and deallocate its memory.
+    constructible.destruct(instance);
+    operator delete(instance);
+}
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-dictionary.html b/preview/pr-1379/examples-core-reflection-traits-dictionary.html new file mode 100644 index 0000000000..19316b8b75 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-dictionary.html @@ -0,0 +1,154 @@ + + + + + Examples » Core » Reflection » Dictionary Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Dictionary Trait +

+

Exposing and using dictionary functionality of a type.

+

The DictionaryTrait trait is used to expose the dictionary functionality of a type. In this example, we will write a function which takes a type and an instance of that type, and prints its entries:

#include <cubos/core/reflection/traits/dictionary.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::DictionaryTrait;
+using cubos::core::reflection::Type;
+
+void printDictionary(const Type& type, const void* instance)
+{
+    const auto& dictionaryTrait = type.get<DictionaryTrait>();

Through the trait, we can access the size of the dictionary and its key and value types:

    auto dictionaryView = dictionaryTrait.view(instance);
+    CUBOS_INFO("Dictionary with {} entries of key type {} and value type {}", dictionaryView.length(),
+               dictionaryTrait.keyType().name(), dictionaryTrait.valueType().name());

We can also iterate over the entries of a dictionary and access them:

    if (!dictionaryTrait.keyType().is<int32_t>() || !dictionaryTrait.valueType().is<int32_t>())
+    {
+        CUBOS_INFO("This function does not support printing dictionary with key and value types other than int32_t");
+        return;
+    }
+
+    for (auto [key, value] : dictionaryView)
+    {
+        CUBOS_INFO("{} -> {}", *static_cast<const int32_t*>(key), *static_cast<const int32_t*>(value));
+    }
+}

In this example, we're only supporting dictionaris which map int32_ts, but we could for example implement a printing function which supports all primitive types.

To make calling our function easier, we can add a convenience typed wrapper:

template <typename T>
+void printDictionary(const T& dictionary)
+{
+    using cubos::core::reflection::reflect;
+
+    printDictionary(reflect<T>(), &dictionary);
+}

Using this function is now as simple as:

#include <cubos/core/reflection/external/map.hpp>
+#include <cubos/core/reflection/external/primitives.hpp>
+
+int main()
+{
+    std::map<int32_t, int32_t> map = {
+        {1, 2},
+        {2, 4},
+        {3, 6},
+        {4, 8},
+    };
+    printDictionary(map);
+
+    // Dictionary with 4 entries of key type int32_t and value type int32_t
+    // 1 -> 2
+    // 2 -> 4
+    // 3 -> 6
+    // 4 -> 8
+}

Its important to note that both the includes above are necessary, as we're reflecting the type std::map<int32_t, int32_t>, which also means reflecting int32_t.

Executing the sample should output:

    // Dictionary with 4 entries of key type int32_t and value type int32_t
+    // 1 -> 2
+    // 2 -> 4
+    // 3 -> 6
+    // 4 -> 8
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-enum.html b/preview/pr-1379/examples-core-reflection-traits-enum.html new file mode 100644 index 0000000000..85b89b717b --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-enum.html @@ -0,0 +1,166 @@ + + + + + Examples » Core » Reflection » Enum Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Enum Trait +

+

Exposing an enumeration with variants.

+

In this example, we'll explore how to expose an enumeration along with its variants using cubos::core::reflection::EnumTrait.

#include <cubos/core/reflection/reflect.hpp>
+
+enum class Color
+{
+    Red,
+    Green,
+    Blue
+};
+
+CUBOS_REFLECT_EXTERNAL_DECL(CUBOS_EMPTY, Color);
#include <cubos/core/reflection/traits/enum.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::EnumTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_EXTERNAL_IMPL(Color)
+{
+    return Type::create("Color").with(
+        EnumTrait{}.withVariant<Color::Red>("Red").withVariant<Color::Green>("Green").withVariant<Color::Blue>("Blue"));
+}

This section includes the necessary headers for reflection and defines the reflection for the Color enumeration.

Output:

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& colorType = reflect<Color>();
+    CUBOS_ASSERT(colorType.has<EnumTrait>());
+
+    const auto& variants = colorType.get<EnumTrait>();
+    CUBOS_ASSERT(variants.contains("Red"));
+    CUBOS_ASSERT(variants.contains("Green"));
+    CUBOS_ASSERT(variants.contains("Blue"));
+    CUBOS_ASSERT(!variants.contains("White"));
+
+    Color c = Color::Red;
+    CUBOS_ASSERT(variants.at("Red").test(&c));
+
+    c = Color::Green;
+    CUBOS_ASSERT(variants.at("Green").test(&c));
+
+    c = Color::Blue;
+    CUBOS_ASSERT(variants.at("Blue").test(&c));
+    variants.at("Red").set(&c);
+    CUBOS_ASSERT(variants.at("Red").test(&c));
+    CUBOS_ASSERT(variants.at("Red").name() == "Red");
+    CUBOS_ASSERT(variants.size() == 3);
+
+    for (const auto& v : variants)
+    {
+        CUBOS_INFO("Variant {}", v.name());
+    }
+
+    CUBOS_INFO("{}", EnumTrait::toString(Color::Red)); // should print Red
+    Color buf;
+    CUBOS_ASSERT(EnumTrait::fromString(buf, "Green"));
+    CUBOS_INFO("{}", EnumTrait::toString(buf)); // should print Green
+
+    return 0;
+}
[2023-11-19 13:09:36.117] [info] [main.cpp:59] Variant 'Red'
+[2023-11-19 13:09:36.118] [info] [main.cpp:59] Variant 'Green'
+[2023-11-19 13:09:36.119] [info] [main.cpp:59] Variant 'Blue'
+[2023-11-19 13:09:36.119] [info] [main.cpp:62] 'Red'
+[2023-11-19 13:09:36.119] [info] [main.cpp:65] 'Green'
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-fields.html b/preview/pr-1379/examples-core-reflection-traits-fields.html new file mode 100644 index 0000000000..3e69175e29 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-fields.html @@ -0,0 +1,162 @@ + + + + + Examples » Core » Reflection » Fields Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Fields Trait +

+

Exposing the fields of a type.

+

For structured types, like classes and structs, you might want to expose its public fields using the FieldsTrait trait. In this example, we'll expose the fields of the following type:

#include <cubos/core/reflection/reflect.hpp>
+
+struct Person
+{
+    CUBOS_REFLECT;
+    int32_t age;
+    float weight;
+    bool dead;
+};

In its reflection definition, we'll add the FieldsTrait trait to it with each of the fields we want to expose:

#include <cubos/core/reflection/traits/fields.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+// Since we're exposing fields of primitive types (int32_t, float and bool), its important to
+// include the header which defines their reflection.
+#include <cubos/core/reflection/external/primitives.hpp>
+
+using cubos::core::reflection::FieldsTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(Person)
+{
+    return Type::create("Person").with(FieldsTrait()
+                                           .withField("age", &Person::age)
+                                           .withField("weight", &Person::weight)
+                                           .withField("dead", &Person::dead));
+}

Accessing this trait is the same as with any other trait:

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& personType = reflect<Person>();
+    CUBOS_ASSERT(personType.has<FieldsTrait>());
+    const auto& fields = personType.get<FieldsTrait>();

We can iterate over the fields of the type with it:

    for (const auto& field : fields)
+    {
+        CUBOS_INFO("Field {} of type {}", field.name(), field.type().name());
+    }

This should output:

    // Field 'age' of type 'int32_t'
+    // Field 'weight' of type 'float'
+    // Field 'dead' of type 'bool'

Its also possible to access the fields of an instance of the type, and iterate over them:

    Person person{.age = 21, .weight = 68.4F, .dead = false};
+    auto view = fields.view(&person);
+
+    for (auto [field, value] : view)
+    {
+        if (field->type().is<int32_t>())
+        {
+            CUBOS_INFO("Field {}: {}", field->name(), *static_cast<int32_t*>(value));
+        }
+        else if (field->type().is<float>())
+        {
+            CUBOS_INFO("Field {}: {}", field->name(), *static_cast<float*>(value));
+        }
+        else
+        {
+            CUBOS_INFO("Field {}: unsupported type {}", field->name(), field->type().name());
+        }
+    }
    // Field 'age': 21
+    // Field 'weight': 68.4
+    // Field 'dead': unsupported type 'bool'

Its also possible to access the fields by name:

    *static_cast<float*>(view.get("weight")) += 20.0F;
+    CUBOS_INFO("New weight: {}", person.weight); // 88.4
+}
// New weight: 88.4
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-inherits.html b/preview/pr-1379/examples-core-reflection-traits-inherits.html new file mode 100644 index 0000000000..6d931e2eb4 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-inherits.html @@ -0,0 +1,176 @@ + + + + + Examples » Core » Reflection » Inherits Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Inherits Trait +

+

Exposing the inheritance relationship between types.

+

For structured types, you might want to expose their inheritance relationships using InheritsTrait. This trait allows you to specify the parent type from which another type inherits.

In this example, we have three simple structs, GrandParent, Parent and Son, where Son is declared to inherit from Parent, and parent from GrandParent.

#include <cubos/core/reflection/reflect.hpp>
+
+struct GrandParent
+{
+    CUBOS_REFLECT;
+};
+
+struct Parent
+{
+    CUBOS_REFLECT;
+};
+
+struct Son
+{
+    CUBOS_REFLECT;
+};
#include <cubos/core/reflection/traits/inherits.hpp>
+
+using cubos::core::reflection::InheritsTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(GrandParent)
+{
+    return Type::create("GrandParent");
+}
+
+CUBOS_REFLECT_IMPL(Parent)
+{
+    return Type::create("Parent").with(InheritsTrait::from<GrandParent>());
+}
+
+CUBOS_REFLECT_IMPL(Son)
+{
+    return Type::create("Son").with(InheritsTrait::from<Parent>());
+}
template <typename T>
+void reflectType()
+{
+    using cubos::core::reflection::reflect;
+
+    const Type& type = reflect<T>();
+
+    if (type.has<InheritsTrait>() && type.get<InheritsTrait>().inherits<Parent>())
+    {
+        CUBOS_INFO("{} inherits from Parent", type.name());
+    }
+    else
+    {
+        CUBOS_INFO("{} DOES NOT inherit from Parent", type.name());
+    }
+
+    if (type.has<InheritsTrait>() && type.get<InheritsTrait>().inherits<GrandParent>())
+    {
+        CUBOS_INFO("{} inherits from GrandParent", type.name());
+    }
+    else
+    {
+        CUBOS_INFO("{} DOES NOT inherit from GrandParent", type.name());
+    }
+}
+
+int main()
+{
+    reflectType<Son>();
+    reflectType<Parent>();
+    reflectType<int>();
+    return 0;
+}

Output:

[15:30:10.611] [main.cpp:56 reflectType] info: "Son" inherits from Parent
+[15:30:10.611] [main.cpp:65 reflectType] info: "Son" inherits from GrandParent
+[15:30:10.611] [main.cpp:60 reflectType] info: "Parent" DOES NOT inherit from Parent
+[15:30:10.611] [main.cpp:65 reflectType] info: "Parent" inherits from GrandParent
+[15:30:10.611] [main.cpp:60 reflectType] info: "int" DOES NOT inherit from Parent
+[15:30:10.611] [main.cpp:69 reflectType] info: "int" DOES NOT inherit from GrandParent
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-mask.html b/preview/pr-1379/examples-core-reflection-traits-mask.html new file mode 100644 index 0000000000..1f9279314d --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-mask.html @@ -0,0 +1,178 @@ + + + + + Examples » Core » Reflection » Mask Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Mask Trait +

+

Exposing a bit mask type.

+

In this example, we'll explore how to expose a bit mask along with its bits using cubos::core::reflection::MaskTrait.

#include <cubos/core/reflection/reflect.hpp>
+
+enum class Permissions
+{
+    None = 0,
+
+    Read = 1,
+    Write = 2,
+    Execute = 4
+};
+
+CUBOS_REFLECT_EXTERNAL_DECL(CUBOS_EMPTY, Permissions);
+
+inline Permissions operator~(Permissions p)
+{
+    return static_cast<Permissions>(~static_cast<int>(p));
+}
+
+inline Permissions operator|(Permissions a, Permissions b)
+{
+    return static_cast<Permissions>(static_cast<int>(a) | static_cast<int>(b));
+}
+
+inline Permissions operator&(Permissions a, Permissions b)
+{
+    return static_cast<Permissions>(static_cast<int>(a) & static_cast<int>(b));
+}
#include <cubos/core/reflection/traits/mask.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::MaskTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_EXTERNAL_IMPL(Permissions)
+{
+    return Type::create("Permissions")
+        .with(MaskTrait{}
+                  .withBit<Permissions::Read>("Read")
+                  .withBit<Permissions::Write>("Write")
+                  .withBit<Permissions::Execute>("Execute"));
+}

Notice that we don't include the None type in the trait, as it doesn't correspond to a bit.

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& permissionsType = reflect<Permissions>();
+    CUBOS_ASSERT(permissionsType.has<MaskTrait>());
+
+    const auto& mask = permissionsType.get<MaskTrait>();
+    CUBOS_ASSERT(mask.contains("Read"));
+    CUBOS_ASSERT(mask.contains("Write"));
+    CUBOS_ASSERT(mask.contains("Execute"));
+    CUBOS_ASSERT(!mask.contains("None"));
+
+    auto p = Permissions::Read | Permissions::Write;
+    CUBOS_ASSERT(mask.view(&p).test("Read"));
+    CUBOS_ASSERT(mask.view(&p).test("Write"));
+    CUBOS_ASSERT(!mask.view(&p).test("Execute"));
+
+    for (const auto& b : mask)
+    {
+        CUBOS_INFO("Type has bit {}", b.name());
+    }
+
+    for (const auto& b : mask.view(&p))
+    {
+        CUBOS_INFO("Value has bit {} set", b.name());
+    }
+
+    return 0;
+}
// Type has bit "Read"
+// Type has bit "Write"
+// Type has bit "Execute"
+// Value has bit "Read" set
+// Value has bit "Write" set
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-nullable.html b/preview/pr-1379/examples-core-reflection-traits-nullable.html new file mode 100644 index 0000000000..1cc4ba3ac8 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-nullable.html @@ -0,0 +1,159 @@ + + + + + Examples » Core » Reflection » Nullable Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + Nullable Trait +

+

Handling null type representation.

+

The NullableTrait is a reflection trait designed to provide a mechanism for representing a null state for a specific type. This is particularly useful when working with types that are not literally null but can be conceptually treated as null in certain scenarios.

Consider a scenario where you have a data structure, such as the Entity struct, which represents an entity with an index and a generation. In some cases, you may want to define a special state that indicates the absence of a valid entity instead of checking if both fields are UINT32_MAX. So, instead of using a separate boolean flag to represent this state, the NullableTrait allows you to define a custom condition for considering an instance of the type as "null".

So, let's see how we can use this. First, we create a reflectable structure:

#include <cubos/core/reflection/reflect.hpp>
+
+struct MyEntity
+{
+    CUBOS_REFLECT;
+    uint32_t idx;
+    uint32_t generation;
+};

In the reflection definition, we use the NullableTrait to define the conditions under which an instance of MyEntity is considered null, and also another to set it to null.

#include <cubos/core/reflection/traits/nullable.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+// Since we're exposing fields of primitive types (uint32_t), its important to
+// include the header which defines their reflection.
+#include <cubos/core/reflection/external/primitives.hpp>
+
+using cubos::core::reflection::NullableTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(MyEntity)
+{
+    return Type::create("MyEntity")
+        .with(NullableTrait{[](const void* instance) {
+                                const auto* ent = static_cast<const MyEntity*>(instance);
+                                return ent->idx == UINT32_MAX && ent->generation == UINT32_MAX;
+                            },
+                            [](void* instance) {
+                                auto* ent = static_cast<MyEntity*>(instance);
+                                ent->idx = UINT32_MAX;
+                                ent->generation = UINT32_MAX;
+                            }});
+}

Now, we can simply use it:

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    // Retrieve the reflection information for MyEntity
+    const auto& entityType = reflect<MyEntity>();
+
+    // Check if MyEntity has the NullableTrait
+    CUBOS_ASSERT(entityType.has<NullableTrait>());
+
+    // Retrieve the NullableTrait for MyEntity
+    const auto& nullableTrait = entityType.get<NullableTrait>();
+
+    // Create an instance of MyEntity
+    MyEntity ent{1, 1};
+
+    // Check if the instance is not null
+    CUBOS_ASSERT(!nullableTrait.isNull(&ent));
+
+    // Set the instance to the null state
+    nullableTrait.setToNull(&ent);
+
+    // Check if the instance is now null
+    CUBOS_ASSERT(nullableTrait.isNull(&ent));
+}
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection-traits-string-conversion.html b/preview/pr-1379/examples-core-reflection-traits-string-conversion.html new file mode 100644 index 0000000000..a07e47965a --- /dev/null +++ b/preview/pr-1379/examples-core-reflection-traits-string-conversion.html @@ -0,0 +1,136 @@ + + + + + Examples » Core » Reflection » String Conversion Trait | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection » + String Conversion Trait +

+

Exposing string conversion functions of a type.

+

Lets say you have a type Name, which is just a wrapper around an std::string. If you want it to be picked up by (de)serializers and other reflection consumers as just a string, you can add the StringConversionTrait to your type.

#include <cubos/core/reflection/reflect.hpp>
+
+struct Name
+{
+    CUBOS_REFLECT;
+    std::string inner;
+};

The trait's constructor takes two functions: one to convert an instance of the to a string, and the other to convert a string to an instance of the type. The first method never fails, but the second one should return a boolean indicating whether the passed string was valid.

#include <cubos/core/reflection/traits/string_conversion.hpp>
+#include <cubos/core/reflection/type.hpp>
+
+using cubos::core::reflection::StringConversionTrait;
+using cubos::core::reflection::Type;
+
+CUBOS_REFLECT_IMPL(Name)
+{
+    return Type::create("Name").with(
+        StringConversionTrait{[](const void* instance) { return static_cast<const Name*>(instance)->inner; },
+                              [](void* instance, const std::string& string) {
+                                  static_cast<Name*>(instance)->inner = string;
+                                  return !string.empty(); // Only accept non-empty strings.
+                              }});
+}

Now, we can access the trait from the reflected type:

int main()
+{
+    using cubos::core::reflection::reflect;
+
+    const auto& nameType = reflect<Name>();
+    CUBOS_ASSERT(nameType.has<StringConversionTrait>());
+    const auto& stringConversion = nameType.get<StringConversionTrait>();

Using the trait is as simple as:

    Name name{"Michael"};
+    CUBOS_ASSERT(stringConversion.into(&name) == "Michael");
    CUBOS_ASSERT(stringConversion.from(&name, "John") == true); // Valid name, returns true
+    CUBOS_ASSERT(name.inner == "John");
+    CUBOS_ASSERT(stringConversion.from(&name, "") == false); // Invalid name, returns false
+}
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-reflection.html b/preview/pr-1379/examples-core-reflection.html new file mode 100644 index 0000000000..4b7fb22d24 --- /dev/null +++ b/preview/pr-1379/examples-core-reflection.html @@ -0,0 +1,105 @@ + + + + + Examples » Core » Reflection | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Reflection +

+

Using the Reflection module.

+

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-tel-logging.html b/preview/pr-1379/examples-core-tel-logging.html new file mode 100644 index 0000000000..d3e8b954ff --- /dev/null +++ b/preview/pr-1379/examples-core-tel-logging.html @@ -0,0 +1,144 @@ + + + + + Examples » Core » Telemetry » Logging | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Telemetry » + Logging +

+

Using the logging system.

+

Logging in Cubos is done through the logging macros defined in core/tel/logging.hpp.

#include <cubos/core/tel/logging.hpp>

There are six logging levels, each with its own macro. In order of increasing severity, they are:

    CUBOS_TRACE("Trace message");
+    CUBOS_DEBUG("Debug message");
+    CUBOS_INFO("Info message");
+    CUBOS_WARN("Warning message");
+    CUBOS_ERROR("Error message");
+    CUBOS_CRITICAL("Critical message");

The minimum registered log level is set with level. On this sample, to demonstrate CUBOS_TRACE, we set it to Trace:

    cubos::core::tel::level(cubos::core::tel::Level::Trace);

The logger also supports logging to a file, which will by default be named to cubos_<timestamp>.log.

    cubos::core::tel::Logger::logToFile();

Or, if you want, you can set the file manually:

    cubos::core::tel::Logger::logToFile("/logs/sample_logs.txt");
$ cat /home/cubos/build/logs/cubos_15:25:30.191.log
+[15:25:30.192] [file.cpp:124 mount] info: Mounted archive at ""/"logs"
+[15:25:30.192] [file.cpp:322 create] trace: Created "file" "/logs/cubos_15:25:30.191"
+[15:25:30.192] [main.cpp:29 main] trace: Trace message
+[15:25:30.192] [main.cpp:30 main] debug: Debug message
+[15:25:30.192] [main.cpp:31 main] info: Info message
+[15:25:30.192] [main.cpp:32 main] warn: Warning message
+[15:25:30.193] [main.cpp:33 main] error: Error message
+[15:25:30.193] [main.cpp:34 main] critical: Critical message
+[15:25:30.193] [file.cpp:85 mount] error: Could not mount archive at "/logs"/"": "/logs" is already part of an archive
+[15:25:30.193] [main.cpp:42 main] info: An integer: 1
+[15:25:30.193] [main.cpp:43 main] info: A glm::vec3: (x: 0.0000, y: 1.0000, z: 2.0000)
+[15:25:30.194] [main.cpp:44 main] info: An std::unordered_map: {2: "two", 1: "one"}
+[15:25:30.194] [log.cpp:248 streamFormat] warn: You tried to print a type ("unnamed102322537939356") which doesn't implement reflection. Did you forget to include its reflection definition?
+[15:25:30.194] [main.cpp:45 main] info: A type without reflection: (no reflection)
$ cat /home/cubos/build/logs/sample_logs.txt 
+[15:23:03.737] [file.cpp:124 mount] info: Mounted archive at ""/"logs"
+[15:23:03.737] [main.cpp:29 main] trace: Trace message
+[15:23:03.737] [main.cpp:30 main] debug: Debug message
+[15:23:03.737] [main.cpp:31 main] info: Info message
+[15:23:03.737] [main.cpp:32 main] warn: Warning message
+[15:23:03.737] [main.cpp:33 main] error: Error message
+[15:23:03.738] [main.cpp:34 main] critical: Critical message
+[15:23:03.738] [main.cpp:38 main] info: An integer: 1
+[15:23:03.738] [main.cpp:39 main] info: A glm::vec3: (x: 0.0000, y: 1.0000, z: 2.0000)
+[15:23:03.738] [main.cpp:40 main] info: An std::unordered_map: {2: "two", 1: "one"}
+[15:23:03.738] [log.cpp:248 streamFormat] warn: You tried to print a type ("unnamed108664291041692") which doesn't implement reflection. Did you forget to include its reflection definition?
+[15:23:03.738] [main.cpp:41 main] info: A type without reflection: (no reflection)
+t reflection: (no reflection)

These macros can also take arguments, which can be of any reflectable type.

    CUBOS_INFO("An integer: {}", 1);
+    CUBOS_INFO("A glm::vec3: {}", glm::vec3(0.0F, 1.0F, 2.0F));
+    CUBOS_INFO("An std::unordered_map: {}", std::unordered_map<int, const char*>{{1, "one"}, {2, "two"}});
+}

To print external types, such as glm math types, STL types (std::string, ...) or primitives (int, ...), you'll have to include their respective headers in the core/reflection/external directory. Notice that although we aren't printing C-strings directly, we must still include them as our std::unordered_map contains const char*s.

#include <cubos/core/reflection/external/cstring.hpp>
+#include <cubos/core/reflection/external/glm.hpp>
+#include <cubos/core/reflection/external/primitives.hpp>
+#include <cubos/core/reflection/external/unordered_map.hpp>
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-tel-metrics.html b/preview/pr-1379/examples-core-tel-metrics.html new file mode 100644 index 0000000000..5f5d55d9f7 --- /dev/null +++ b/preview/pr-1379/examples-core-tel-metrics.html @@ -0,0 +1,167 @@ + + + + + Examples » Core » Telemetry » Metrics | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Telemetry » + Metrics +

+

Using the metrics system.

+

Registering metrics and profiling in Cubos can be done through the metric macros defined in core/tel/metrics.hpp and the core::tel::Metrics class. In order to enable these features, compile with -DENABLE_PROFILING.

#include <cubos/core/tel/metrics.hpp>
+
+using cubos::core::tel::Metrics;

The following example demonstrates a simple usage of the core::tel::Metrics class, simulating a random function that takes X milliseconds to finish, where X is randomly generated, and also registering metrics values.

This is the main loop:

    const int numFrames = 10;
+    for (int i = 0; i < numFrames; ++i)
+    {
+        // simulate frame by calling a function that does work..
+        simulateFrame(randomMs(0, 500));
+
+        // register some metrics, this could be FPS, entities count, ....
+        CUBOS_METRIC("i", i);
+    }

Which calls these utility functions:

static void simulateFrame(int ms)
+{
+    CUBOS_SPAN_INFO("simulateFrame");
+    std::this_thread::sleep_for(std::chrono::milliseconds(ms));
+}
static int randomMs(int min, int max)
+{
+    int range = (min - max) + 1;
+    return rand() % range + min;
+}

We can now get the existing metrics and their values:

    std::string name;
+    std::size_t seenCount = 0;
+    while (Metrics::readName(name, seenCount))
+    {
+        CUBOS_DEBUG("Found new metric: {}", name);
+        double value;
+        std::size_t offset = 0;
+        while (Metrics::readValue(name, value, offset))
+        {
+            CUBOS_DEBUG("{} : {}", name, value);
+        }
+    }

Output:

[17:21:59.677] [main.cpp:53 main] [thread21496] debug: Found new metric: "thread21496:simulateFrame:begin"
+[17:21:59.679] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.680] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.681] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.681] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.682] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.683] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.684] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.685] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.686] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.687] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:begin" : 5.0244E+8
+[17:21:59.687] [main.cpp:53 main] [thread21496] debug: Found new metric: "thread21496:simulateFrame:end"
+[17:21:59.688] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.689] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.690] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.691] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.693] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.694] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.695] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.696] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.697] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.698] [main.cpp:58 main] [thread21496] debug: "thread21496:simulateFrame:end" : 5.0244E+8
+[17:21:59.699] [main.cpp:53 main] [thread21496] debug: Found new metric: "thread21496:i"
+[17:21:59.700] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 0.0000
+[17:21:59.701] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 1.0000
+[17:21:59.701] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 2.0000
+[17:21:59.702] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 3.0000
+[17:21:59.703] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 4.0000
+[17:21:59.704] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 5.0000
+[17:21:59.705] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 6.0000
+[17:21:59.706] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 7.0000
+[17:21:59.707] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 8.0000
+[17:21:59.708] [main.cpp:58 main] [thread21496] debug: "thread21496:i" : 9.0000
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-tel-tracing.html b/preview/pr-1379/examples-core-tel-tracing.html new file mode 100644 index 0000000000..98858a9f9b --- /dev/null +++ b/preview/pr-1379/examples-core-tel-tracing.html @@ -0,0 +1,120 @@ + + + + + Examples » Core » Telemetry » Tracing | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Telemetry » + Tracing +

+

Using the tracing system.

+

Tracing in CUBOS can be done through the tracing macros defined in core/tel/tracing.hpp and the core::tel::SpanManager class.

#include <cubos/core/tel/level.hpp>
+#include <cubos/core/tel/logging.hpp>
+#include <cubos/core/tel/tracing.hpp>
+
+using cubos::core::tel::Level;
+using cubos::core::tel::Logger;
+using cubos::core::tel::SpanManager;

The following example demonstrates a simple usage of the tracing macros and core::tel::SpanManager class, utilizing spans to track execution flow and log messages.

    cubos::core::tel::level(Level::Debug);

The tracing level is shared with logger's one, via core::tel::level function.

Using the macros is simple as:

You can also do manual span management:

    SpanManager::begin("manual_span", cubos::core::tel::Level::Debug);
+    CUBOS_INFO("entered a manual span");
+
+    SpanManager::end();
+    CUBOS_INFO("after exit manual span");

We can observe the output of the tracing as follows:

[16:03:31.966] [main.cpp:20 main] [thread11740] info: hello from root span!
+[16:03:31.967] [main.cpp:26 main] [thread11740:main_span] info: hello!
+[16:03:31.967] [main.cpp:29 main] [thread11740:main_span:other_scope] info: hello again!
+[16:03:31.968] [main.cpp:34 main] [thread11740:main_span:other_scope:manual_span] info: entered a manual span
+[16:03:31.969] [main.cpp:37 main] [thread11740:main_span:other_scope] info: after exit manual span
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core-tel.html b/preview/pr-1379/examples-core-tel.html new file mode 100644 index 0000000000..1468d282a4 --- /dev/null +++ b/preview/pr-1379/examples-core-tel.html @@ -0,0 +1,105 @@ + + + + + Examples » Core » Telemetry | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core » + Telemetry +

+

Using the Core-tel module.

+

  • Logging - Using the logging system.
  • Metrics - Using the metrics system.
  • Tracing - Using the tracing system.
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-core.html b/preview/pr-1379/examples-core.html new file mode 100644 index 0000000000..2c3cd9e7b1 --- /dev/null +++ b/preview/pr-1379/examples-core.html @@ -0,0 +1,104 @@ + + + + + Examples » Core | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Core +

+

Showcases features of the Core library.

+

The following examples have fully documented tutorials:

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-assets-bridge.html b/preview/pr-1379/examples-engine-assets-bridge.html new file mode 100644 index 0000000000..2d38569623 --- /dev/null +++ b/preview/pr-1379/examples-engine-assets-bridge.html @@ -0,0 +1,143 @@ + + + + + Examples » Engine » Assets » Introduction and Custom Bridges | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Assets » + Introduction and Custom Bridges +

+

Basic Assets plugin features and creating your own bridges.

+

This example demonstrates how we can create a custom asset bridge to load assets of a given type. More specifically, we'll go through how we can create a bridge which loads std::strings from text files.

We define our bridge class by inheriting from cubos::engine::FileBridge, which offers a simple interface for loading and saving assets from files.

class TextBridge : public FileBridge
+{
+public:
+    TextBridge()
+        : FileBridge(cubos::core::reflection::reflect<std::string>())
+    {
+    }

We pass typeid(std::string) to the base class, so that the engine knows which type of assets this bridge can load. Then, we'll need to implement both the loadFromFile and saveToFile methods.

In the first method, we receive the assets manager where we should store the loaded data, the handle to the asset we're loading, and a stream to read the file data from.

    bool loadFromFile(Assets& assets, const AnyAsset& handle, Stream& stream) override
+    {
+        // Dump the file's contents into a string.
+        std::string contents;
+        stream.readUntil(contents, nullptr);
+
+        // Store the asset's data.
+        assets.store(handle, std::move(contents));
+        return true;
+    }

In the second method, we receive the assets manager, the handle to the asset we're saving, and a stream to write the file data to.

    bool saveToFile(const Assets& assets, const AnyAsset& handle, Stream& stream) override
+    {
+        // Get the asset's data.
+        auto contents = assets.read<std::string>(handle);
+
+        // Write the data to the file.
+        stream.print(*contents);
+        return true;
+    }
+};

Now that we have our bridge type, we must register it with the assets manager before using it.

    cubos.startupSystem("setup bridge to load .txt files").tagged(assetsBridgeTag).call([](Assets& assets) {
+        assets.registerBridge(".txt", std::make_unique<TextBridge>());
+    });

After this system runs, any time we load an asset whose path ends with .txt, the assets manager will use our bridge to load it.

In this sample we have a file sample.txt on the assets/ directory containing the following text:

How are you holding up?
+Because I'm a potato
+<clap clap clap>

We also have a file sample.txt.meta, which describes the asset for the engine. In this case, we only need to specify its UUID, which was generated on a UUID generator website:

{
+    "id": "6f42ae5a-59d1-5df3-8720-83b8df6dd536"
+}

Then, we can load it from our code:

    // Assets are identified through UUIDs which are defined in their .meta files.
+    static const Asset<std::string> SampleAsset = AnyAsset("6f42ae5a-59d1-5df3-8720-83b8df6dd536");
+
+    cubos.startupSystem("access .txt asset").tagged(assetsTag).call([](const Assets& assets) {
+        // Access the text asset - will be loaded automatically.
+        auto text = assets.read(SampleAsset);
+        Stream::stdOut.print(*text);
+    });

Some care must be taken when registering bridges or loading assets during the startup phase. Systems which add bridges should be tagged with cubos.assets.bridge so that they run before any assets are loaded. Similarly, startup systems which load assets should be tagged with cubos.assets so that they run after all bridges have been registered.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-assets-json.html b/preview/pr-1379/examples-engine-assets-json.html new file mode 100644 index 0000000000..7a17a729d4 --- /dev/null +++ b/preview/pr-1379/examples-engine-assets-json.html @@ -0,0 +1,125 @@ + + + + + Examples » Engine » Assets » Loading Reflectable Assets | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Assets » + Loading Reflectable Assets +

+

Loading reflectable assets from JSON.

+

We'll use the following type as an example:

struct Strings
+{
+    CUBOS_REFLECT;
+    std::vector<std::string> strings;
+};
+
+CUBOS_REFLECT_IMPL(Strings)
+{
+    return Type::create("Strings").with(FieldsTrait{}.withField("strings", &Strings::strings));
+}

Then, we must register a bridge for this type. We provide JSONBridge for easily loading and saving reflectable assets as JSON.

    cubos.startupSystem("setup bridge to load .strings files").tagged(assetsBridgeTag).call([](Assets& assets) {
+        assets.registerBridge(".strings", std::make_unique<JSONBridge<Strings>>());
+    });

With the bridge registered, we can just load it from its handle:

    static const Asset<Strings> SampleAsset = AnyAsset("6f42ae5a-59d1-5df3-8720-83b8df6dd536");
+
+    cubos.startupSystem("access .strings asset").tagged(assetsTag).call([](Assets& assets) {
+        auto read = assets.read(SampleAsset);
+        for (const auto& str : read->strings)
+        {
+            Stream::stdOut.printf("String: {}\n", str);
+        }
+    });

These sytems are configured the usual way, as explained in Introduction and Custom Bridges.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-assets-saving.html b/preview/pr-1379/examples-engine-assets-saving.html new file mode 100644 index 0000000000..0dc1e09292 --- /dev/null +++ b/preview/pr-1379/examples-engine-assets-saving.html @@ -0,0 +1,120 @@ + + + + + Examples » Engine » Assets » Creating and Saving | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Assets » + Creating and Saving +

+

Creating and saving assets.

+

This example demonstrates how a new asset can be created programatically and how it can be saved to the assets directory, which is useful while working on tools such as TESSERATOS

Before we go any further, if we want to save assets to the filesystem, we must allow assets to be modified. This is done through the following setting:

    cubos.startupSystem("configure Assets plugin").tagged(settingsTag).call([](Settings& settings) {
+        // If we want to save assets, we must set this to false.
+        settings.setBool("assets.io.readOnly", false);

We'll use the following asset type as an example, with a JSONBridge registered for it with the extension .int.

struct IntegerAsset
+{
+    CUBOS_REFLECT;
+    int value;
+};
+
+CUBOS_REFLECT_IMPL(IntegerAsset)
+{
+    return Type::create("IntegerAsset").with(FieldsTrait{}.withField("value", &IntegerAsset::value));
+}

First, we'll create an asset of this type:

    cubos.startupSystem("create and save asset").tagged(assetsTag).call([](Assets& assets) {
+        // Create a new asset (with a random UUID).
+        auto handle = assets.create(IntegerAsset{1337});

Then, we'll assign it a path and save it. It's important that the path ends with the correct extension, so that Assets knows which bridge to use when loading it.

        assets.writeMeta(handle)->set("path", "/assets/sample/sample.int");
+        assets.save(handle);

With this, the files sample/sample.int and sample/sample.int.meta should have appeared on the assets/ directory. The .meta file contains the UUID of the asset, which is used by the engine to identify it.

Try running the sample yourself to see the files being created!

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-assets.html b/preview/pr-1379/examples-engine-assets.html new file mode 100644 index 0000000000..78450d374c --- /dev/null +++ b/preview/pr-1379/examples-engine-assets.html @@ -0,0 +1,105 @@ + + + + + Examples » Engine » Assets | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Assets +

+

How to use the Assets plugin.

+

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-events.html b/preview/pr-1379/examples-engine-events.html new file mode 100644 index 0000000000..30d1b22723 --- /dev/null +++ b/preview/pr-1379/examples-engine-events.html @@ -0,0 +1,163 @@ + + + + + Examples » Engine » Events | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Events +

+

Using the EventReader and EventWriter.

+

This example shows how the EventReader and the EventWriter system arguments can be used to communicate from one system to another.

Firstly, we need to create and register the event we want to emit. Here, our event is a simple struct with a single field, however, you can use any type you want.

struct MyEvent
+{
+    CUBOS_ANONYMOUS_REFLECT(MyEvent);
+
+    int value;
+};
    cubos.event<MyEvent>();

To receive these events, we can make a simple system which takes the EventReader system argument and iterates through all the events it has. This will be the layout of all our reader systems (A, C, D).

    cubos.system("A").before(eventB).call([](EventReader<MyEvent> reader) {
+        for (const auto& event : reader)
+        {
+            CUBOS_INFO("A read {}", event.value);
+        }
+    });
+
+    cubos.system("C").tagged(eventC).after(eventB).call([](EventReader<MyEvent> reader) {
+        for (const auto& event : reader)
+        {
+            CUBOS_INFO("C read {}", event.value);
+        }
+    });
+
+    cubos.system("D").after(eventC).call([](EventReader<MyEvent> reader) {
+        for (const auto& event : reader)
+        {
+            CUBOS_INFO("D read {}", event.value);
+        }
+    });

Now, to emit these events, we will use the EventWriter system argument. This system will emit 3 events on the first frame and another 3 on the second frame. By setting the value of the ShouldQuit resource to true on the second frame, the engine stops before reaching the third frame.

    cubos.system("B").tagged(eventB).call([](EventWriter<MyEvent> writer, State& state, ShouldQuit& quit) {
+        state.step += 1;
+        if (state.step == 1) // Write 1 2 3 on first run.
+        {
+            writer.push({1});
+            writer.push({2});
+            writer.push({3});
+            CUBOS_INFO("B wrote 1 2 3");
+        }
+        else if (state.step == 2)
+        {
+            quit.value = true; // Stop the loop.
+            writer.push({4});
+            writer.push({5});
+            writer.push({6});
+            CUBOS_INFO("B wrote 4 5 6");
+        }
+    });

These are the expected results with this order.

    // Should print:
+    // B wrote 1 2 3
+    // C read 1
+    // C read 2
+    // C read 3
+    // D read 1
+    // D read 2
+    // D read 3
+    // A read 1
+    // A read 2
+    // A read 3
+    // B wrote 4 5 6
+    // C read 4
+    // C read 5
+    // C read 6
+    // D read 4
+    // D read 5
+    // D read 6

There are a couple of things to note here. First, the order in which the systems appear to receive the event. C receives the event, followed by D, this happens because even though A comes before C it also come before B, which is where the event is emitted, this means that C and D can read the event emitted by B on that same frame, while A will only read it on the next frame. This also explains why on the second run, A is never displayed, indeed, the engine quit before A got a chance to receive it's so desired events. This shows how the results of the execution of systems that use events may vary with the order set for them, so special care should be taken when defining this.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-gizmos.html b/preview/pr-1379/examples-engine-gizmos.html new file mode 100644 index 0000000000..afe19b2b53 --- /dev/null +++ b/preview/pr-1379/examples-engine-gizmos.html @@ -0,0 +1,151 @@ + + + + + Examples » Engine » Gizmos | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Gizmos +

+

Using the Gizmos plugin.

+

This example shows the Gizmos plugin, which allows drawing simple primitives. These are not intended for use in the final product, only in developer tools and for debugging.

The plugin function is included from the engine/gizmos/plugin.hpp header.

    cubos.plugin(gizmosPlugin);

To draw a gizmo, all you need to do is to get a reference to the cubos::engine::Gizmos resource, and then call the draw function on it for the gizmo you want to draw. Additionally, you can also call the cubos::engine::Gizmos::color function to set the color for future gizmos. So, for example if you want to draw an arrow in a given system, all you need to do is the following:

    cubos.startupSystem("draw line at startup").after(gizmosInitTag).call([](Gizmos& gizmos) {
+        gizmos.color({1, 0, 1});
+        gizmos.drawArrow("arrow", {0.6F, 0.6F, 0.0F}, {-0.1F, -0.1F, 0.0F}, 0.003F, 0.009F, 0.7F, 10.0F,
+                         Gizmos::Space::Screen);
+    });

This code will draw an arrow poiting at the center of the screen, and it will stay there for 10 seconds.

In this other example, we draw lines, a box, and a wire box. Unlike the one in the previous example, this system is not a start-up system, so the draw functions get called every single frame. When this happens, you should set the lifetime of a gizmo to 0, which means it will be drawn for a single frame only. This way we avoid drawing gizmos on top of identical ones that were already there, or in the case of moving gizmos, leaving a trail of old version behind them.

Let's start with the lines. We are using four cameras in our scene, so let's add two lines to separate each camera. These lines will be in Screen space, as we want them to be just drawn once, indepently of the number of cameras; and we want them to use screen coordinates, as they should be drawn in the middle of the screen.

        gizmos.color({1.0F, 1.0F, 1.0F});
+        gizmos.drawLine("separator line", {1.0F, 0.5F, 0.5F}, {0.0F, 0.5F, 0.5F}, 0, Gizmos::Space::Screen);
+        gizmos.drawLine("separator line", {0.5F, 1.0F, 0.5F}, {0.5F, 0.0F, 0.5F}, 0, Gizmos::Space::Screen);

Let's now add a wireboxe. We want to know were exactly is the centre of each camera, so let's add a reticule. This box will be in View space, as we want it to be drawn once per camera and we want it to use view coordinates, as it should be drawn in the middle of each viewport.

        gizmos.color({1.0F, 0.5F, 1.0F});
+        gizmos.drawBox("box", {0.4, 0.4, 0}, {0.55, 0.55, 0}, 0, Gizmos::Space::View);

Let's add a box. This box will be in World space, as it's the last space left to cover. It will be drawn by any camera that is looking at it, much like if it was an object in the world.

        gizmos.color({0.2F, 0.2F, 1.0F});
+        gizmos.drawWireBox("wire box", {-5, -5, -5}, {-7, -7, -7}, 0, Gizmos::Space::World);

Finally let's add a cut cone. A cut cone is cylinder with faces that can have different radiuses. If you set one of the bases to have a radius of 0, you'll have a simple cone. If you set them both to have the same radius, you'll have a cylinder. Our cut cone will have different radiuses:

        if (gizmos.hovered("cut cone"))
+        {
+            gizmos.color({0.25F, 0.15F, 0.5F});
+        }
+        else if (gizmos.pressed("cut cone"))
+        {
+            gizmos.color({0.5F, 0.3F, 1});
+        }
+        else
+        {
+            gizmos.color({0.1F, 0.05F, 0.25F});
+        }
+
+        gizmos.drawCutCone("cut cone", {0.7F, 0.7F, 0.7F}, 5.0F, {-3, -3, -3}, 3.0F, 0, Gizmos::Space::World);

For the cut cone, we'll set the color a bit differently: We'll make it so the color of the cone changes depending on whether you are pressing the cone, or have your mouse over it. We'll make it a bit darker while the mouse is not over the cone, a bit lighter when it is, and even lighter when the cone is pressed.

The whole system looks like this:

    cubos.system("draw gizmos").call([](Gizmos& gizmos) {
+        gizmos.color({1.0F, 1.0F, 1.0F});
+        gizmos.drawLine("separator line", {1.0F, 0.5F, 0.5F}, {0.0F, 0.5F, 0.5F}, 0, Gizmos::Space::Screen);
+        gizmos.drawLine("separator line", {0.5F, 1.0F, 0.5F}, {0.5F, 0.0F, 0.5F}, 0, Gizmos::Space::Screen);
+
+        gizmos.color({1.0F, 0.5F, 1.0F});
+        gizmos.drawBox("box", {0.4, 0.4, 0}, {0.55, 0.55, 0}, 0, Gizmos::Space::View);
+
+        gizmos.color({0.2F, 0.2F, 1.0F});
+        gizmos.drawWireBox("wire box", {-5, -5, -5}, {-7, -7, -7}, 0, Gizmos::Space::World);
+
+        if (gizmos.hovered("cut cone"))
+        {
+            gizmos.color({0.25F, 0.15F, 0.5F});
+        }
+        else if (gizmos.pressed("cut cone"))
+        {
+            gizmos.color({0.5F, 0.3F, 1});
+        }
+        else
+        {
+            gizmos.color({0.1F, 0.05F, 0.25F});
+        }
+
+        gizmos.drawCutCone("cut cone", {0.7F, 0.7F, 0.7F}, 5.0F, {-3, -3, -3}, 3.0F, 0, Gizmos::Space::World);
+    });
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-hello-cubos.html b/preview/pr-1379/examples-engine-hello-cubos.html new file mode 100644 index 0000000000..27daaf2288 --- /dev/null +++ b/preview/pr-1379/examples-engine-hello-cubos.html @@ -0,0 +1,146 @@ + + + + + Examples » Engine » Hello Cubos | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Hello Cubos +

+

Using Cubos to create a simple program.

+

This example shows the basics of how cubos::engine::Cubos is used, by making a simple "Hello World" program.

#include <cubos/engine/prelude.hpp>
+
+using namespace cubos::engine;

First we'll need to get a Cubos object.

int main(int argc, char** argv)
+{
+    Cubos cubos{argc, argv};

The Cubos class represents the engine. We'll need it to add functionality to our program.

Let's start by defining what functionality we want to add, by adding our first system.

    cubos.startupSystem("say Hello Cubos").call([]() { CUBOS_INFO("Hello Cubos"); });

This startup system simply prints Hello Cubos to the console, using one of Cubos's logging macros. You can find more about them here. Startup systems run only once when the engine is loaded.

Now let's make things more interesting. Let's print Hello World, but split it over two different systems.

    cubos.system("say Hello").tagged(helloTag).call([]() { CUBOS_INFO("Hello"); });
+    cubos.system("say World").tagged(worldTag).call([]() { CUBOS_INFO("World"); });

Instead of using startupSystem, we'll use Cubos::system. This means the systems will be called after the startup systems and repeat every cycle, instead of just once at startup.

Notice that we can't just do as we did for Hello Cubos and call it a day. We want Hello to come before World, so we'll have to explicitly tell that to the engine, or else we risk having them in the wrong order. To do that we use tags.

    cubos.tag(helloTag);
+    cubos.tag(worldTag).after(helloTag);

Cubos::tag can be used to apply properties to all systems with a given tag, and after makes any systems tagged with it come after systems tagged with the one given as parameter. There's also an before that has the inverse effect.

Now let's see a bit about entities, components and resources. First we are going to need to use a few more things. We'll go over what each does as it comes up.

Lets define a new component type, which stores a single integer, which we can use to identify the entity.

#include <cubos/core/ecs/reflection.hpp>
+#include <cubos/core/reflection/external/primitives.hpp>
+
+struct Num
+{
+    CUBOS_REFLECT;
+
+    int value;
+};
+
+CUBOS_REFLECT_IMPL(Num)
+{
+    return cubos::core::ecs::TypeBuilder<Num>("Num").withField("value", &Num::value).build();
+}

Notice that not only we define the type, but we also define reflection for it. This is a way to let Cubos know what our data type is made of, making it compatible with serialization, UI debug tools and others automatically.

We also need to register the component type with the Cubos object.

    cubos.component<Num>();

Now, lets create our own resource.

struct Pop
+{
+    CUBOS_REFLECT;
+
+    int count = 0;
+};
+
+CUBOS_REFLECT_IMPL(Pop)
+{
+    return cubos::core::ecs::TypeBuilder<Pop>("Pop").withField("count", &Pop::count).build();
+}

This resource will store the total number of spawned entities, a population counter of sorts. It too needs to be registered.

    cubos.resource<Pop>();

Now let's create a startup system that spawns some entities.

    cubos.startupSystem("spawn entities").call([](Commands cmds, Pop& pop) {
+        for (int i = 0; i < 10; i++)
+        {
+            cmds.create().add(Num{i});
+            pop.count += 1;
+        }
+    });

Commands is a system argument that allows us to interact with the world, in this case, by creating entities that have a Num component.

To access the resource Pop, we just add a reference to it as a system argument (Pop&).

Finally, we'll want a system that prints our entities.

    cubos.system("check entities").call([](Query<const Num&> query, const Pop& pop) {
+        for (auto [num] : query)
+        {
+            CUBOS_INFO("Entity {} of {}", num.value, pop.count);
+        }
+    });

In this case, we don't change Pop, and only read its value. Thus, we use const Pop&. This allows Cubos to make some optimizations behind the scenes.

Query allows us to access all entities with a given configuration of components. In this case, it will give us all entities with the Num component.

With everything properly set up, all that remains is to run the engine.

    cubos.run();
+}

Try running the sample yourself, and you should see both the hello world messages and the list of entities we spawned!

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-imgui.html b/preview/pr-1379/examples-engine-imgui.html new file mode 100644 index 0000000000..b941c94a78 --- /dev/null +++ b/preview/pr-1379/examples-engine-imgui.html @@ -0,0 +1,196 @@ + + + + + Examples » Engine » ImGui | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + ImGui +

+

Using the ImGui integration plugin and cubos::engine::DataInspector resource.

+

The ImGui plugin allows you to integrate the Dear ImGui library with Cubos, making it quick, straightforward, and effortless to create user interfaces and interactive debugging tools within your applications.

Image

First, let's start by including the header files we need.

#include <iostream>
+#include <map>
+#include <vector>
+
+#include <imgui.h>
+
+#include <cubos/core/reflection/external/map.hpp>
+#include <cubos/core/reflection/external/primitives.hpp>
+#include <cubos/core/reflection/external/string.hpp>
+#include <cubos/core/reflection/external/vector.hpp>
+#include <cubos/core/reflection/reflect.hpp>
+#include <cubos/core/reflection/traits/constructible.hpp>
+#include <cubos/core/reflection/traits/fields.hpp>
+#include <cubos/core/reflection/traits/nullable.hpp>
+
+#include <cubos/engine/imgui/data_inspector.hpp>
+#include <cubos/engine/imgui/plugin.hpp>
+#include <cubos/engine/render/target/plugin.hpp>
+#include <cubos/engine/settings/plugin.hpp>
+#include <cubos/engine/window/plugin.hpp>

Then, make sure to add the plugin.

    cubos.plugin(settingsPlugin);
+    cubos.plugin(windowPlugin);
+    cubos.plugin(renderTargetPlugin);
+    cubos.plugin(imguiPlugin);

Once the ImGui plugin is added, you can create systems to display ImGui windows and widgets. Here's a system which opens an ImGui window, and its demo.

    cubos.system("show ImGui demo").tagged(imguiTag).call([]() {
+        ImGui::Begin("Dear ImGui + Cubos");
+        ImGui::Text("Hello world!");
+        ImGui::End();
+
+        ImGui::ShowDemoWindow();
+    });

Ensure that you add your system with the cubos.imgui tag; otherwise, the ImGui elements from that system won't be be visible.

Pretty simple right? You're now equipped to craft and utilize ImGui's functions to design your cool user interface.

Now, we'll also show you how you can use the cubos::engine::DataInspector resource in combination with ImGui integration plugin to inspect/modify data in real time.

To start off, we'll need to have some sort of dummy data shared across our application, so we can inspect/modify later. Let's create a DummyResource with some fields and fill it with random data.

struct Person
+{
+    CUBOS_REFLECT;
+    std::string name;
+    int32_t age;
+    float weight;
+    bool dead;
+};
+
+CUBOS_REFLECT_IMPL(Person)
+{
+    return Type::create("Person")
+        .with(FieldsTrait()
+                  .withField("name", &Person::name)
+                  .withField("age", &Person::age)
+                  .withField("weight", &Person::weight)
+                  .withField("dead", &Person::dead))
+        .with(NullableTrait{[](const void* instance) {
+                                const auto* person = static_cast<const Person*>(instance);
+                                return person->dead;
+                            },
+                            [](void* instance) {
+                                auto* person = static_cast<Person*>(instance);
+                                person->dead = true;
+                            }})
+        .with(ConstructibleTrait::typed<Person>().withDefaultConstructor().build());
+}
+
+struct DummyResource
+{
+    CUBOS_REFLECT;
+
+    int integer;
+    Person person;
+    std::vector<Person> persons;
+    std::vector<int32_t> vec;
+    std::map<int32_t, int32_t> map;
+};
+
+CUBOS_REFLECT_IMPL(DummyResource)
+{
+    return Type::create("DummyResource")
+        .with(FieldsTrait()
+                  .withField("integer", &DummyResource::integer)
+                  .withField("person", &DummyResource::person)
+                  .withField("persons", &DummyResource::persons)
+                  .withField("vec", &DummyResource::vec)
+                  .withField("v", &DummyResource::map))
+        .with(ConstructibleTrait::typed<DummyResource>().withDefaultConstructor().build());
+}
    cubos.resource<DummyResource>(
+        DummyResource{.integer = 1337,
+                      .person = Person{"roby", 1337, 666.5F, false},
+                      .persons{Person{"roby", 1337, 666.5F, false}, Person{"riscado", 123, 321.0F, false}},
+                      .vec = {12, 59, 25},
+                      .map = {
+                          {1, 2},
+                          {2, 4},
+                          {3, 6},
+                          {4, 8},
+                      }});

Well now, using the cubos::engine::DataInspector is pretty easy, all you have to do is access the resource on your system, and use the functions DataInspector::edit and DataInspector::edit.

    cubos.system("data inspector example").tagged(imguiTag).call([](DataInspector& inspector, DummyResource& data) {
+        ImGui::Begin("Data Inspector");
+        inspector.edit(data);
+        ImGui::End();
+    });
Image

You can find more about how to use Dear ImGui stuff here.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-input.html b/preview/pr-1379/examples-engine-input.html new file mode 100644 index 0000000000..909993a592 --- /dev/null +++ b/preview/pr-1379/examples-engine-input.html @@ -0,0 +1,337 @@ + + + + + Examples » Engine » Input | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Input +

+

Using the Input plugin.

+

This example shows how the scene-input plugin can be used to handle user input.

The plugin function is included from the engine/input/plugin.hpp header.

    cubos.plugin(settingsPlugin);
+    cubos.plugin(windowPlugin);
+    cubos.plugin(assetsPlugin);
+    cubos.plugin(inputPlugin);

The Input plugin requires a InputBindings asset to be set. Let's take a look at the file the sample uses.

{
+    "actions": {
+        "next-showcase": [
+            {"keys": ["Return"]},
+            {"gamepadButtons": ["RBumper"]}
+        ],
+        "x-or-z": [
+            {"keys": ["X"]},
+            {"keys": ["Z"]}
+        ],
+        "shift-space": [
+            {"keys": ["LShift", "Space"]},
+            {"keys": ["RShift", "Space"]}
+        ],
+        "ctrl-shift-space": [
+            {"keys": ["LControl", "LShift", "Space"]},
+            {"keys": ["LControl", "RShift", "Space"]},
+            {"keys": ["RControl", "LShift", "Space"]},
+            {"keys": ["RControl", "RShift", "Space"]}
+        ],
+        "left-mb": [
+            {"mouseButtons": ["Left"]}
+        ],
+        "right-mb": [
+            {"mouseButtons": ["Right"]}
+        ],
+        "middle-mb": [
+            {"mouseButtons": ["Middle"]}
+        ],
+        "extra-mb": [
+            {"mouseButtons": ["Extra1"]},
+            {"mouseButtons": ["Extra2"]}
+        ]
+    },
+    "axes": {
+        "vertical": {
+            "positive": [
+                {"keys": ["W"]},
+                {"keys": ["Up"]}
+            ],
+            "negative": [
+                {"keys": ["S"]},
+                {"keys": ["Down"]}
+            ],
+            "gamepadAxes": [
+                "LY"
+            ]
+        },
+        "horizontal": {
+            "positive": [
+                {"keys": ["D"]},
+                {"keys": ["Right"]}
+            ],
+            "negative": [
+                {"keys": ["A"]},
+                {"keys": ["Left"]}
+            ],
+            "gamepadAxes": [
+                "LX"
+            ]
+        },
+        "shift-vertical": {
+            "positive": [
+                {"keys": ["LShift", "W"]},
+                {"keys": ["LShift", "Up"]},
+                {"keys": ["RShift", "W"]},
+                {"keys": ["RShift", "Up"]}
+            ],
+            "negative": [
+                {"keys": ["LShift", "S"]},
+                {"keys": ["LShift", "Down"]},
+                {"keys": ["RShift", "S"]},
+                {"keys": ["RShift", "Down"]}
+            ]
+        },
+        "shift-horizontal": {
+            "positive": [
+                {"keys": ["LShift", "D"]},
+                {"keys": ["LShift", "Right"]},
+                {"keys": ["RShift", "D"]},
+                {"keys": ["RShift", "Right"]}
+            ],
+            "negative": [
+                {"keys": ["LShift", "A"]},
+                {"keys": ["LShift", "Left"]},
+                {"keys": ["RShift", "A"]},
+                {"keys": ["RShift", "Left"]}
+            ]
+        }
+    }
+}

There are two types of bindings: actions and axes. An action is an input that only has two states: pressed or not pressed. This would be most keys on a keyboard. An axe is an input that has a numeric value. For example, the joysticks on a controller can go from -1 to 1, depending on how much they are tilt in which direction. Using axes can also be useful for keys with symmetric behaviour. For example, in this sample, W sets the vertical axe to 1, while S sets it to -1.

To define an action or an axe, you simply have to add it to the respective list, giving it a name. The very first action in the file is called next-showcase. Then, if it's an action, you simply have to define which keys trigger it. You can also define key combinations by using a -. To check which strings map to which keys, you check the names of the variants of the enums Key and Modifier on this file.

Now that we have our bindings file, let's get our application to do something with it. The first thing we're going to need is a reference to the bindings asset. For the purposes of this sample we can simply use an hardcoded reference to the asset.

static const Asset<InputBindings> BindingsAsset = AnyAsset("bf49ba61-5103-41bc-92e0-8a442d7842c3");

To utilize the bindings, loading them is essential. This can be accomplished by establishing a startup systems which reads from the asset and sets the required bindings.

    cubos.startupSystem("load and set the Input Bindings")
+        .tagged(assetsTag)
+        .call([](const Assets& assets, Input& input) {
+            auto bindings = assets.read<InputBindings>(BindingsAsset);
+            input.bind(*bindings);
+            CUBOS_INFO("Loaded bindings: {}", input.bindings().at(0));
+        });

Getting the input is done through the cubos::engine::Input resource. What this sample does is show in order, a series of prompt to showcase the different functionalities of the Input plugin. For this, it keeps a state integer that indicates the current prompt. Whenever the action next-showcase is triggered, it advances to the next prompt. However, as the plugin currently does not have events, we have to manually check whether the key has just been pressed, is being pressed continuously, or was just released.

    cubos.system("detect input")
+        .after(inputUpdateTag)
+        .call([](const Input& input, const Window& window, State& state, ShouldQuit& shouldQuit) {
+            if (input.justPressed("next-showcase"))
+            {
+                state.explained = false;
+                state.showcase++;
+            }

What this does is only advance the state when the return key is released. This avoids the state advancing more than once if the user presses it for more than one frame.

Now let's see each of the prompt, to understand the full breadth of the plugin's functionalities.

static void showcaseXZ(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("This showcase will print `X or Z` when either X or Z is pressed. Press Enter to advance to the "
+                   "next showcase.");
+        explained = true;
+    }
+
+    if (input.pressed("x-or-z"))
+    {
+        CUBOS_INFO("X or Z");
+    }
+}
+
+static void showcaseJustXZ(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("This showcase will print `justPressed X or Z` when either X or Z is justPressed and `justReleased "
+                   "X or Z when either X or Z is justReleased`. Press Enter to advance to the "
+                   "next showcase.");
+        explained = true;
+    }
+
+    if (input.justPressed("x-or-z"))
+    {
+        CUBOS_INFO("justPressed X or Z");
+    }
+    if (input.justReleased("x-or-z"))
+    {
+        CUBOS_INFO("justReleased X or Z");
+    }
+}

Finding out whether the user is pressing a key is checked by a simple call to Input::pressed.

static void showcaseModifiers(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("Modifiers are supported. This showcase will print `Shift` when Shift+Space is pressed. "
+                   "Press Enter to advance to the next showcase.");
+        explained = true;
+    }
+
+    if (input.pressed("shift-space"))
+    {
+        CUBOS_INFO("Shift");
+    }
+}

Getting modified input (such as with a Control or a Shift hold) is no different from getting non-modified input, just make sure the binding for it is defined in the Bindings asset.

static void showcaseMultipleModifiers(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("Multiple modifiers are supported. This showcase will print `Ctrl Shift` when Ctrl+Shift+Space is "
+                   "pressed. Press Enter to advance to the next showcase.");
+        explained = true;
+    }
+
+    if (input.pressed("ctrl-shift-space"))
+    {
+        CUBOS_INFO("Ctrl Shift");
+    }
+}

You can have more than one modifier.

static void showcaseAxis(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("Axis are supported. This showcase will print the value of the `horizontal` and `vertical` axis "
+                   "when their values is different to 0. Use the arrows and WASD to move the axis. Press Enter to "
+                   "advance to the next showcase.");
+        explained = true;
+    }
+
+    if (input.axis("horizontal") != 0.0F || input.axis("vertical") != 0.0F)
+    {
+        CUBOS_INFO("horizontal: {}, vertical: {}", input.axis("horizontal"), input.axis("vertical"));
+    }
+}

Getting axis is very similar to actions, by calling Input::axis. The difference is that this funtion returns a float instead of a boolean value.

static void showcaseModifierAxis(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("Modifiers are supported with axis. This showcase will print the value of the `shift-vertical` axis "
+                   "when its value is different to 0. Use Shift+arrows and Shift+WASD to move the axis. Press Enter to "
+                   "advance to the next showcase.");
+        explained = true;
+    }
+
+    if (input.axis("shift-horizontal") != 0.0F || input.axis("shift-vertical") != 0.0F)
+    {
+        CUBOS_INFO("shift-horizontal: {}, shift-vertical: {}", input.axis("shift-horizontal"),
+                   input.axis("shift-vertical"));
+    }
+}

Modifier keys work with axis too.

static void showcaseUnbound(const Window& window, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("Direct access is supported. This showcase will print `Unbound` when Y is pressed. Note "
+                   "that Y is not bound in sample.bind. Press Enter to advance to the next showcase.");
+        explained = true;
+    }
+
+    if (window->pressed(Input::Key::Y))
+    {
+        CUBOS_INFO("Unbound");
+    }
+}

If, for any reason, you want to read an input that is not defined in the Bindings asset, you cannot use the Input plugin for it. Instead, you will have to call the Window::pressed function.

static void showcaseMouseButtons(const Input& input, bool& explained)
+{
+    if (!explained)
+    {
+        CUBOS_WARN("This showcase will print the name of a mouse button when it is pressed. Press Enter to advance to "
+                   "the next showcase.");
+        explained = true;
+    }
+
+    if (input.pressed("left-mb"))
+    {
+        CUBOS_INFO("Left");
+    }
+    if (input.pressed("right-mb"))
+    {
+        CUBOS_INFO("Right");
+    }
+    if (input.pressed("middle-mb"))
+    {
+        CUBOS_INFO("Middle");
+    }
+    if (input.pressed("extra-mb"))
+    {
+        CUBOS_INFO("Extra1 or Extra2");
+    }
+}

Reading mouse buttons is also supported, just bind them to an action, and then call Input::pressed as usual. To check which strings map to which buttons, you check the names of the variants of the enum MouseButton on this file.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-scene.html b/preview/pr-1379/examples-engine-scene.html new file mode 100644 index 0000000000..9d527b7cdb --- /dev/null +++ b/preview/pr-1379/examples-engine-scene.html @@ -0,0 +1,174 @@ + + + + + Examples » Engine » Scene | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Scene +

+

Using the Scene plugin.

+

This example shows how the Scene plugin can be used to create scene assets and spawn them on the world.

The plugin function is included from the engine/scene/plugin.hpp header.

    cubos.plugin(settingsPlugin);
+    cubos.plugin(assetsPlugin);
+    cubos.plugin(scenePlugin);

Let's start by taking a look at a scene file.

{
+  "imports": {},
+  "entities": {
+    "root": {
+      "Num": 1
+    },
+    "child": {
+      "Num": 2,
+      "OwnedBy@root": {}
+    }
+  }
+}

Scene files are JSON files with the extension .cubos. They must have two fields: imports and entities. The entities field is an object where each field identifies and describes the components and relations of an entity. In this scene we have two entities, root and child. root has a single component, Num, with a value of 1. child too has a component Num, but also has a relation OwnedBy with root as target, indicated by the character @. In this sample, Num is used so we can later identify the entities.

Let's look at a different scene file now, this time with imports. Imports allows us to instantiate scenes within other scenes.

{
+  "entities": {
+    "main": {
+      "Num": 0
+    },
+    "notmain": {
+      "Num": 120,
+      "OwnedBy@main": {}
+    },
+    "sub1.root": {
+      "DistanceTo@sub2.root": 5,
+      "OwnedBy@main": {}
+    },
+    "sub2.root": {
+      "OwnedBy@main": {}
+    }
+  },
+  "imports": {
+    "sub1": "cd007ba2-ee0d-44fd-bf36-85c829dbe66f",
+    "sub2": "cd007ba2-ee0d-44fd-bf36-85c829dbe66f"
+  }
+}

This file imports the asset with id cd007ba2-ee0d-44fd-bf36-85c829dbe66f, which is the scene we looked at in the previous file, under the name sub1. It then imports the very same scene again, but this time with the name sub2 instead. This effectively instantiates the entities of the previous scene twice in this new scene, each with their names prefixed with either sub1. or sub2.

Also take a look at the DistanceTo relation: it is a symmetric relation, so it doesn't make a different whether wwe put it in sub.root or sub2.root. Since DistanceTo is a relation which holds data, instead of only specifying the target, as we do with OwnedBy, we write a JSON object with a key, "value".

Under entities, we can override the entities in the sub-scenes to edit components or add new ones. For example, by referencing sub1.root we are making local changes to the root entity of that instance of the subscene. The result of the changes we make to both sub1.root and sub2.root is that the owner of these entities will be set to be the main entity.

Now that we have our scene file, let's get our application to load it. The first thing we're going to need is a reference to the scene asset. For the purposes of this sample we can simply use an hardcoded reference to the asset.

static const Asset<Scene> SceneAsset = AnyAsset("f0d86ba8-5f34-440f-a180-d9d12c8e8b91");

Then we'll need a system that spawns that scene. To do this we simply get the Scene object from the asset, and then spawn its entities. Commands::spawn will create in the world a copy of every entity defined in the scene's blueprint. It won't remove the entities already there, so if you want to close a scene, you'll have to do it yourself.

    cubos.startupSystem("spawn the scene")
+        .tagged(spawnTag)
+        .tagged(assetsTag)
+        .call([](Commands commands, const Assets& assets) {
+            auto sceneRead = assets.read(SceneAsset);
+            commands.spawn(sceneRead->blueprint);
+        });

In this case, we'll run this system at startup, since we want to spawn it a single time. Since it's a startup system, we'll have to tag it with cubos.assets to make sure it runs only after the scene bridge has been registered. On a real game, you could have, for example, a scene for an enemy which you spawn multiple times, instead of just once at startup.

    cubos.startupSystem("print the scene")
+        .after(spawnTag)
+        .call([](Query<Entity, const Num&> numQuery, Query<const OwnedBy&, Entity> ownedByQuery,
+                 Query<const DistanceTo&, Entity> distanceToQuery) {
+            using cubos::core::data::DebugSerializer;
+            using cubos::core::memory::Stream;
+
+            DebugSerializer ser{Stream::stdOut};
+
+            for (auto [entity, num] : numQuery)
+            {
+                Stream::stdOut.print("Entity ");
+                ser.write(entity);
+                Stream::stdOut.printf(":\n- Num = {}\n", num.value);
+
+                for (auto [distanceTo, what] : distanceToQuery.pin(0, entity))
+                {
+                    Stream::stdOut.print("- DistanceTo(");
+                    ser.write(what);
+                    Stream::stdOut.printf(") = {}\n", distanceTo.value);
+                }
+
+                for (auto [ownedBy, owner] : ownedByQuery.pin(0, entity))
+                {
+                    Stream::stdOut.print("- OwnedBy(");
+                    ser.write(owner);
+                    Stream::stdOut.print(")\n");
+                }
+            }
+        });

This sample also contains a system which prints the components and relations of the spawned entities. If you run it, it should give you a list that has:

  • an entity with Num set to 0, with no owner. This is the main entity.
  • two entities with Num set to 1, both owned by main. These are the root entities of each instance of the subscene.
  • two entities with Num set to 2, one owned by one of the root entities, another owned by the other root entity. These are the child entities of each instance of the subscene. Notice that both are related with a DistanceTo relation set to 5.
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-settings.html b/preview/pr-1379/examples-engine-settings.html new file mode 100644 index 0000000000..c9c96d7ea3 --- /dev/null +++ b/preview/pr-1379/examples-engine-settings.html @@ -0,0 +1,116 @@ + + + + + Examples » Engine » Settings | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Settings +

+

Using the Settings plugin.

+

This example shows how the Settings plugin can be used to load settings from a file and command-line arguments.

int main(int argc, char** argv)
+{
+    Cubos cubos{argc, argv};
+
+    cubos.plugin(settingsPlugin);
+
+    cubos.startupSystem("print setting value").after(settingsTag).call([](Settings& settings) {
+        CUBOS_INFO("{}", settings.getString("greeting", "Hello!"));
+    });
+
+    cubos.run();
+}

We add a system which prints the value of the setting greetings. Notice that we make it run after the tag cubos.settings, so that the settings have already been loaded.

If the setting greetings has been set on the settings.json file next to the sample's executable, or if it has been passed as a command-line argument (e.g. ./engine-sample.settings --greetings "Hello, world!"), the sample will output that value. Otherwise, it will output Hello!, which we set as a default.

Notice that if we want the command-line arguments to be loaded as settings, we need to pass argc and argv to the Cubos::Cubos(int, char**) constructor.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-ui.html b/preview/pr-1379/examples-engine-ui.html new file mode 100644 index 0000000000..8d64c56284 --- /dev/null +++ b/preview/pr-1379/examples-engine-ui.html @@ -0,0 +1,120 @@ + + + + + Examples » Engine » UI | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + UI +

+

Using the Canvas plugin.

+

This example shows how the Canvas plugin can be used to create ui elements on screen. It also uses the Color Rect plugin to draw those elements to screen.

        auto canvas = commands.create().add(UICanvas{}).add(RenderTarget{}).entity();

We start by setting up a cubos::engine::UICanvas. This will serve as a target to which the elements will be drawn to.

        auto elementBg = commands.create()
+                             .add(UIElement{})
+                             .add(UIHorizontalStretch{20, 20})
+                             .add(UIVerticalStretch{20, 20})
+                             .add(UIColorRect{{1, 1, 1, 1}})
+                             .entity();
+        commands.relate(elementBg, canvas, ChildOf{});

Now we can set up a background, with a cubos::engine::UIElement. We want it to cover the whole screen, so we'll add both a cubos::engine::UIHorizontalStretch and a cubos::engine::UIVerticalStretch componenets. These will make sure our background's size will always match that of the canvas. For extra style, we can add a little border around it, by setting the margins of the components to 20.

We can add a cubos::engine::UIColorRect to that entity and have the background be drawn in white.

Finally, we have to set this UIElement as a child of the entity holding the canvas.

Besides the stretch components, the cubos::engine::UIElement has some fields to control its placement.

        auto elementPanel =
+            commands.create()
+                .add(UIElement{.offset = {-50, 0}, .size = {200, 600}, .pivot = {1, 0.5F}, .anchor = {1, 0.5F}})
+                .add(UIColorRect{{1, 0, 0, 1}})
+                .entity();
+        commands.relate(elementPanel, elementBg, ChildOf{});

Here we create a small panel to the right side of the screen. The anchor is set to 1, 0.5. This will mean that the panel's pivot will be placed on the very right edge of its parent, and in the middle vertically. Then the pivot itself is set to also be 1, 0.5. This will mean that the UIElement will "grow" to the left horizontally, and equally up and down vertically. This is because by setting that value, we are effectively telling the UI element its pivot will be on its right edge, in the middle point of it. We set the offset to be 0, -50, so that we leave a little space to the right of the it before the edge of its parent. This space will be constant regardless of the parent's size. Finally, we se the size of the element to be 200, 600.

We set this panel as child of the background, and we'll paint it red.

Next let's add an image.

        auto logo = commands.create()
+                        .add(UIElement{.offset = {50, -50}, .size = {200, 200}, .pivot = {0, 1}, .anchor = {0, 1}})
+                        .add(UIImage{AnyAsset("50423317-a543-4614-9f4e-c2df975f5c0d")})
+                        .entity();
+        commands.relate(logo, elementBg, ChildOf{});

To add an image, it's a simple matter of adding a cubos::engine::UIImage component to an element, with the handle to an image asset. It will then be drawn onto that element's rect.

We might, however, want to make sure that the image will retain its aspect ratio without having to manually adjust the element's size. The solution for that is the cubos::engine::UINativeAspectRatio component. What it does is size down the element to have a size that is in line with the source file's aspect ratio.

For this we will the use the extended version of our logo, which is rectangular. You'll notice that the UIElement it's being attached to is a square, but due to the UINativeAspectRatio component, that square will be sized down into proper shape.

Image

Another important thing to keep in mind while building the UI is how it is going to adapt to different resolutions and aspect ratios.

You can do this by using a set of components that when added to an entity with a UICanvas will change how it handles these differences. In this sample, you can change which is being used by pressing the shortcut numbers in the first collumn. All these components are meant to be used exclusively, meaning that no more than one should be present in one entity.

ShortcutModeComponentDescription
1StretchNone - Canvas defaults to this when no other component is presentCanvas is stretch to fit the window. Will warp elements.
2Keep Pixel SizeUIKeepPixelSizeDistances to anchors are constant. Might cause overlap between elements with different anchors.
3Match HeightUIMatchHeightVertical proportions are kept. Width is adjusted to keep each element's aspect ratio.
4Match WidthUIMatchWidthHorizontal proportions are kept. Height is adjusted to keep each element's aspect ratio.
5ExpandUIExpandSwitches between matching height or matching width, depending on which will cause the elements to reduce in size.
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine-voxels.html b/preview/pr-1379/examples-engine-voxels.html new file mode 100644 index 0000000000..d8eae6257c --- /dev/null +++ b/preview/pr-1379/examples-engine-voxels.html @@ -0,0 +1,113 @@ + + + + + Examples » Engine » Voxels | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine » + Voxels +

+

Using the Voxels plugin.

+

This example shows the Voxels plugin, which registers asset bridges used to load voxel grids (.grid) and palettes (.pal). Check out the Introduction and Custom Bridges sample for an introduction on the Assets plugin.

It is very similar to the examples-engine-renderer, differing only in the fact that in this sample the grid and palette are loaded from files.

Image

The plugin function is included from the engine/voxels/plugin.hpp header. To see the asset, you'll also need to perform a basic configuration of the renderer-plugin plugin like shown in the examples-engine-renderer sample.

    cubos.plugin(voxelsPlugin);

Lets start by defining the handles of the assets we want to use, as done in the Assets sample.

static const Asset<VoxelGrid> CarAsset = AnyAsset("059c16e7-a439-44c7-9bdc-6e069dba0c75");
+static const Asset<VoxelPalette> PaletteAsset = AnyAsset("1aa5e234-28cb-4386-99b4-39386b0fc215");

In this sample, instead of creating a new palette, we just set the RenderPalette's handle to the PaletteAsset handle we defined previously.

    cubos.startupSystem("set palette").call([](RenderPalette& palette) { palette.asset = PaletteAsset; });

Now, we can create an entity with our car asset.

    cubos.startupSystem("create a car").tagged(assetsTag).call([](Commands cmds, const Assets& assets) {
+        // Calculate the necessary offset to center the model on (0, 0, 0).
+        auto car = assets.read(CarAsset);
+        glm::vec3 offset = glm::vec3(car->size().x, 0.0F, car->size().z) / -2.0F;
+
+        // Create the car entity
+        cmds.create().add(RenderVoxelGrid{CarAsset, offset}).add(LocalToWorld{});
+    });

And voilá, you now have a car floating in space.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples-engine.html b/preview/pr-1379/examples-engine.html new file mode 100644 index 0000000000..113f4ee3a3 --- /dev/null +++ b/preview/pr-1379/examples-engine.html @@ -0,0 +1,104 @@ + + + + + Examples » Engine | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples » + Engine +

+

Showcases features of the Engine library.

+

The following examples have fully documented tutorials on how to use the multiple plugins of the engine:

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/examples.html b/preview/pr-1379/examples.html new file mode 100644 index 0000000000..31ebed5266 --- /dev/null +++ b/preview/pr-1379/examples.html @@ -0,0 +1,103 @@ + + + + + Examples | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Examples +

+

Contains examples of specific features of the libraries.

+

If you are just starting out, you should probably start by the engine examples. These cover the actual user-facing features, and are a good place to get a feel for how using the engine looks like, while the core examples are more directed at engine developers trying to understand how specific low-level features are used.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/exercises.html b/preview/pr-1379/exercises.html new file mode 100644 index 0000000000..0aaae555ff --- /dev/null +++ b/preview/pr-1379/exercises.html @@ -0,0 +1,110 @@ + + + + + Exercises | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Exercises +

+

This page contains challenges designed to help you start working with Cubos. We recommend that you start by reading the getting started and features guides.

Creating a new engine sample

Before moving on to the actual exercises, lets start by creating your own empty sample, which will be expanded upon the next steps.

Start by creating a new folder in the engine/samples directory, i.e., engine/samples/my-own-sample. Make sure to add a main.cpp to that folder, with the following base code:

#include <cubos/engine/prelude.hpp>
+
+using namespace cubos::engine;
+
+int main()
+{
+      Cubos cubos{};
+      cubos.run();
+}

The final step is to add your new sample to the CMake configuration, at engine/samples/CMakeLists.txt. Open that file, and add a new line of the form make_sample(DIR "my-own-sample" ASSETS).

If you now reconfigure CMake, you should be able to launch the target engine-sample.my-own-sample. Don't worry if nothing shows up yet - in Cubos you only get what you ask for, and in the code above we didn't do anything except run an empty application.

Showing a cube

Try making your sample open a window and show a simple voxel cube! To do this, you will need to:

  1. Add the Renderer plugin.
  2. Create a VoxelPalette.
  3. Create a VoxelGrid.
  4. Create a PointLight.
  5. Create a Camera and add it to ActiveCameras.

You can take inspiration from the Hello Cubos Renderer samples.

Replace the cube by an actual voxel model

Of course we don't expect developers to generate their voxel models through code! Change your sample to show an actual voxel model, created and stored in a .qb file. You can create one using MagicaVoxel, or simply download an existing model from the internet.

Cubos doesn't handle .qb files directly: it only supports .grd's and .pal's, our own formats for voxel grids and palettes. You can use QUADRADOS to convert a .qb to a .grd and .pal. Check out its feature guide for more information.

Take a look at the Voxels sample to figure out how you can load those files into the actual sample.

Move the voxel model on input

Make the model you added previously move when some buttons are pressed. You will need to:

  1. Add the Input plugin.
  2. Create an input bindings asset.
  3. Add a system which uses the Input resource to move the model.

Check out the Input sample for inspiration.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/expand_8hpp.html b/preview/pr-1379/expand_8hpp.html new file mode 100644 index 0000000000..d238c96e4e --- /dev/null +++ b/preview/pr-1379/expand_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/expand.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/expand.hpp file +

+

Component cubos::engine::UIExpand.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIExpand +
+
Component which makes a UI canvas scale to maintain proportions, choosing the dimension which reduces the element sizes on screen.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/features-ecs.html b/preview/pr-1379/features-ecs.html new file mode 100644 index 0000000000..9611357209 --- /dev/null +++ b/preview/pr-1379/features-ecs.html @@ -0,0 +1,194 @@ + + + + + Feature Guide » ECS | Cubos Docs + + + + + + + + +
+
+
+
+
+

+ Feature Guide » + ECS +

+

What is an ECS and how it's used in Cubos

+

Wikipedia defines ECS as:

Entity Component System (ECS) is a software architectural pattern mostly used in video game development for the representation of game world objects. An ECS comprises entities composed from components of data, with systems which operate on entities' components.

ECS follows the principle of composition over inheritance, meaning that every entity is defined not by a type hierarchy, but by the components that are associated with it. Systems act globally over all entities which have the required components.

The ECS thus is a vital part of the engine, since all of the rest is structured around it in some way. This sets the engine apart from other engines which follow a more traditional model, like Unity, Unreal and Godot.

A primer on ECS

Why are we using this?

ECS is a powerful pattern which has been becoming more popular over the years, and even Unity has started integrating it into its engine. The main advantages are flexibility and performance: it avoids a lot of the problems that come with traditional object-oriented programming, and regarding performance, it excels in situations where the number of entities is high, since it makes use of cache locality. Its also easier to parallelize the systems, since they have clearly defined dependencies.

Our implementation

Cubos ECS contains the following concepts:

  • Cubos - used to configure and run an ECS world and systems.
  • World - the main object that holds all of the ECS state.
  • Entities - represent objects in the game world (e.g. a car, a player, a tree).
  • Components - data associated with an entity (e.g. Position, Rotation).
  • Relations - data associated to a pair of entities (e.g., ChildOf, CollidingWith)
  • Resources - singleton-like objects which are stored per world and which do not belong to a specific entity (e.g. DeltaTime, Input).
  • Systems - functions which operate on resources and entities' components. This is where the logic is implemented.
  • Observers - basically systems which are called immediately after some event is triggered.

One important thing to note is that in an ECS the data is completely decoupled from the logic. What this means is that entities and components do not and should not possess any functionality other than storing data. All of the logic is relegated to the systems.

How do we use it?

Lets say we want to have multiple objects with positions and velocities, and every frame we want to add their velocities to their positions.

In a traditional object-oriented approach, we would have something along the lines of:

class MyObject : public GameObject
+{
+public:
+    // ...
+
+    virtual void update(float deltaTime) override
+    {
+        this->position += this->velocity * deltaTime;
+    }
+
+private:
+    glm::vec3 position;
+    glm::vec3 velocity;
+}

In Cubos there are no game objects. Instead, we would define two components and a DeltaTime resource:

struct Position
+{
+    CUBOS_REFLECT;
+
+    glm::vec3 vec = { 0.0f, 0.0f, 0.0f };
+};
+
+struct Velocity
+{
+    CUBOS_REFLECT;
+
+    glm::vec3 vec = { 0.0f, 0.0f, 0.0f };
+};
+
+struct DeltaTime
+{
+    CUBOS_REFLECT;
+
+    float value = 0.0f;
+};

So, where does the update logic belong? We put it in a system. Systems are functions whose arguments are of certain types, which you can read more about in the ECS module page.

To access a resource, simply add a reference to it as an argument. In this case, we won't be modifying the delta time, so we will use const DeltaTime&. To access entities and their components, we use the Query argument. In this case we we want to access all entities with both positions and velocities, and modify their positions, so we will use Query<Position&, const Velocity&>.

cubos.system("integrate velocity")
+     .call([](const DeltaTime& dt, Query<Position&, const Velocity&> query) 
+     {
+         for (auto [position, velocity] : query)
+         {
+             position->vec += velocity->vec * dt->value;
+         }
+     });

We can then iterate over all queried entities and update their positions using their velocities and the delta time.

Going further

Registering types

Before components, relations and resources are used in a World, they must be registered on it. This should be done once, at the start of the program. For example, using the Cubos main class, for the previous example we would write:

cubos.component<Position>();
+cubos.relation<ChildOf>();
+cubos.resource<DeltaTime>();

Commands

When you have direct access to the World, you can manipulate entities directly:

auto entity = world.create();
+world.components(entity).add<Position>();
+world.components(entity).remove<Position>();
+world.components(entity).add<Dead>();
+world.destroy(entity);

If necessary, you can access the world in a system through the arguments const World& or World&. However, this is not recommended, since it becomes impossible to know what the system is accessing, and thus we cannot parallelize it.

Instead, you should use the Commands argument. Through it you can queue operations to be executed at a later time, when its safe to do so.

Imagine we want to have spawners which create new entities on their position and then destroy themselves. We can implement this with a system like this:

cubos.system("spawn entities")
+     .call([](Commands commands, Query<Entity, const Spawner&, const Position&> spawners)
+     {
+         for (auto [entity, spawner, position] : spawners)
+         {
+             commands.create()
+                     .add(position)
+                     .add(Velocity{{0.0F, 0.0F, 1.0F}});
+             commands.destroy(entity);
+         }
+     });

This system iterates over all entities with Spawner and Position components. It creates new entities on their positions with a velocity of (0, 0, 1), and then destroys the spawner entity. The entities are only actually created and destroyed later on, when the commands are executed.

Observers

If you find yourself wanting to apply some logic whenever a given component is added or removed, observers are the right tool for you! For example, one use case that arises frequently when working with Cubos, is when you have multiple components that must be added to an entity for it perform some function correctly. This is the case for the Position component. If the entity doesn't have a LocalToWorld component, then it's meaningless. To solve this, we do something along the lines of:

cubos.observer("add LocalToWorld to positions")
+     .onAdd<Position>()
+     .without<LocalToWorld>()
+     .call([](Commands cmds, Query<Entity> query) {
+        for (auto [ent] : query)
+        {
+            cmds.add(ent, LocalToWorld{});
+        }
+     });

Relations

Relations are just like components, but they're much more powerful. Instead of being associated to a single entity, they're associated to two entities: the 'from' entity and the 'to' entity. There are three types of relations:

  • Default - relations which have a orientation (e.g. from and to have distinct meanings), and which have no restriction on the number.
  • Tree - relations which too have orientation, but with the extra restriction that an entity can only appear in the 'from' side of at least one instance of the relation type. One example is the ChildOf relation.
  • Symmetric - relations whose orientation doesn't matter. One example is the CollidingWith relation.

They can be created using either Commands::relate() or the World::relate() methods. They can also be destroyed using Commands::unrelate() or World::unrelate().

Relations can also be queried in systems - read the multiple-target section on the Queries guide for more information on that.

Blueprints

A common pattern in game engines is to have a way to create entities in bundles, such as Unity's prefabs. In Cubos we call these blueprints. A blueprint is a set of entities and their components, which can be spawned into the world as many times as needed.

For example, if we wanted to create a blueprint for a motorbike with two wheels:

auto motorbike = ecs::Blueprint();
+
+auto body = motorbike.create("body");
+motorbike.add(body, Position{...});
+
+auto frontWheel = motorbike.create("front_wheel");
+motorbike.add(frontWheel, Position{...});
+motorbike.relate(frontWheel, body, ChildOf{});
+
+auto backWheel = motorbike.create("back_wheel");
+motorbike.add(backWheel, Position{...});
+motorbike.relate(backWheel, body, ChildOf{});

To spawn the blueprint into the world:

// You can just spawn the bike as is.
+commands.spawn(motorbike);
+
+// Lets say we want to spawn the bike in a different position.
+// You can override components of the spawned entities.
+commands
+    .spawn(motorbike)
+    .add("body", Position{...});

Merging blueprints

It's possible to merge a blueprint into another one. Lets say we have a blueprint for the wheels of the motorbike:

auto wheel = ecs::Blueprint();
+wheel.create("wheel");

When creating the motorbike blueprint, we can merge the wheel blueprint into it:

auto motorbike = ecs::Blueprint();
+auto body = motorbike.create("body", Position{...});
+motorbike.merge("front", wheel);
+motorbike.merge("back", wheel);

When spawning the motorbike blueprint, the entities of the wheel blueprint will be accessible with the prefix we gave them:

commands
+    .spawn(motorbike)
+    .add("front.wheel", ...)
+    .add("back.wheel", ...);
+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/features-plugins.html b/preview/pr-1379/features-plugins.html new file mode 100644 index 0000000000..e597aa1030 --- /dev/null +++ b/preview/pr-1379/features-plugins.html @@ -0,0 +1,169 @@ + + + + + Feature Guide » Plugins | Cubos Docs + + + + + + + + + +
+
+
+
+
+

+ Feature Guide » + Plugins +

+

What are plugins and how they can be used to organize your code.

+

Configuring the engine

Plugins are a feature of the cubos::core::ecs::Cubos class. This class is the main thing you'll be interacting with when developing a game with Cubos. It is used to configure the engine and run the game loop. Through it, you can register new components, relations, resources and configure systems to be run on specific conditions.

Below is an example of an application which:

  1. adds a resource with the string "Hello World".
  2. prints its contents.
#include <cubos/engine/prelude.hpp>
+
+#include <iostream>
+
+using cubos::engine::Cubos;
+
+struct Message
+{
+    std::string value = "Hello World!";
+};
+
+int main()
+{
+    Cubos cubos;
+
+    cubos.resource<Message>();
+
+    cubos.startupSystem("show message").call([](const Message& msg) {
+        std::cout << msg.value << std::endl;
+    });
+
+    cubos.run();
+}

What are plugins?

If you had to add every system, component and resource to your game's main source file, it would quickly become a mess. Plugins are just functions which receive a reference to the Cubos class. Nothing more.

The idiomatic way to use plugins is through the Cubos::plugin and Cubos::depends methods. The first receives a function to a plugin, and executes it. The second marks the current plugin as depending on the given plugin.

Lets take the example above and move the functionality to a plugin.

// ...
+
+void helloWorldPlugin(Cubos& cubos)
+{
+    cubos.resource<Message>(Message{"Hello World!"});
+
+    cubos.startupSystem("show message").call([](const Message& msg) {
+        std::cout << msg.value << std::endl;
+    });
+}
+
+int main()
+{
+    Cubos cubos;
+
+    cubos.plugin(helloWorldPlugin);
+
+    cubos.run();
+}

Looks good! But lets pretend for a moment that there's a lot of logic necessary to create the message and resource. How could we divide this further?

void messagePlugin(Cubos& cubos)
+{
+    cubos.resource<Message>(Message{"Hello World!"});
+}
+
+void showPlugin(Cubos& cubos)
+{
+    cubos.depends(messagePlugin);
+
+    cubos.startupSystem("show message").call([](const Message& msg) {
+        std::cout << msg.value << std::endl;
+    });
+}
+
+int main()
+{
+    Cubos cubos;
+
+    cubos.plugin(messagePlugin);
+    cubos.plugin(showPlugin);
+
+    cubos.run();
+}

Notice that the showPlugin marks itself as depending on messagePlugin. This is necessary, as we use a resource which is defined in that plugin. Since showPlugin depends on messagePlugin, we must add it before the showPlugin.

The two main rules to be take into account are:

  • plugins may only be added once (through Cubos::plugin).
  • plugins cannot use tags, resources, components or relations from plugins they didn't add or don't depend on.

What plugins are there?

The engine is basically a big bundle of plugins which add all of kinds of functionality. You can find an exhaustive list of the plugins provided by the engine and their documentation on the engine module page. Check out the engine examples to see how they are used in practice.

+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/features-quadrados.html b/preview/pr-1379/features-quadrados.html new file mode 100644 index 0000000000..15bc6f0649 --- /dev/null +++ b/preview/pr-1379/features-quadrados.html @@ -0,0 +1,123 @@ + + + + + Feature Guide » Quadrados | Cubos Docs + + + + + + + + +
+
+
+
+
+

+ Feature Guide » + Quadrados +

+

How to use the Quadrados CLI tool.

+

Quadrados is the CLI tool used to work with Cubos At the moment, it contains the following commands:

  • quadrados help - shows the help message;
  • quadrados convert - converts a .qb voxel file into the internal format used by Cubos, .grd and .pal.
  • quadrados embed - utility used to embed files directly into an executable for use with the EmbeddedArchive.

Convert

The need for this tool arose from the fact that Cubos works with a single palette of voxel materials, and voxel objects refer to specific materials by their index in this palette. For example, if we had a single voxel red object, the red color wouldn't be specified in the voxel object. Instead, this object would specify that its material is 1, and the palette would specify that the material 1 is red.

The issue is, voxel formats like .qb and .vox are not designed to store only the indices of materials, but the whole material definition, per voxel. This conflicts with the way Cubos works, so we need to convert these formats into the internal format used by Cubos. This is where quadrados convert comes in. It takes a .qb voxel file and splits it into a palette (.pal), and one or more voxel grids (.grd).

Usage

This guide will be based on four use cases:

  1. loading a .qb file and creating a new .pal;
  2. loading a .qb file and updating an existing .pal;
  3. loading a .qb file and using, without editing, an existing .pal;
  4. querying the contents of .qb model;

Example 1: Creating a new palette

This use case is most common when importing the first .qb file for a new project. There is no palette file yet, so we need to create one. Lets say the model we want to convert is a car.qb, which contains a single voxel object.

$ quadrados convert car.qb -p main.pal -g car.grd -w

First, we specify the .qb file to convert. Then, we specify the name of the palette we will be outputting. We also need to specify the output file for the voxel grid. Finally, we pass the -w flag which allows us to write to the palette file (which is necessary since there is none at the moment).

Example 2: Updating an existing palette

Lets say we now want to import a street.qb model which contains two voxel grids: the first one is a road and the second one is a tree. Since we already have a palette, we want to add any new materials to it.

$ quadrados convert street.qb -p main.pal -g0 road.grd -g1 tree.grd -w

Once again, we first specify the .qb file to convert. Then, we specify the name of the palette we will be using, which is the same as the one we created in the previous example. This time, we have two grids in the .qb file, so we need to specify the output files for both. This is done by adding an index in front of -g (e.g. -g0 for the first grid, -g1 for the second). Finally, we once again pass the -w flag which allows the palette file to be updated.

Example 3: Using an existing palette

What if we want to add another car model, but without adding materials to the palette? To do this, we will need to ommit the -w flag. This way, the palette will be read, and the most similar materials found will be used. By default, this will only succeed if the materials match exactly.

$ quadrados convert car2.qb -p main.pal -g car2.grd

If this fails, you may see the error message:

Failed to convert grid 0 from its palette to the palette chosen.

One work around is lowering the threshold for material matching. If you want to allow for slightly different materials to be considered as the same, you can pass the -s <SIMILARITY> option. This value is a number from 0 to 1, where 0 is completely different and 1 is completely the same. It represents the minimum similarity between two materials to consider them the same (default is 1).

So, if the materials which aren't matching are very similar, you could add, for example, -s 0.9 to the previous command. This way, the material chosen from the palette will have a similarity of at least 0.9 with the material in the original model.

Example 4: Querying the contents of a model

You may want to check the contents of a .qb file before converting it. One easy way to do this is to use the -v (verbose) flag. This can be added to any of the previous commands to get extra information about what is going on.

It can also be used without any other options, in which case the program will just print the contents of the .qb file. For example:

$ quadrados convert car.qb -v
+Found 1 QB matrices.
+Matrix 0:
+- Position: -7 -5 -16
+- Grid size: 15x11x32
+- Palette size: 10

This tells us that the car.qb model contains exactly one voxel grid, that its position within the model is (-7, -5, -16), that its size is 15x11x32, and that it uses 10 different materials.

Embed

The quadrados embed tool is used to embed files directly into an executable for use with the cubos::core::data::EmbeddedArchive. This is useful for example when you want to ship a game with a set of assets, but don't want to have to distribute them as separate files. This way, you are able to ship a single executable file.

Usage

This tool takes a file and generates a C++ source file which registers data to be used with cubos::core::data::EmbeddedArchive, outputting the code to the standard output. This source file can then be compiled and linked with your executable.

If no name is specified, the name of the file will be used. For example, if you run quadrados embed logo.png > logo.cpp, the name of the registered data will be logo.png.

The data can then be mounted like this:

#include <cubos/core/data/fs/file_system.hpp>
+#include <cubos/core/data/fs/embedded_archive.hpp>
+
+int main()
+{
+    using namespace cubos::core::data;
+
+    FileSystem::mount("/logo.png", std::make_shared<EmbeddedArchive>("logo.png"));
+
+    // ...
+
+    return 0;
+}

It's also possible to embed a whole directory, in which case you will need to use the -r flag. This will recursively embed all files in the directory.

Checkout the embedded_archive sample for a complete example.

+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/features-queries.html b/preview/pr-1379/features-queries.html new file mode 100644 index 0000000000..4efa70b1a8 --- /dev/null +++ b/preview/pr-1379/features-queries.html @@ -0,0 +1,202 @@ + + + + + Feature Guide » Queries | Cubos Docs + + + + + + + + + +
+
+
+
+
+

+ Feature Guide » + Queries +

+

In-depth guide on writing queries.

+

Single-target queries

Let's say you want to implement behavior for regenerating the health of all players of a certain class. One possible way to design this would be to have a component Health, and another for the class, e.g., Mage. Then you could add a system similar to the one below:

cubos.system("heal mages").call([](Query<Health&, const Mage&> query) {
+    for (auto [health, mage] : query)
+    {
+        health.points += 1;
+    }
+});

Notice that we don't actually access the mage component at all. We just want it to be present on the entities given by the query. A better way to write this would be to add an explicit query term:

cubos.system("heal mages")
+     .with<Mage>() // <--- EXPLICIT TERM
+     .call([](Query<Health&> query) {
+         for (auto [health] : query)
+         {
+             health.points += 1;
+         }
+     });

Notice that we could also add .with<Health>() above, but that would be redundant.

Explicit query terms bring a lot of possibilities: they can also be used to specify, for example, that entities should not have a component. With this, we can easily prevent healing mages which are already dead:

cubos.system("heal alive mages")
+     .with<Mage>()
+     .without<Dead>()
+     .call([](Query<Health&> query) {
+        // ...
+     });

But how do we mark entities as Dead? We add the Dead component to entities with Commands::add(), but how do we get the entity handles of the entities with health set to zero? Just adding Entity as a query argument type is enough!

cubos.system("add dead to entities with zero health")
+     .without<Dead>() // no use killing it twice!
+     .call([](Commands cmds, Query<Entity, const Health&> query)
+     {
+        for (auto [entity, health] : query)
+        {
+            if (health.points <= 0)
+            {
+                cmds.add(entity, Dead{});
+            }
+        }
+     });

Multiple-target queries

Until now we've only seen queries matching against single entities, but what if we want to access relations? Relations no longer belong to a single entity - and this is where the query system really starts to shine.

Lets add arrows to our fictional RPG. Arrow entities are identified by, you guessed it, an Arrow component. When an arrow hits an entity with health, we want to destroy the arrow and reduce the health. To check if two entities are colliding, we'll use the CollidingWith relation.

cubos.system("arrow damages entity")
+     .call([](Commands cmds, Query<Entity, const Arrow&, const CollidingWith&, Health&> query) {
+        for (auto [arrowEntity, arrow, collidingWith, health] : query)
+        {
+            health.points -= 10;
+            cmds.destroy(arrowEntity),
+        }
+     });

Notice that once again we're not accessing some of the data: the Arrow and CollidingWith components. We can rewrite the query above as:

cubos.system("arrow damages entity")
+     .entity()
+     .with<Arrow>()
+     .related<CollidingWith>()
+     .with<Health>()
+     .call([](Commands cmds, Query<Entity, Health&> query) {
+        for (auto [arrowEntity, health] : query)
+        {
+            health.points -= 10;
+            cmds.destroy(arrowEntity),
+        }
+     });

Notice that this time we include .entity and .with<Health> on the explicit terms to remove the ambiguity that could arise otherwise. Terms before .related are assigned to the target 0, the relation is assigned to 0, 1 and the terms after it to 1. We could also set those targets manually, if we wanted to, by simply passing them as arguments to the terms (e.g. .with<Health>(1)).

For example, iterating over all pairs of entities could be done through:

cubos.system("for each pair of entities")
+     .entity(0)
+     .entity(1)
+     .call([](Query<Entity, Entity> query) {
+        for (auto [first, second] : query)
+        {
+            // ...
+        }
+     });

Tree Traversal

Tree relations form hierarchies, and the query system provides a way to traverse them in specific BFS order, if necessary. For example, if you want to traverse the ChildOf tree from top to bottom, you could:

cubos.system("print all ChildOf relations ordered")
+     .entity()
+     .related<ChildOf>(Traversal::Up)
+     .entity()
+     .call([](Query<Entity, Entity> query) {
+        for (auto [child, parent] : query)
+        {
+            CUBOS_INFO("{} is a child of {}", child, parent);
+        }
+     });

The above system would first print all ChildOf relations originating from entities which don't have children, then their parents, and so on until reaching the root entities of the hierarchy. To traverse in the opposite direction you can also use Traversal::Down.

Pinning

Alright, its cool that we can query over all entities, but what if we just want to do something with the children of specific entity? You can just pin the parent target to a specific entity!

Notice that the first target of a relation is identified by 0, the second by 1, and so on.

cubos.system("print all children of some specific entity")
+     .entity()
+     .related<ChildOf>()
+     .call([](Query<Entity> query, const SomeResource& resource) {
+        // Forces all matches of the query to have target 1 = resource.entity
+        for (auto [child] : query.pin(1, resource.entity))
+        {
+            CUBOS_INFO("{} is a child of {}", child, entity.entity);
+        }
+     });

To find the parent of an entity, you could also just go the other way around:

cubos.system("print the parent of some specific entity")
+     .related<ChildOf>()
+     .entity()
+     .call([](Query<Entity> query, const SomeResource& resource) {
+        if (auto match = query.pin(0, resource.entity).first())
+        {
+            auto [parent] = *match;
+            CUBOS_INFO("{} is the parent of {}", resource.entity);
+        }
+     });

Direct access

If you pin all targets of a query, you get either zero or one matches. This can be used to access the components of specific entities, or the relation between two specific entities for example.

For example, to access the health of a specific entity, you could:

cubos.system("access the health of a specific entity")
+     .call([](Query<const Health&> query, const SomeResource& resource) {
+        if (auto match = query.pin(0, resource.entity).first())
+        {
+            auto [health] = *match;
+            // Do something with the health component
+        }
+     });

If you wanted to check if two specific entities are colliding, you could:

cubos.system("test collisions between specific entities")
+     .related<CollidingWith>()
+     .call([](Query<> query, const SomeResource& resource) {
+        if (query.pin(0, resource.first).pin(1, resource.second).first())
+        {
+            // They're colliding!
+        }
+     });

Both of the examples can be shortened using the Query::at() method. With a single target query, instead of query.pin(0, entity).first(), you can write query.at(entity). With two targets, instead of query.pin(0, entityA).pin(1, entityB).first(), you can write query.at(entityA, entityB).

+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/features.html b/preview/pr-1379/features.html new file mode 100644 index 0000000000..3ff48fbf62 --- /dev/null +++ b/preview/pr-1379/features.html @@ -0,0 +1,102 @@ + + + + + Feature Guide | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Feature Guide +

+

This is a brief introduction to the Cubos engine and its features. Before diving into the documentation of each class and function, it's recommended to read through this guide.

Overview

The Cubos engine is divided into two libraries: Core and Engine. Each library has its own namespace, which corresponds to a sub-folder in the include path.

Core provides platform abstraction, containers, utilities, and the ECS module. Engine builds on top of Core and provides higher-level features such as rendering and collisions.

The core library is divided into modules, each of which covers a specific area of functionality. For example, graphics-related functionality is on the cubos::core::gl namespace, under the include path cubos/core/gl.

The engine library is divided into plugins, each of which extends the engine's functionality in some way. You'll learn more about plugins below. For each plugin, there is a corresponding directory in the include path. Categories of plugins are also divided into sub-folders, with their own namespaces.

Tooling

Other than the core and engine libraries, the project also contains Quadrados and Tesseratos. Quadrados is a CLI tool which contains utilities used during game development. Tesseratos is our in-house editor, which is still in its early stages of development.

Learn more

The following guides explain basic concepts of the engine. Its recommend to read through these first to understand the overall principles and only then dive into the documentation of each class and function.

  • ECS - What is an ECS and how it's used in Cubos
  • Plugins - What are plugins and how they can be used to organize your code.
  • Queries - In-depth guide on writing queries.
  • Quadrados - How to use the Quadrados CLI tool.

What we don't have and where are we going

The engine is still in its early stages of development, and thus we're missing a lot of features. For example, we don't have rigid body physics yet, and the editor tools are very bare bones. There's no scripting language, thus you will have to write all your game logic in C++.

Making a game with the engine is still very painful. Our goal is to make Cubos usable for game jams by people who are not on the team. This means a lot of work, but we're confident we can get there.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/fields_8hpp.html b/preview/pr-1379/fields_8hpp.html new file mode 100644 index 0000000000..4d51724999 --- /dev/null +++ b/preview/pr-1379/fields_8hpp.html @@ -0,0 +1,143 @@ + + + + + core/reflection/traits/fields.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/fields.hpp file +

+

Class cubos::core::reflection::FieldsTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::FieldsTrait +
+
Describes the fields of a reflected type.
+
+
template<typename O, typename F>
+ class cubos::core::reflection::FieldsTrait::AddressOfImpl +
+
Implementation of AddressOf for a pointer to member.
+
+ struct cubos::core::reflection::FieldsTrait::Output +
+
Output structure for the iterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/file__stream_8hpp.html b/preview/pr-1379/file__stream_8hpp.html new file mode 100644 index 0000000000..b289969147 --- /dev/null +++ b/preview/pr-1379/file__stream_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/data/fs/file_stream.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/file_stream.hpp file +

+

Class cubos::core::data::FileStream.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+
template<typename T>
+ class cubos::core::data::FileStream +
+
Wrapper around an implementation-specific file stream which keeps the file alive and does some sanity checks.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/file__system_8hpp.html b/preview/pr-1379/file__system_8hpp.html new file mode 100644 index 0000000000..a710454533 --- /dev/null +++ b/preview/pr-1379/file__system_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/fs/file_system.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/data/fs/file_system.hpp file +

+

Class cubos::core::data::FileSystem.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::data
+
Data module.
+
+
+
+

Classes

+
+
+ class cubos::core::data::FileSystem +
+
Singleton which represents the virtual file system of the engine.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/files.html b/preview/pr-1379/files.html new file mode 100644 index 0000000000..6afa0024fe --- /dev/null +++ b/preview/pr-1379/files.html @@ -0,0 +1,820 @@ + + + + + Cubos Docs + + + + + + + +
+
+
+
+
+

Files

+ + +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/filter_8hpp.html b/preview/pr-1379/filter_8hpp.html new file mode 100644 index 0000000000..00ed5de996 --- /dev/null +++ b/preview/pr-1379/filter_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/query/filter.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/filter.hpp file +

+

Class cubos::core::ecs::QueryFilter.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::QueryFilter +
+
Used to find matches for the given query terms. Essentially contains the non-templated part of the query logic.
+
+ struct cubos::core::ecs::QueryFilter::Match +
+
Output structure of the iterator.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/fixed__delta__time_8hpp.html b/preview/pr-1379/fixed__delta__time_8hpp.html new file mode 100644 index 0000000000..b9b659c4d7 --- /dev/null +++ b/preview/pr-1379/fixed__delta__time_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/fixed_step/fixed_delta_time.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/fixed_step/fixed_delta_time.hpp file +

+

Resource cubos::engine::FixedDeltaTime.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::FixedDeltaTime +
+
Resource which holds the value of the fixed delta for the fixedStep plugin.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/force_8hpp.html b/preview/pr-1379/force_8hpp.html new file mode 100644 index 0000000000..618f9f3cc8 --- /dev/null +++ b/preview/pr-1379/force_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/force.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/force.hpp file +

+

Component cubos::engine::Force.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Force +
+
Component which holds forces applied on a particle.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/function_8hpp.html b/preview/pr-1379/function_8hpp.html new file mode 100644 index 0000000000..dfb6a35653 --- /dev/null +++ b/preview/pr-1379/function_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/memory/function.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/function.hpp file +

+

Class cubos::core::memory::Function.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+
template<typename>
+ class cubos::core::memory::Function +
+
Generic function pointer which can also store capturing lambda functions.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/g__buffer_8hpp.html b/preview/pr-1379/g__buffer_8hpp.html new file mode 100644 index 0000000000..6e91ce4e7e --- /dev/null +++ b/preview/pr-1379/g__buffer_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/g_buffer/g_buffer.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer/g_buffer.hpp file +

+

Component cubos::engine::GBuffer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::GBuffer +
+
Component which stores the GBuffer textures of a render target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/g__buffer__rasterizer_8hpp.html b/preview/pr-1379/g__buffer__rasterizer_8hpp.html new file mode 100644 index 0000000000..b886fc2eea --- /dev/null +++ b/preview/pr-1379/g__buffer__rasterizer_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/g_buffer_rasterizer/g_buffer_rasterizer.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/g_buffer_rasterizer/g_buffer_rasterizer.hpp file +

+

Component cubos::engine::GBufferRasterizer.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::GBufferRasterizer +
+
Component which stores the GBuffer rasterizer state.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/gamepad_8hpp.html b/preview/pr-1379/gamepad_8hpp.html new file mode 100644 index 0000000000..ff080da8bb --- /dev/null +++ b/preview/pr-1379/gamepad_8hpp.html @@ -0,0 +1,193 @@ + + + + + core/io/gamepad.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/io/gamepad.hpp file +

+

Struct cubos::core::io::GamepadState and related enums.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::io
+
Input and output module.
+
+
+
+

Classes

+
+
+ struct cubos::core::io::GamepadState +
+
Holds the state of a gamepad.
+
+
+
+

Enums

+
+
+ enum class GamepadButton { Invalid = -1, + A, + B, + X, + Y, + LBumper, + RBumper, + Back, + Start, + Guide, + LThumb, + RThumb, + Up, + Right, + Down, + Left, + Count } +
+
Gamepad buttons.
+
+ enum class GamepadAxis { Invalid = -1, + LX, + LY, + RX, + RY, + LTrigger, + RTrigger, + Count } +
+
Gamepad axes.
+
+
+
+

Functions

+
+
+ auto gamepadButtonToString(GamepadButton button) -> CUBOS_CORE_API std::string +
+
Converts a GamepadButton enum to a string.
+
+ auto stringToGamepadButton(const std::string& str) -> CUBOS_CORE_API GamepadButton +
+
Converts a string to a GamepadButton.
+
+ auto gamepadAxisToString(GamepadAxis axis) -> CUBOS_CORE_API std::string +
+
Convert a GamepadAxis to a string.
+
+ auto stringToGamepadAxis(const std::string& str) -> CUBOS_CORE_API GamepadAxis +
+
Convert a string to a GamepadAxis.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/geom_2utils_8hpp.html b/preview/pr-1379/geom_2utils_8hpp.html new file mode 100644 index 0000000000..60cafba861 --- /dev/null +++ b/preview/pr-1379/geom_2utils_8hpp.html @@ -0,0 +1,170 @@ + + + + + core/geom/utils.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/utils.hpp file +

+

Class cubos::core::geom::Utils.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::geom
+
Geometry module.
+
+
+
+

Functions

+
+
+ auto pointInPlane(const glm::vec3& point, + const cubos::core::geom::Plane& plane) -> CUBOS_CORE_API bool +
+
Computes if a point is in the area limited by the plane.
+
+ auto getMaxVertexInAxis(int numVertices, + const glm::vec3 vertices[], + const glm::vec3& localAxis) -> CUBOS_CORE_API int +
+
Computes the vertex furthest along the axis.
+
+ auto getIncidentReferencePolygon(const cubos::core::geom::Box& shape, + const glm::vec3& normal, + std::vector<glm::vec3>& outPoints, + glm::vec3& outNormal, + std::vector<cubos::core::geom::Plane>& outAdjacentPlanes, + const glm::mat4& localToWorld, + float scale) -> CUBOS_CORE_API void +
+
Computes the candidate face of the polygon to be reference, as well as it's normal and adjacent planes.
+
+ auto getClosestPointEdge(const glm::vec3& point, + glm::vec3 start, + glm::vec3 end) -> CUBOS_CORE_API glm::vec3 +
+
Computes the closest point on the line (edge) to point.
+
+ auto getClosestPointPolygon(const glm::vec3& point, + const std::vector<glm::vec3>& polygon) -> CUBOS_CORE_API glm::vec3 +
+
Iterates through all edges in polygon and computes closest position on the edges of the polygon to point.
+
+ auto getCameraFrustumCorners(const glm::mat4& view, + const glm::mat4& proj, + float zNear, + float zFar, + std::vector<glm::vec4>& corners) -> CUBOS_CORE_API void +
+
Gets a camera's frustum corners in world space.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/getting-started.html b/preview/pr-1379/getting-started.html new file mode 100644 index 0000000000..1061303433 --- /dev/null +++ b/preview/pr-1379/getting-started.html @@ -0,0 +1,103 @@ + + + + + Getting started | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Getting started +

+

How to download, build and run the engine and where to go from there.

+

Building the engine from source

Getting the code

The Cubos source code is hosted on GitHub, so the easiest and only way to get the code right now is to clone the repository with git.

Dependencies

The following dependencies are used to compile Cubos:

NameImportanceSubmodule PathInstalled SeparatelyVersion*
CMakeEssential-Yes-
gladEssentialcore/lib/gladNo2.0.4
glfwEssentialcore/lib/glfwOptionally3.3.8
glmEssentialcore/lib/glmOptionally0.9.9.8
stduuidEssentialcore/lib/stduuidNo1.2.3
doctestRequired for testscore/lib/doctestOptionally2.4.11
jsonEssentialcore/lib/jsonNo3.11.2
imguiEssentialengine/lib/imguiNo1.89.9
imguiEssentialengine/lib/implotNo1.89.9

*versions tested in CI and installed by submodules, others might work

Dependencies marked as Essential are required to compile the engine. If they are installed separately, you must first install them manually. If they're not, it means they come as submodules and you can install them with the engine by cloning the whole repository with the --recursive flag. If you've already cloned the repository, you can install them by running the following command from the root directory of the repository:

git submodule update --init --recursive

Formatting

To contribute you must ensure your code is correctly formatted. Install clang-format and run the following command to enable a pre-commit hook which formats your changes automatically:

git config --local include.path ../.gitconfig

Compiling

The easiest way to compile Cubos is by opening its directory in an IDE with CMake support. We recommend using Visual Studio Code with the CMake and C++ extensions installed, as it is cross-platform, and most of the team is using it.

The IDE you choose most probably provides a way to set CMake options through the UI. In Visual Studio Code, you can do this by pressing Ctrl + Shift + P and choosing CMake: Edit CMake Cache (UI). Alternatively, you can change options directly through the CMakeCache.txt on the directory you chose to build the project in (usually build/).

Visual Studio Code's CMake extension allows you to set a build target. You can set this target, for example, to cubos-core, in order to compile only the core. To compile it, just press the build button.

The following is a list of all the options available to configure the engine:

NameDescription
WITH_GLFWUse GLFW? (Required for now)
WITH_OPENGLUse OpenGL? (Required for now)
GLFW_USE_SUBMODULECompile glfw from source?
GLM_USE_SUBMODULECompile glm from source?
DOCTEST_USE_SUBMODULECompile doctest from source?
BUILD_CORE_SAMPLESBuild Cubos core samples?
BUILD_CORE_TESTSBuild Cubos core tests?
BUILD_ENGINE_SAMPLESBuild Cubos engine samples?
BUILD_ENGINE_TESTSBuild Cubos engine tests?
BUILD_DOCUMENTATIONBuild the documentation?
ENABLE_COVERAGEEnable code coverage? (GCC only)
FIX_CLANG_TIDY_ERRORSFix clang-tidy errors automatically?

After you change an option's value, make sure to reconfigure CMake! In Visual Studio Code, you can do this by pressing Ctrl + Shift + P and choosing CMake: Configure.

Running the examples and tests

In Visual Studio Code, the CMake extension allows you to set the debug targets. That target can then by launched/debugged by pressing the launch/debug button.

Examples

Both core and engine contain examples which you can run to check if things are running correctly. To build them, you must enable the BUILD_CORE_SAMPLES and/or BUILD_ENGINE_SAMPLES options. This will show new multiple targets, one for each example.

Testing

Cubos uses doctest for unit testing the engine. To build them, you must enable the BUILD_CORE_TESTS and/or BUILD_ENGINE_TESTS options. You can run the tests through the targets cubos-core-tests and cubos-engine-tests.

Whats next?

We recommend you start by reading the feature guide, which introduces you to important concepts and features of the engine, such as what is an ECS and how it is used in Cubos.

The examples page is also a good place to go if you want to see how specific parts of the engine are used in practice.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/gizmos_2target_8hpp.html b/preview/pr-1379/gizmos_2target_8hpp.html new file mode 100644 index 0000000000..ca33ba10cf --- /dev/null +++ b/preview/pr-1379/gizmos_2target_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/gizmos/target.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/gizmos/target.hpp file +

+

Component cubos::engine::GizmosTarget.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::GizmosTarget +
+
Component used to indicate that Gizmos should be rendered to a given RenderTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/gizmos_8hpp.html b/preview/pr-1379/gizmos_8hpp.html new file mode 100644 index 0000000000..5e5de526f7 --- /dev/null +++ b/preview/pr-1379/gizmos_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/gizmos/gizmos.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/gizmos/gizmos.hpp file +

+

Resource cubos::engine::Gizmos.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::Gizmos +
+
Resource which queues commands for drawing gizmos, basic primitives useful for debugging and tools.
+
+ class cubos::engine::Gizmos::Gizmo +
+
Class that describes a type of gizmo.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/glm_8hpp.html b/preview/pr-1379/glm_8hpp.html new file mode 100644 index 0000000000..a602e39648 --- /dev/null +++ b/preview/pr-1379/glm_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/glm.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/glm.hpp file +

+

Reflection declarations for external glm types.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/grid__bridge_8hpp.html b/preview/pr-1379/grid__bridge_8hpp.html new file mode 100644 index 0000000000..67a9113ee0 --- /dev/null +++ b/preview/pr-1379/grid__bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/grid_bridge.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/voxels/grid_bridge.hpp file +

+

Class cubos::engine::GridBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::VoxelGridBridge +
+
Bridge which loads and saves Grid assets.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__assets-plugin.html b/preview/pr-1379/group__assets-plugin.html new file mode 100644 index 0000000000..ec30a7ef20 --- /dev/null +++ b/preview/pr-1379/group__assets-plugin.html @@ -0,0 +1,287 @@ + + + + + Engine » Assets module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Assets module

+

Adds asset management to Cubos.

+ +

Settings

  • assets.io.enabled - whether asset I/O should be done (default: true).
  • assets.io.path - path to the assets directory - will be mounted to /assets/ (default: assets/).
  • assets.io.readOnly - if true, the assets directory will be mounted as read-only (default: true).

Events

  • AssetEvent - (TODO) emitted when an asset is either loaded, modified or unloaded.

Resources

  • Assets - the asset manager, used to access asset data.

Dependencies

+
+

Files

+
+
file asset.hpp
+
Classes cubos::engine::AnyAsset and cubos::engine::Asset.
+
file assets.hpp
+
Resource cubos::engine::Assets.
+
file bridge.hpp
+
Class cubos::engine::AssetBridge.
+
file file.hpp
+
Class cubos::engine::FileBridge.
+
file json.hpp
+
Class cubos::engine::JSONBridge.
+
file meta.hpp
+
Class cubos::engine::AssetMeta.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ class cubos::engine::AnyAsset +
+
Handle to an asset of any type. May either be weak or strong. Weak handles do not guarantee the asset is loaded, while strong handles do.
+
+
template<typename T>
+ class cubos::engine::Asset +
+
Handle to an asset of a specific type.
+
+ class cubos::engine::Assets +
+
Resource which manages all assets. Responsible for loading and unloading assets, storing them in memory, and providing access to them.
+
+ class cubos::engine::AssetBridge +
+
Bridges are the objects responsible for loading and saving assets from/to disk. They form the bridge between the asset manager and the virtual file system.
+
+ class cubos::engine::FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
template<typename T>
+ class cubos::engine::JSONBridge +
+
Bridge for loading and saving assets which are serialized to and from a JSON file.
+
+ class cubos::engine::AssetMeta +
+
Stores metadata about an asset - the data stored in .meta files. Each asset has a corresponding meta object, which contains load or import parameters.
+
+
+
+

Typedefs

+
+
+ using AssetMetaRead = core::memory::ReadGuard<AssetMeta, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's metadata.
+
+ using AssetMetaWrite = core::memory::WriteGuard<AssetMeta, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's metadata.
+
+
template<typename T>
+ using AssetRead = core::memory::ReadGuard<T, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's data.
+
+
template<typename T>
+ using AssetWrite = core::memory::WriteGuard<T, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's data.
+
+
+
+

Functions

+
+
+ auto assetsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Typedef documentation

+
+

+ using AssetMetaRead = core::memory::ReadGuard<AssetMeta, std::shared_lock<std::shared_mutex>> + +

+

Read-only guard for an asset's metadata.

+
+
+

+ using AssetMetaWrite = core::memory::WriteGuard<AssetMeta, std::unique_lock<std::shared_mutex>> + +

+

Read-write guard for an asset's metadata.

+
+
+

+ +
+ template<typename T> +
+ using AssetRead = core::memory::ReadGuard<T, std::shared_lock<std::shared_mutex>> +

+

Read-only guard for an asset's data.

+ + + + + + + + + + +
Template parameters
TThe type of the data to guard.
+
+
+

+ +
+ template<typename T> +
+ using AssetWrite = core::memory::WriteGuard<T, std::unique_lock<std::shared_mutex>> +

+

Read-write guard for an asset's data.

+ + + + + + + + + + +
Template parameters
TThe type of the data to guard.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void assetsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__collider-gizmos-tool-plugin.html b/preview/pr-1379/group__collider-gizmos-tool-plugin.html new file mode 100644 index 0000000000..9e6e054ce6 --- /dev/null +++ b/preview/pr-1379/group__collider-gizmos-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Collider Gizmos module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Collider Gizmos module

+

Draws gizmos for colliders of selected entities.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto colliderGizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void colliderGizmosPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__collisions-plugin.html b/preview/pr-1379/group__collisions-plugin.html new file mode 100644 index 0000000000..bbd97b85be --- /dev/null +++ b/preview/pr-1379/group__collisions-plugin.html @@ -0,0 +1,203 @@ + + + + + Engine » Collisions module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Collisions module

+

Adds collision detection to Cubos.

+ +

Components

Events

  • CollisionEvent - (TODO) emitted when a collision occurs.
  • TriggerEvent - (TODO) emitted when a trigger is entered or exited.

Dependencies

+
+

Files

+
+
file collider.hpp
+
Component cubos::engine::Collider.
+
file colliding_with.hpp
+
Relation cubos::engine::CollidingWith.
+
file contact_manifold.hpp
+
Relation cubos::engine::ContactManifold.
+
file plugin.hpp
+
Plugin entry point.
+
file raycast.hpp
+
System argument cubos::engine::Raycast.
+
file box.hpp
+
Component cubos::engine::BoxCollisionShape.
+
file capsule.hpp
+
Component cubos::engine::CapsuleCollisionShape.
+
file voxel.hpp
+
Component cubos::engine::VoxelCollisionShape.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Collider +
+
Component which adds a collider to an entity.
+
+ struct cubos::engine::CollidingWith +
+
Relation which represents a collision.
+
+ class cubos::engine::Raycast +
+
System argument which allows performing raycast queries among all entities with colliders.
+
+ struct cubos::engine::BoxCollisionShape +
+
Component which adds a box collision shape to an entity, used with a Collider component.
+
+ struct cubos::engine::CapsuleCollisionShape +
+
Component which adds a capsule collision shape to an entity, used with a Collider component.
+
+ class cubos::engine::VoxelCollisionShape +
+
Component which adds a collision shape corresponding to a given voxel grid to an entity, used with a Collider component.
+
+ struct cubos::engine::VoxelCollisionShape::BoxShiftPair +
+
Struct which holds a sub-box of the voxel collision shape, and its shift from the center of the shape.
+
+
+
+

Functions

+
+
+ auto collisionsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void collisionsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__console-tool-plugin.html b/preview/pr-1379/group__console-tool-plugin.html new file mode 100644 index 0000000000..4368a8fcbe --- /dev/null +++ b/preview/pr-1379/group__console-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Console module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Console module

+

Displays the log messages in an ImGui window.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto consolePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void consolePlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-al.html b/preview/pr-1379/group__core-al.html new file mode 100644 index 0000000000..3d32140aa7 --- /dev/null +++ b/preview/pr-1379/group__core-al.html @@ -0,0 +1,177 @@ + + + + + Core » Audio module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Audio module

+

Provides audio functionality.

+ +
+

Files

+
+
file audio_context.hpp
+
Class cubos::core::al::AudioContext and related types.
+
+
+
+

Typedefs

+
+
+ using Buffer = std::shared_ptr<impl::Buffer> +
+
Handle to an audio buffer.
+
+ using Source = std::shared_ptr<impl::Source> +
+
Handle to an audio source.
+
+ using Listener = std::shared_ptr<impl::Listener> +
+
Handle to an audio listener.
+
+ using AudioDevice = std::shared_ptr<impl::AudioDevice> +
+
Handle to an audio device.
+
+
+
+

Typedef documentation

+
+

+ using Buffer = std::shared_ptr<impl::Buffer> + +

+

Handle to an audio buffer.

+ +
+
+

+ using Source = std::shared_ptr<impl::Source> + +

+

Handle to an audio source.

+ +
+
+

+ using Listener = std::shared_ptr<impl::Listener> + +

+

Handle to an audio listener.

+ +
+
+

+ using AudioDevice = std::shared_ptr<impl::AudioDevice> + +

+

Handle to an audio device.

+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-api.html b/preview/pr-1379/group__core-api.html new file mode 100644 index 0000000000..d905d2c4fb --- /dev/null +++ b/preview/pr-1379/group__core-api.html @@ -0,0 +1,120 @@ + + + + + Core API module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core API module

+

C API for the Cubos core library.

+ +

Macro used to export and import symbols from the library.

+
+

Files

+
+
file api.h
+
Macro CUBOS_CORE_C_API.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-data-des.html b/preview/pr-1379/group__core-data-des.html new file mode 100644 index 0000000000..ac3095ab78 --- /dev/null +++ b/preview/pr-1379/group__core-data-des.html @@ -0,0 +1,139 @@ + + + + + Core » Data » Deserialization module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Data » + Deserialization module

+

Provides deserialization utilities.

+ +
+

Files

+
+
file binary.hpp
+
Class cubos::core::data::BinaryDeserializer.
+
file deserializer.hpp
+
Class cubos::core::data::Deserializer.
+
file json.hpp
+
Class cubos::core::data::JSONDeserializer.
+
+
+
+

Classes

+
+
+ class cubos::core::data::Deserializer +
+
Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.
+
+ class cubos::core::data::JSONDeserializer +
+
Deserializer implementation which allows reading data from a JSON object.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-data-fs.html b/preview/pr-1379/group__core-data-fs.html new file mode 100644 index 0000000000..d7c98ffefe --- /dev/null +++ b/preview/pr-1379/group__core-data-fs.html @@ -0,0 +1,162 @@ + + + + + Core » Data » Filesystem module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Data » + Filesystem module

+

Provides filesystem utilities.

+ +
+

Files

+
+
file archive.hpp
+
Class cubos::core::data::Archive.
+
file embedded_archive.hpp
+
Class cubos::core::data::EmbeddedArchive.
+
file file.hpp
+
Class cubos::core::data::File.
+
file file_stream.hpp
+
Class cubos::core::data::FileStream.
+
file file_system.hpp
+
Class cubos::core::data::FileSystem.
+
file standard_archive.hpp
+
Class cubos::core::data::StandardArchive.
+
+
+
+

Classes

+
+
+ class cubos::core::data::Archive +
+
Interface for a bridge between the Cubos virtual file system and the real world.
+
+ class cubos::core::data::EmbeddedArchive +
+
Archive implementation which reads data embedded in the application. Meant to be used with the quadrados embed tool.
+
+ class cubos::core::data::File +
+
Represents a file in the virtual file system of the engine.
+
+
template<typename T>
+ class cubos::core::data::FileStream +
+
Wrapper around an implementation-specific file stream which keeps the file alive and does some sanity checks.
+
+ class cubos::core::data::FileSystem +
+
Singleton which represents the virtual file system of the engine.
+
+ class cubos::core::data::StandardArchive +
+
Archive implementation which reads and writes from/into the OS file system using the standard library.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-data-ser.html b/preview/pr-1379/group__core-data-ser.html new file mode 100644 index 0000000000..981c992fa6 --- /dev/null +++ b/preview/pr-1379/group__core-data-ser.html @@ -0,0 +1,141 @@ + + + + + Core » Data » Serialization module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Data » + Serialization module

+

Provides serialization utilities.

+ +
+

Files

+
+
file binary.hpp
+
Class cubos::core::data::BinarySerializer.
+
file debug.hpp
+
Class cubos::core::data::DebugSerializer.
+
file json.hpp
+
Class cubos::core::data::JSONSerializer.
+
file serializer.hpp
+
Class cubos::core::data::Serializer.
+
+
+
+

Classes

+
+
+ class cubos::core::data::DebugSerializer +
+
Serializer implementation which prints the given data to a stream in a human-readable format not meant to be parsed.
+
+ class cubos::core::data::Serializer +
+
Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-data.html b/preview/pr-1379/group__core-data.html new file mode 100644 index 0000000000..5a78008079 --- /dev/null +++ b/preview/pr-1379/group__core-data.html @@ -0,0 +1,124 @@ + + + + + Core » Data module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Data module

+

Provides filesystem and serialization utilities.

+ +
+

Modules

+
+
module Deserialization
+
Provides deserialization utilities.
+
module Filesystem
+
Provides filesystem utilities.
+
module Serialization
+
Provides serialization utilities.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-entity.html b/preview/pr-1379/group__core-ecs-entity.html new file mode 100644 index 0000000000..13d834a423 --- /dev/null +++ b/preview/pr-1379/group__core-ecs-entity.html @@ -0,0 +1,155 @@ + + + + + Core » ECS » Entity module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + Entity module

+

Entity part of the ECS.

+ +
+

Files

+
+
file archetype_graph.hpp
+
Class cubos::core::ecs::ArchetypeGraph.
+
file archetype_id.hpp
+
Struct cubos::core::ecs::ArchetypeId.
+
file entity.hpp
+
Struct cubos::core::ecs::Entity.
+
file hash.hpp
+
Struct cubos::core::ecs::EntityHash.
+
file pool.hpp
+
Class cubos::core::ecs::EntityPool.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::ArchetypeGraph +
+
Stores which column types each archetype holds and the edges which connect them.
+
+ struct cubos::core::ecs::ArchetypeId +
+
Identifies an archetype.
+
+ struct cubos::core::ecs::Entity +
+
Identifies an entity.
+
+ struct cubos::core::ecs::EntityHash +
+
Used to hash Entity objects.
+
+ class cubos::core::ecs::EntityPool +
+
Manages the creation and destruction of entity identifiers, as well as storing their archetype identifiers.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-observer.html b/preview/pr-1379/group__core-ecs-observer.html new file mode 100644 index 0000000000..cba45b71cb --- /dev/null +++ b/preview/pr-1379/group__core-ecs-observer.html @@ -0,0 +1,137 @@ + + + + + Core » ECS » Observer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + Observer module

+

Observer part of the ECS.

+ +
+

Files

+
+
file id.hpp
+
Struct cubos::core::ecs::ObserverId.
+
file observers.hpp
+
Class cubos::core::ecs::Observers.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::ObserverId +
+
Identifies an observer.
+
+ class cubos::core::ecs::Observers +
+
Stores and manages all of the observers associated with a world.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-query.html b/preview/pr-1379/group__core-ecs-query.html new file mode 100644 index 0000000000..bc1f132a76 --- /dev/null +++ b/preview/pr-1379/group__core-ecs-query.html @@ -0,0 +1,157 @@ + + + + + Core » ECS » Query module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + Query module

+

Defines the query functionality of the ECS.

+ +
+

Files

+
+
file data.hpp
+
Class cubos::core::ecs::QueryData.
+
file fetcher.hpp
+
Class cubos::core::ecs::QueryFetcher.
+
file filter.hpp
+
Class cubos::core::ecs::QueryFilter.
+
file archetype.hpp
+
Class cubos::core::ecs::QueryArchetypeNode.
+
file node.hpp
+
Class cubos::core::ecs::QueryNode.
+
file related.hpp
+
Class cubos::core::ecs::QueryRelatedNode.
+
file term.hpp
+
Struct cubos::core::ecs::QueryTerm.
+
+
+
+

Classes

+
+
+
template<typename... Ts>
+ class cubos::core::ecs::QueryData +
+
Holds the data necessary to execute a query.
+
+
template<typename T>
+ class cubos::core::ecs::QueryFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the tables.
+
+ class cubos::core::ecs::QueryFilter +
+
Used to find matches for the given query terms. Essentially contains the non-templated part of the query logic.
+
+ struct cubos::core::ecs::QueryTerm +
+
Describes a term in a query.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-system-arguments.html b/preview/pr-1379/group__core-ecs-system-arguments.html new file mode 100644 index 0000000000..726dd9cad0 --- /dev/null +++ b/preview/pr-1379/group__core-ecs-system-arguments.html @@ -0,0 +1,170 @@ + + + + + Core » ECS » System » Arguments module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + System » + Arguments module

+

Contains types and fetcher specializations for system argument types.

+ +
+

Files

+
+
file commands.hpp
+
Class cubos::core::ecs::Commands.
+
file pipe.hpp
+
Resource cubos::core::ecs::EventPipe.
+
file reader.hpp
+
Class cubos::core::ecs::EventReader.
+
file writer.hpp
+
Class cubos::core::ecs::EventWriter.
+
file plugins.hpp
+
Class cubos::core::ecs::Plugins.
+
file query.hpp
+
Class cubos::core::ecs::Query.
+
file resources.hpp
+
Resource system argument specializations.
+
file world.hpp
+
World system argument specializations.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Commands +
+
System argument used to write ECS commands and execute them at a later time.
+
+
template<typename T>
+ class cubos::core::ecs::EventPipe +
+
Resource which stores events of type T.
+
+
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ class cubos::core::ecs::EventReader +
+
System arguments used to read events of type T.
+
+
template<typename T>
+ class cubos::core::ecs::EventWriter +
+
System argument which allows the system to send events of type T to other systems.
+
+ class cubos::core::ecs::Plugins +
+
System argument used to add or remove Cubos plugins at runtime.
+
+
template<typename... Ts>
+ class cubos::core::ecs::Query +
+
System argument which holds the result of a query over all entities in world which match the given arguments.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-system.html b/preview/pr-1379/group__core-ecs-system.html new file mode 100644 index 0000000000..cb23b912eb --- /dev/null +++ b/preview/pr-1379/group__core-ecs-system.html @@ -0,0 +1,181 @@ + + + + + Core » ECS » System module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + System module

+

System part of the ECS.

+ +
+

Modules

+
+
module Arguments
+
Contains types and fetcher specializations for system argument types.
+
+
+
+

Files

+
+
file access.hpp
+
Struct cubos::core::ecs::SystemAccess.
+
file fetcher.hpp
+
Class cubos::core::ecs::SystemFetcher.
+
file options.hpp
+
Struct cubos::core::ecs::SystemOptions.
+
file planner.hpp
+
Class cubos::core::ecs::Planner.
+
file registry.hpp
+
Class cubos::core::ecs::SystemRegistry.
+
file schedule.hpp
+
Class cubos::core::ecs::Schedule.
+
file system.hpp
+
Class cubos::core::ecs::System.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SystemAccess +
+
Describes the types of data a system accesses.
+
+
template<typename T>
+ class cubos::core::ecs::SystemFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the world.
+
+ struct cubos::core::ecs::SystemOptions +
+
Contains extra options for a specific system argument.
+
+ struct cubos::core::ecs::SystemId +
+
Identifies a system.
+
+ struct cubos::core::ecs::ConditionId +
+
Identifies a condition.
+
+ class cubos::core::ecs::SystemRegistry +
+
Stores known systems and conditions.
+
+ class cubos::core::ecs::Schedule +
+
Stores schedule nodes and the restrictions that must be met for them to run.
+
+
template<typename T>
+ class cubos::core::ecs::System +
+
Holds a system with a return type T.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs-table.html b/preview/pr-1379/group__core-ecs-table.html new file mode 100644 index 0000000000..57c4c10172 --- /dev/null +++ b/preview/pr-1379/group__core-ecs-table.html @@ -0,0 +1,165 @@ + + + + + Core » ECS » Table module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS » + Table module

+

Contains various table-like data structures which storage data associated to entities.

+ +
+

Files

+
+
file column.hpp
+
Struct cubos::core::ecs::DenseTableId.
+
file registry.hpp
+
Class cubos::core::ecs::DenseTableRegistry.
+
file table.hpp
+
Class cubos::core::ecs::DenseTable.
+
file id.hpp
+
Struct cubos::core::ecs::SparseRelationTableId.
+
file registry.hpp
+
Class cubos::core::ecs::SparseRelationTableRegistry.
+
file tables.hpp
+
Class cubos::core::ecs::Tables.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::ColumnId +
+
Identifies a data column type.
+
+ struct cubos::core::ecs::ColumnIdHash +
+
Used to hash ColumnId objects.
+
+ class cubos::core::ecs::DenseTableRegistry +
+
Stores the dense tables of a given world.
+
+ class cubos::core::ecs::DenseTable +
+
Stores the dense data associated to entities of a given archetype.
+
+ struct cubos::core::ecs::SparseRelationTableId +
+
Identifies a sparse relation table.
+
+ class cubos::core::ecs::SparseRelationTableRegistry +
+
Stores all of the sparse relation tables.
+
+ class cubos::core::ecs::Tables +
+
Stores the tables of a given world.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-ecs.html b/preview/pr-1379/group__core-ecs.html new file mode 100644 index 0000000000..67f7fdda16 --- /dev/null +++ b/preview/pr-1379/group__core-ecs.html @@ -0,0 +1,295 @@ + + + + + Core » ECS module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + ECS module

+

Entity Component System library.

+ +

This module is arguably the heart of the engine, as it provides a means to organize and manage the data and logic of both the engine and games built with it. It is, as of now, a bit of a mess. Most of the exposed types are internal to the documentation, and thus it can get hard to navigate (TODO #377).

System argument types

  • const R& - used to read resource data of type R.
  • R& - used to write resource data of type R.
  • const World& - used to read the world directly (not recommended, ruins parallelism, prefer Commands).
  • World& - used to write the world directly (not recommended, ruins parallelism, prefer Commands).
  • Commands - used to queue entities to be created, destroyed and other operations.
  • EventReader<E> - reads events of type E sent from other systems.
  • EventWriter<E> - sends events of type E to other systems.
  • Query<Args...> - queries the world for entities which match its arguments.
  • Plugins - used to add and remove plugins dynamically.

Query argument types

  • const C& - matches entities with the component C, read-only access.
  • C& - matches entities with the component C, write access.
  • Opt<const C&>" - matches all entities, read-only access when the component C is present. -Opt<C&>` - matches all entities, write access when the component C is present.
+
+

Modules

+
+
module Entity
+
Entity part of the ECS.
+
module Observer
+
Observer part of the ECS.
+
module Query
+
Defines the query functionality of the ECS.
+
module System
+
System part of the ECS.
+
module Table
+
Contains various table-like data structures which storage data associated to entities.
+
+
+
+

Files

+
+
file blueprint.hpp
+
Class cubos::core::ecs::Blueprint.
+
file command_buffer.hpp
+
Class cubos::core::ecs::CommandBuffer.
+
file cubos.hpp
+
Class cubos::core::ecs::Cubos.
+
file dynamic.hpp
+
Class cubos::core::ecs::DynamicPlugin.
+
file name.hpp
+
Class cubos::core::ecs::Name.
+
file plugin_queue.hpp
+
Class cubos::core::ecs::PluginQueue.
+
file reflection.hpp
+
Class cubos::core::ecs::TypeBuilder.
+
file tag.hpp
+
Class cubos::core::ecs::Tag.
+
file types.hpp
+
Class cubos::core::ecs::Types.
+
file world.hpp
+
Class cubos::core::ecs::World.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Blueprint +
+
Collection of entities and their respective components and relations.
+
+ class cubos::core::ecs::CommandBuffer +
+
Stores commands to execute them later.
+
+ struct cubos::core::ecs::DeltaTime +
+
Resource which stores the time since the last iteration of the main loop started.
+
+ struct cubos::core::ecs::ShouldQuit +
+
Resource used as a flag to indicate whether the main loop should stop running.
+
+ struct cubos::core::ecs::Arguments +
+
Resource which stores the command-line arguments.
+
+ class cubos::core::ecs::Cubos +
+
Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.
+
+ class cubos::core::ecs::DynamicPlugin +
+
Manages the loading and unloading of a plugin from a shared library.
+
+ struct cubos::core::ecs::Name +
+
Component which stores the name of an entity.
+
+ struct cubos::core::ecs::PluginQueue +
+
Stores plugin operations to be executed later.
+
+ struct cubos::core::ecs::SymmetricTrait +
+
Trait used to identify symmetric relations.
+
+ struct cubos::core::ecs::TreeTrait +
+
Trait used to identify tree relations.
+
+ struct cubos::core::ecs::EphemeralTrait +
+
Trait used to identify types which are ephemeral and should not be persisted.
+
+
template<typename T>
+ class cubos::core::ecs::TypeBuilder +
+
Builder for reflection::Type objects which represent ECS types.
+
+ struct cubos::core::ecs::DataTypeId +
+
Identifies a data type registered in the world.
+
+ struct cubos::core::ecs::DataTypeIdHash +
+
Hash functor for DataTypeId.
+
+ class cubos::core::ecs::Types +
+
Registry of all data types used in an ECS world.
+
+ class cubos::core::ecs::World +
+
Holds entities, their components and resources.
+
+
+
+

Typedefs

+
+
+ using Plugin = void(*)(Cubos&) +
+
Function pointer type representing a plugin.
+
+
+
+

Functions

+
+
+ auto convertEntities(const std::unordered_map<Entity, Entity, EntityHash>& map, + const reflection::Type& type, + void* value) -> CUBOS_CORE_API void +
+
Converts entities in a value to their respective new entities. If an entity is not found in the map, it is left unchanged.
+
+
+
+

Typedef documentation

+
+

+ using Plugin = void(*)(Cubos&) + +

+

Function pointer type representing a plugin.

+
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API void convertEntities(const std::unordered_map<Entity, Entity, EntityHash>& map, + const reflection::Type& type, + void* value) + +

+

Converts entities in a value to their respective new entities. If an entity is not found in the map, it is left unchanged.

+ + + + + + + + + + + + + + + + + + +
Parameters
mapMap of old entities to new entities.
typeValue type.
valueValue.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-geom.html b/preview/pr-1379/group__core-geom.html new file mode 100644 index 0000000000..755be37adb --- /dev/null +++ b/preview/pr-1379/group__core-geom.html @@ -0,0 +1,156 @@ + + + + + Core » Geometry module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Geometry module

+

Provides geometry utilities.

+ +
+

Files

+
+
file aabb.hpp
+
Component cubos::core::geom::AABB.
+
file box.hpp
+
Class cubos::core::geom::Box.
+
file capsule.hpp
+
Class cubos::core::geom::Capsule.
+
file intersections.hpp
+
Class cubos::core::geom::Intersections.
+
file plane.hpp
+
Class cubos::core::geom::Plane.
+
file utils.hpp
+
Class cubos::core::geom::Utils.
+
+
+
+

Classes

+
+
+ struct cubos::core::geom::AABB +
+
Represents an axis-aligned bounding box.
+
+ struct cubos::core::geom::Box +
+
Represents a box shape.
+
+ struct cubos::core::geom::Capsule +
+
Represents a capsule or sphere shape.
+
+ struct cubos::core::geom::Intersection +
+
Contains info regarding an intersection between shapes.
+
+ struct cubos::core::geom::Plane +
+
Represents a plane. Assumes equation: normal.x + normal.y + normal.z + d = 0.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-gl.html b/preview/pr-1379/group__core-gl.html new file mode 100644 index 0000000000..91c69a1712 --- /dev/null +++ b/preview/pr-1379/group__core-gl.html @@ -0,0 +1,1279 @@ + + + + + Core » Graphics module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Graphics module

+

Provides a graphics API abstraction.

+ +
+

Files

+
+
file render_device.hpp
+
Class cubos::core::gl::RenderDevice and related types.
+
file util.hpp
+
Function cubos::core::gl::generateScreenQuad.
+
+
+
+

Classes

+
+
+ struct cubos::core::gl::FramebufferDesc +
+
Describes a framebuffer.
+
+ struct cubos::core::gl::RasterStateDesc +
+
Decribes a rasterizer state.
+
+ struct cubos::core::gl::DepthStencilStateDesc +
+
Describes a depth stencil state.
+
+ struct cubos::core::gl::BlendStateDesc +
+
Describes a blend state.
+
+ struct cubos::core::gl::SamplerDesc +
+
Describes a sampler.
+
+ struct cubos::core::gl::Texture1DDesc +
+
Describes a 1D texture.
+
+ struct cubos::core::gl::Texture2DDesc +
+
Describes a 2D texture.
+
+ struct cubos::core::gl::Texture2DArrayDesc +
+
Describes a 2D texture array.
+
+ struct cubos::core::gl::Texture3DDesc +
+
Describes a 3D texture.
+
+ struct cubos::core::gl::CubeMapDesc +
+
Describes a cube map.
+
+ struct cubos::core::gl::CubeMapArrayDesc +
+
Describes a cube map array.
+
+ struct cubos::core::gl::ConstantBufferElement +
+
Describes an element in a constant buffer.
+
+ struct cubos::core::gl::ConstantBufferStructure +
+
Describes the structure of a constant buffer.
+
+ struct cubos::core::gl::VertexElement +
+
Describes a vertex element.
+
+ struct cubos::core::gl::VertexArrayDesc +
+
Describes a vertex array.
+
+ class cubos::core::gl::RenderDevice +
+
Interface used to wrap low-level rendering APIs such as OpenGL.
+
+
+
+

Enums

+
+
+ enum class Property { MaxAnisotropy, + ComputeSupported } +
+
Render device properties that can be queried at runtime.
+
+ enum class Usage { Default, + Dynamic, + Static } +
+
Usage mode for buffers and textures.
+
+ enum class Type { Byte, + Short, + Int, + UByte, + UShort, + UInt, + NByte, + NShort, + NUByte, + NUShort, + Float } +
+
Data type.
+
+ enum class IndexFormat { UShort, + UInt } +
+
Index format.
+
+ enum class TextureFormat { R8SNorm, + R16SNorm, + RG8SNorm, + RG16SNorm, + RGBA8SNorm, + RGBA16SNorm, + R8UNorm, + R16UNorm, + RG8UNorm, + RG16UNorm, + RGBA8UNorm, + RGBA16UNorm, + R8SInt, + R16SInt, + RG8SInt, + RG16SInt, + RGBA8SInt, + RGBA16SInt, + R8UInt, + R16UInt, + RG8UInt, + RG16UInt, + RGBA8UInt, + RGBA16UInt, + R16Float, + R32Float, + RG16Float, + RG32Float, + RGB16Float, + RGB32Float, + RGBA16Float, + RGBA32Float, + Depth16, + Depth32, + Depth24Stencil8, + Depth32Stencil8 } +
+
Texture format.
+
+ enum class AddressMode { Repeat, + Mirror, + Clamp, + Border } +
+
Texture address mode.
+
+ enum class TextureFilter { None, + Nearest, + Linear } +
+
Texture filter type.
+
+ enum class Winding { CW, + CCW } +
+
Triangle winding mode.
+
+ enum class Face { Front, + Back, + FrontAndBack } +
+
Specifies a face.
+
+ enum class RasterMode { Wireframe, + Fill } +
+
Rasterizer mode.
+
+ enum class Compare { Never, + Less, + LEqual, + Greater, + GEqual, + Equal, + NEqual, + Always } +
+
Comparison function.
+
+ enum class StencilAction { Zero, + Keep, + Replace, + Increment, + IncrementWrap, + Decrement, + DecrementWrap, + Invert } +
+
Stencil action.
+
+ enum class BlendFactor { Zero, + One, + SrcColor, + InvSrcColor, + DstColor, + InvDstColor, + SrcAlpha, + InvSrcAlpha, + DstAlpha, + InvDstAlpha } +
+
Blend factor.
+
+ enum class BlendOp { Add, + Substract, + RevSubstract, + Min, + Max } +
+
Blend operation.
+
+ enum class Stage { Vertex, + Geometry, + Pixel, + Compute } +
+
Shader stage type.
+
+ enum class CubeFace { PositiveX = 0, + NegativeX = 1, + PositiveY = 2, + NegativeY = 3, + PositiveZ = 4, + NegativeZ = 5 } +
+
Cube map face.
+
+ enum class MemoryBarriers { None = 0, + VertexBuffer = 1, + IndexBuffer = 2, + ConstantBuffer = 4, + ImageAccess = 8, + TextureAccess = 16, + Framebuffer = 32, + All = VertexBuffer | IndexBuffer | ConstantBuffer | ImageAccess | TextureAccess | Framebuffer } +
+
Memory barrier flags for synchronization.
+
+ enum class Access { Read, + Write, + ReadWrite } +
+
Access mode for a resource.
+
+
+
+

Typedefs

+
+
+ using Framebuffer = std::shared_ptr<impl::Framebuffer> +
+
Handle to a framebuffer.
+
+ using RasterState = std::shared_ptr<impl::RasterState> +
+
Handle to a rasterizer state.
+
+ using DepthStencilState = std::shared_ptr<impl::DepthStencilState> +
+
Handle to a depth stencil state.
+
+ using BlendState = std::shared_ptr<impl::BlendState> +
+
Handle to a blend state.
+
+ using PixelPackBuffer = std::shared_ptr<impl::PixelPackBuffer> +
+
Handle to a pixel pack buffer.
+
+ using Sampler = std::shared_ptr<impl::Sampler> +
+
Handle to a sampler.
+
+ using Texture1D = std::shared_ptr<impl::Texture1D> +
+
Handle to a 1D texture.
+
+ using Texture2D = std::shared_ptr<impl::Texture2D> +
+
Handle to a 2D texture.
+
+ using Texture2DArray = std::shared_ptr<impl::Texture2DArray> +
+
Handle to a 2D texture array.
+
+ using Texture3D = std::shared_ptr<impl::Texture3D> +
+
Handle to a 3D texture.
+
+ using CubeMap = std::shared_ptr<impl::CubeMap> +
+
Handle to a cube map.
+
+ using CubeMapArray = std::shared_ptr<impl::CubeMapArray> +
+
Handle to a cube map array.
+
+ using ConstantBuffer = std::shared_ptr<impl::ConstantBuffer> +
+
Handle to a constant buffer.
+
+ using IndexBuffer = std::shared_ptr<impl::IndexBuffer> +
+
Handle to an index buffer.
+
+ using VertexBuffer = std::shared_ptr<impl::VertexBuffer> +
+
Handle to a vertex buffer.
+
+ using VertexArray = std::shared_ptr<impl::VertexArray> +
+
Handle to a vertex array.
+
+ using ShaderStage = std::shared_ptr<impl::ShaderStage> +
+
Handle to a shader stage.
+
+ using ShaderPipeline = std::shared_ptr<impl::ShaderPipeline> +
+
Handle to a shader pipeline.
+
+ using ShaderBindingPoint = impl::ShaderBindingPoint* +
+
Handle to a shader binding point.
+
+ using Timer = std::shared_ptr<impl::Timer> +
+
Handle to a timer.
+
+ using PipelinedTimer = std::shared_ptr<impl::PipelinedTimer> +
+
Handle to a pipelined timer.
+
+
+
+

Defines

+
+
+ #define CUBOS_CORE_GL_MAX_FRAMEBUFFER_RENDER_TARGET_COUNT +
+
Maximum number of render targets that can be set on a framebuffer.
+
+ #define CUBOS_CORE_GL_MAX_TEXTURE_2D_ARRAY_SIZE +
+
Maximum number of textures on a 2D texture array.
+
+ #define CUBOS_CORE_GL_MAX_CUBEMAP_ARRAY_SIZE +
+
Maximum number of cube maps on a cubemap array.
+
+ #define CUBOS_CORE_GL_MAX_MIP_LEVEL_COUNT +
+
Maximum mip level count.
+
+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_NAME_SIZE +
+
Maximum constant buffer element name size.
+
+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_COUNT +
+
Maximum constant buffer element count.
+
+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_ELEMENT_COUNT +
+
Maximum number of vertex array elements.
+
+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_BUFFER_COUNT +
+
Maximum number of buffers on a vertex array.
+
+
+
+

Enum documentation

+
+

+ enum class Property + +

+

Render device properties that can be queried at runtime.

+ + + + + + + + + + + + + +
Enumerators
MaxAnisotropy +

Specifies the upper bound of anisotropic filtering.

+
ComputeSupported +

Specifies whether compute shaders and memory barriers are supported (0 or 1).

+
+
+
+

+ enum class Usage + +

+

Usage mode for buffers and textures.

+
+
+

+ enum class Type + +

+

Data type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Byte +

8 bits signed integer.

+
Short +

16 bits signed integer.

+
Int +

32 bits signed integer.

+
UByte +

8 bits unsigned integer.

+
UShort +

16 bits unsigned integer.

+
UInt +

32 bits unsigned integer.

+
NByte +

Normalized 8 bits signed integer.

+
NShort +

Normalized 16 bits signed integer.

+
NUByte +

Normalized 8 bits unsigned integer.

+
NUShort +

Normalized 16 bits unsigned integer.

+
Float +

32 bits floating point.

+
+
+
+

+ enum class IndexFormat + +

+

Index format.

+ + + + + + + + + + + + +
Enumerators
UShort +

16 bits unsigned integer.

+
UInt +

32 bits unsigned integer.

+
+
+
+

+ enum class TextureFormat + +

+

Texture format.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
R8SNorm +

1 channel 8 bits normalized signed integer.

+
R16SNorm +

1 channel 16 bits normalized signed integer.

+
RG8SNorm +

2 channel 8 bits normalized signed integer.

+
RG16SNorm +

2 channel 16 bits normalized signed integer.

+
RGBA8SNorm +

4 channel 8 bits normalized signed integer.

+
RGBA16SNorm +

4 channel 16 bits normalized signed integer.

+
R8UNorm +

1 channel 8 bits normalized unsigned integer.

+
R16UNorm +

1 channel 16 bits normalized unsigned integer.

+
RG8UNorm +

2 channel 8 bits normalized unsigned integer.

+
RG16UNorm +

2 channel 16 bits normalized unsigned integer.

+
RGBA8UNorm +

4 channel 8 bits normalized unsigned integer.

+
RGBA16UNorm +

4 channel 16 bits normalized unsigned integer.

+
R8SInt +

1 channel 8 bits signed integer.

+
R16SInt +

1 channel 16 bits signed integer.

+
RG8SInt +

2 channel 8 bits signed integer.

+
RG16SInt +

2 channel 16 bits signed integer.

+
RGBA8SInt +

4 channel 8 bits signed integer.

+
RGBA16SInt +

4 channel 16 bits signed integer.

+
R8UInt +

1 channel 8 bits unsigned integer.

+
R16UInt +

1 channel 16 bits unsigned integer.

+
RG8UInt +

2 channel 8 bits unsigned integer.

+
RG16UInt +

2 channel 16 bits unsigned integer.

+
RGBA8UInt +

4 channel 8 bits unsigned integer.

+
RGBA16UInt +

4 channel 16 bits unsigned integer.

+
R16Float +

1 channel 16 bits floating point.

+
R32Float +

1 channel 32 bits floating point.

+
RG16Float +

2 channel 16 bits floating point.

+
RG32Float +

2 channel 32 bits floating point.

+
RGB16Float +

3 channel 16 bits floating point.

+
RGB32Float +

3 channel 32 bits floating point.

+
RGBA16Float +

4 channel 16 bits floating point.

+
RGBA32Float +

4 channel 32 bits floating point.

+
Depth16 +

16 depth bits.

+
Depth32 +

32 depth bits.

+
Depth24Stencil8 +

24 depth bits and 8 stencil bits.

+
Depth32Stencil8 +

32 depth bits and 8 stencil bits.

+
+
+
+

+ enum class AddressMode + +

+

Texture address mode.

+
+
+

+ enum class TextureFilter + +

+

Texture filter type.

+
+
+

+ enum class Winding + +

+

Triangle winding mode.

+ + + + + + + + + + + + +
Enumerators
CW +

Clockwise.

+
CCW +

Counterclockwise.

+
+
+
+

+ enum class Face + +

+

Specifies a face.

+
+
+

+ enum class RasterMode + +

+

Rasterizer mode.

+
+
+

+ enum class Compare + +

+

Comparison function.

+
+
+

+ enum class StencilAction + +

+

Stencil action.

+
+
+

+ enum class BlendFactor + +

+

Blend factor.

+
+
+

+ enum class BlendOp + +

+

Blend operation.

+
+
+

+ enum class Stage + +

+

Shader stage type.

+
+
+

+ enum class CubeFace + +

+

Cube map face.

+
+
+

+ enum class MemoryBarriers + +

+

Memory barrier flags for synchronization.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
None +

Utility flag to indicate that no memory barrier is set.

+
VertexBuffer +

If set, data sourced from vertex buffers after the barrier will reflect the data written by shaders prior to the barrier.

+
IndexBuffer +

If set, data sourced from index buffers after the barrier will reflect the data written by shaders prior to the barrier.

+
ConstantBuffer +

If set, data sourced from constant buffers after the barrier will reflect the data written by shaders prior to the barrier.

+
ImageAccess +

If set, memory accesses using shader image load, store, and atomic built-in functions issued after the barrier will reflect the data written by shaders prior to the barrier.

+
TextureAccess +

If set, texture accesses from shaders after the barrier will reflect the data written by shaders prior to the barrier.

+
Framebuffer +

If set, reads and writes via framebuffer objects after the barrier will reflect the data written by shaders prior to the barrier.

+
All +

Utility flag to set all memory barriers.

+
+
+
+

+ enum class Access + +

+

Access mode for a resource.

+ + + + + + + + + + + + + + + + +
Enumerators
Read +

Read access.

+
Write +

Write access.

+
ReadWrite +

Read and write access.

+
+
+
+
+

Typedef documentation

+
+

+ using Framebuffer = std::shared_ptr<impl::Framebuffer> + +

+

Handle to a framebuffer.

+ +
+
+

+ using RasterState = std::shared_ptr<impl::RasterState> + +

+

Handle to a rasterizer state.

+ +
+
+

+ using DepthStencilState = std::shared_ptr<impl::DepthStencilState> + +

+

Handle to a depth stencil state.

+ +
+
+

+ using BlendState = std::shared_ptr<impl::BlendState> + +

+

Handle to a blend state.

+ +
+
+

+ using PixelPackBuffer = std::shared_ptr<impl::PixelPackBuffer> + +

+

Handle to a pixel pack buffer.

+ +
+
+

+ using Sampler = std::shared_ptr<impl::Sampler> + +

+

Handle to a sampler.

+ +
+
+

+ using Texture1D = std::shared_ptr<impl::Texture1D> + +

+

Handle to a 1D texture.

+ +
+
+

+ using Texture2D = std::shared_ptr<impl::Texture2D> + +

+

Handle to a 2D texture.

+ +
+
+

+ using Texture2DArray = std::shared_ptr<impl::Texture2DArray> + +

+

Handle to a 2D texture array.

+ +
+
+

+ using Texture3D = std::shared_ptr<impl::Texture3D> + +

+

Handle to a 3D texture.

+ +
+
+

+ using CubeMap = std::shared_ptr<impl::CubeMap> + +

+

Handle to a cube map.

+ +
+
+

+ using CubeMapArray = std::shared_ptr<impl::CubeMapArray> + +

+

Handle to a cube map array.

+ +
+
+

+ using ConstantBuffer = std::shared_ptr<impl::ConstantBuffer> + +

+

Handle to a constant buffer.

+ +
+
+

+ using IndexBuffer = std::shared_ptr<impl::IndexBuffer> + +

+

Handle to an index buffer.

+ +
+
+

+ using VertexBuffer = std::shared_ptr<impl::VertexBuffer> + +

+

Handle to a vertex buffer.

+ +
+
+

+ using VertexArray = std::shared_ptr<impl::VertexArray> + +

+

Handle to a vertex array.

+ +
+
+

+ using ShaderStage = std::shared_ptr<impl::ShaderStage> + +

+

Handle to a shader stage.

+ +
+
+

+ using ShaderPipeline = std::shared_ptr<impl::ShaderPipeline> + +

+

Handle to a shader pipeline.

+ +
+
+

+ using ShaderBindingPoint = impl::ShaderBindingPoint* + +

+

Handle to a shader binding point.

+ +
+
+

+ using Timer = std::shared_ptr<impl::Timer> + +

+

Handle to a timer.

+ +
+
+

+ using PipelinedTimer = std::shared_ptr<impl::PipelinedTimer> + +

+

Handle to a pipelined timer.

+ +
+
+
+

Define documentation

+
+

+ #define CUBOS_CORE_GL_MAX_FRAMEBUFFER_RENDER_TARGET_COUNT + +

+

Maximum number of render targets that can be set on a framebuffer.

+
+
+

+ #define CUBOS_CORE_GL_MAX_TEXTURE_2D_ARRAY_SIZE + +

+

Maximum number of textures on a 2D texture array.

+
+
+

+ #define CUBOS_CORE_GL_MAX_CUBEMAP_ARRAY_SIZE + +

+

Maximum number of cube maps on a cubemap array.

+
+
+

+ #define CUBOS_CORE_GL_MAX_MIP_LEVEL_COUNT + +

+

Maximum mip level count.

+
+
+

+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_NAME_SIZE + +

+

Maximum constant buffer element name size.

+
+
+

+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_COUNT + +

+

Maximum constant buffer element count.

+
+
+

+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_ELEMENT_COUNT + +

+

Maximum number of vertex array elements.

+
+
+

+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_BUFFER_COUNT + +

+

Maximum number of buffers on a vertex array.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-io.html b/preview/pr-1379/group__core-io.html new file mode 100644 index 0000000000..fd22a47cf6 --- /dev/null +++ b/preview/pr-1379/group__core-io.html @@ -0,0 +1,705 @@ + + + + + Core » Input and output module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Input and output module

+

Provides a window API abstraction.

+ +
+

Files

+
+
file cursor.hpp
+
Class cubos::core::io::Cursor.
+
file gamepad.hpp
+
Struct cubos::core::io::GamepadState and related enums.
+
file keyboard.hpp
+
Enums cubos::core::io::Key and cubos::core::io::Modifiers.
+
file window.hpp
+
Class cubos::core::io::Window and related types.
+
+
+
+

Classes

+
+
+ class cubos::core::io::Cursor +
+
Handle for a custom mouse cursor.
+
+ struct cubos::core::io::GamepadState +
+
Holds the state of a gamepad.
+
+ struct cubos::core::io::KeyEvent +
+
Event sent when a key is pressed or released.
+
+ struct cubos::core::io::ModifiersEvent +
+
Event sent when the modifiers change.
+
+ struct cubos::core::io::MouseButtonEvent +
+
Event sent when a mouse button state changes.
+
+ struct cubos::core::io::MouseMoveEvent +
+
Event sent when the mouse cursor moves.
+
+ struct cubos::core::io::MouseScrollEvent +
+
Event sent when the mouse wheel is scrolled.
+
+ struct cubos::core::io::ResizeEvent +
+
Event sent when the window framebuffer is resized.
+
+ struct cubos::core::io::TextEvent +
+
Event sent when a unicode character is input.
+
+ struct cubos::core::io::GamepadConnectionEvent +
+
Event sent when a gamepad is connected or disconnected.
+
+ class cubos::core::io::BaseWindow +
+
Interface used to wrap low-level window API implementations.
+
+
+
+

Enums

+
+
+ enum class GamepadButton { Invalid = -1, + A, + B, + X, + Y, + LBumper, + RBumper, + Back, + Start, + Guide, + LThumb, + RThumb, + Up, + Right, + Down, + Left, + Count } +
+
Gamepad buttons.
+
+ enum class GamepadAxis { Invalid = -1, + LX, + LY, + RX, + RY, + LTrigger, + RTrigger, + Count } +
+
Gamepad axes.
+
+ enum class Key { Invalid = -1, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + Num0, + Num1, + Num2, + Num3, + Num4, + Num5, + Num6, + Num7, + Num8, + Num9, + Escape, + LControl, + LShift, + LAlt, + LSystem, + RControl, + RShift, + RAlt, + RSystem, + Menu, + LBracket, + RBracket, + SemiColon, + Comma, + Period, + Quote, + Slash, + BackSlash, + Tilde, + Equal, + Dash, + Space, + Return, + BackSpace, + Tab, + PageUp, + PageDown, + End, + Home, + Insert, + Delete, + Add, + Subtract, + Multiply, + Divide, + Left, + Right, + Up, + Down, + Numpad0, + Numpad1, + Numpad2, + Numpad3, + Numpad4, + Numpad5, + Numpad6, + Numpad7, + Numpad8, + Numpad9, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Pause, + Count } +
+
Keyboard key codes enum.
+
+ enum class Modifiers { None = 0, + Control = 1, + Shift = 2, + Alt = 4, + System = 8 } +
+
Keyboard modifier flags enum.
+
+ enum class MouseButton { Invalid = -1, + Left, + Right, + Middle, + Extra1, + Extra2 } +
+
Mouse buttons enum.
+
+ enum class MouseAxis { X, + Y, + Scroll } +
+
Mouse axes enums.
+
+ enum class MouseState { Default, + Locked, + Hidden } +
+
Possible mouse states.
+
+
+
+

Typedefs

+
+
+ using WindowEvent = std::variant<KeyEvent, ModifiersEvent, MouseButtonEvent, MouseMoveEvent, MouseScrollEvent, ResizeEvent, TextEvent, GamepadConnectionEvent> +
+
Variant that can hold any of the window events.
+
+ using Window = std::shared_ptr<BaseWindow> +
+
Handle to a window.
+
+
+
+

Functions

+
+
+ auto gamepadButtonToString(GamepadButton button) -> CUBOS_CORE_API std::string +
+
Converts a GamepadButton enum to a string.
+
+ auto stringToGamepadButton(const std::string& str) -> CUBOS_CORE_API GamepadButton +
+
Converts a string to a GamepadButton.
+
+ auto gamepadAxisToString(GamepadAxis axis) -> CUBOS_CORE_API std::string +
+
Convert a GamepadAxis to a string.
+
+ auto stringToGamepadAxis(const std::string& str) -> CUBOS_CORE_API GamepadAxis +
+
Convert a string to a GamepadAxis.
+
+ auto openWindow(const std::string& title = "Cubos", + const glm::ivec2& size = {800, 600}, + bool vSync = true) -> CUBOS_CORE_API Window +
+
Opens a new window.
+
+ auto mouseButtonToString(MouseButton button) -> CUBOS_CORE_API std::string +
+
Converts a MouseButton enum to a string.
+
+ auto stringToMouseButton(const std::string& str) -> CUBOS_CORE_API MouseButton +
+
Convert a string to a MouseButton enum.
+
+
+
+

Enum documentation

+
+

+ enum class GamepadButton + +

+

Gamepad buttons.

+
+
+

+ enum class GamepadAxis + +

+

Gamepad axes.

+
+
+

+ enum class Key + +

+

Keyboard key codes enum.

+
+
+

+ enum class Modifiers + +

+

Keyboard modifier flags enum.

+
+
+

+ enum class MouseButton + +

+

Mouse buttons enum.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Invalid +

Used for unknown mouse buttons.

+
Left +
Right +
Middle +
Extra1 +
Extra2 +
+
+
+

+ enum class MouseAxis + +

+

Mouse axes enums.

+
+
+

+ enum class MouseState + +

+

Possible mouse states.

+ + + + + + + + + + + + + + + + +
Enumerators
Default +

Default mouse state, mouse will function as is specified by the OS.

+
Locked +

Mouse cursor will be hidden and locked to the center of the window, useful for control schemes that require infinite mouse movement.

+
Hidden +

Mouse cursor will be hidden when over the window, otherwise functioning in the same way as MouseState::Default.

+
+
+
+
+

Typedef documentation

+
+

+ using WindowEvent = std::variant<KeyEvent, ModifiersEvent, MouseButtonEvent, MouseMoveEvent, MouseScrollEvent, ResizeEvent, TextEvent, GamepadConnectionEvent> + +

+

Variant that can hold any of the window events.

+
+
+

+ using Window = std::shared_ptr<BaseWindow> + +

+

Handle to a window.

+ +
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API std::string gamepadButtonToString(GamepadButton button) + +

+

Converts a GamepadButton enum to a string.

+ + + + + + + + + + + + + + + + +
Parameters
buttonButton to convert.
ReturnsString representation.
+
+
+

+ CUBOS_CORE_API GamepadButton stringToGamepadButton(const std::string& str) + +

+

Converts a string to a GamepadButton.

+ + + + + + + + + + + + + + + + +
Parameters
strString to convert.
ReturnsButton.
+
+
+

+ CUBOS_CORE_API std::string gamepadAxisToString(GamepadAxis axis) + +

+

Convert a GamepadAxis to a string.

+ + + + + + + + + + + + + + + + +
Parameters
axisAxis to convert.
ReturnsString representation.
+
+
+

+ CUBOS_CORE_API GamepadAxis stringToGamepadAxis(const std::string& str) + +

+

Convert a string to a GamepadAxis.

+ + + + + + + + + + + + + + + + +
Parameters
strString to convert.
ReturnsAxis.
+
+
+

+ CUBOS_CORE_API Window openWindow(const std::string& title = "Cubos", + const glm::ivec2& size = {800, 600}, + bool vSync = true) + +

+

Opens a new window.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
titleWindow title.
sizeWindow size, in screen coordinates.
vSyncWhether to enable vertical synchronization.
ReturnsNew window, or nullptr on failure.
+
+
+

+ CUBOS_CORE_API std::string mouseButtonToString(MouseButton button) + +

+

Converts a MouseButton enum to a string.

+ + + + + + + + + + + + + + + + +
Parameters
buttonMouseButton to convert.
ReturnsString representation.
+
+
+

+ CUBOS_CORE_API MouseButton stringToMouseButton(const std::string& str) + +

+

Convert a string to a MouseButton enum.

+ + + + + + + + + + + + + + + + +
Parameters
strThe string to convert.
ReturnsMouseButton.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-memory.html b/preview/pr-1379/group__core-memory.html new file mode 100644 index 0000000000..0ff8d4acd6 --- /dev/null +++ b/preview/pr-1379/group__core-memory.html @@ -0,0 +1,537 @@ + + + + + Core » Memory module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Memory module

+

Provides a stream library and memory utilities.

+ +
+

Files

+
+
file any_value.hpp
+
Class cubos::core::memory::AnyValue.
+
file any_vector.hpp
+
Class cubos::core::memory::AnyVector.
+
file buffer_stream.hpp
+
Class cubos::core::memory::BufferStream.
+
file endianness.hpp
+
Endianness utility functions.
+
file function.hpp
+
Class cubos::core::memory::Function.
+
file guards.hpp
+
Classes cubos::core::memory::ReadGuard and cubos::core::memory::WriteGuard.
+
file move.hpp
+
Functions cubos::core::memory::move and cubos::core::memory::forward.
+
file opt.hpp
+
Class cubos::core::memory::Opt.
+
file standard_stream.hpp
+
Class cubos::core::memory::StandardStream.
+
file stream.hpp
+
Class cubos::core::memory::Stream.
+
file type_map.hpp
+
Class cubos::core::memory::TypeMap.
+
file unordered_bimap.hpp
+
Class cubos::core::memory::UnorderedBimap.
+
+
+
+

Classes

+
+
+ class cubos::core::memory::AnyValue +
+
Stores a blob of a given reflected type.
+
+ class cubos::core::memory::AnyVector +
+
Stores a dynamically sized array of blobs of a given reflected type.
+
+ class cubos::core::memory::BufferStream +
+
Stream implementation which writes to/reads from a buffer.
+
+
template<typename>
+ class cubos::core::memory::Function +
+
Generic function pointer which can also store capturing lambda functions.
+
+
template<typename T, typename Lock>
+ class cubos::core::memory::ReadGuard +
+
Provides safe read-only access to an object using a lock.
+
+
template<typename T, typename Lock>
+ class cubos::core::memory::WriteGuard +
+
Provides safe read-write access to an object using a lock.
+
+
template<typename T>
+ class cubos::core::memory::Opt +
+
Wrapper for reference types to indicate that the given argument type is optional.
+
+ class cubos::core::memory::StandardStream +
+
Stream implementation which wraps a libc file pointer.
+
+ class cubos::core::memory::Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
template<typename V>
+ class cubos::core::memory::TypeMap +
+
A map that stores values of type V, using reflection types as keys.
+
+
template<typename L, typename R, typename LHash = std::hash<L>, typename RHash = std::hash<R>>
+ class cubos::core::memory::UnorderedBimap +
+
A bidirectional hash table.
+
+
+
+

Enums

+
+
+ enum class SeekOrigin { Begin, + Current, + End } +
+
Stream seek origin.
+
+
+
+

Functions

+
+
+
template<typename T>
+ auto swapBytes(T value) -> T +
+
Swaps the bytes of a value, changing its endianness.
+
+ auto isLittleEndian() -> bool +
+
Checks if the current platform is little endian.
+
+
template<typename T>
+ auto fromLittleEndian(T value) -> T +
+
Converts a value from little endianness to local endianness.
+
+
template<typename T>
+ auto toLittleEndian(T value) -> T +
+
Converts a value from local endianness to little endianness.
+
+
template<typename T>
+ auto fromBigEndian(T value) -> T +
+
Converts a value from big endianness to local endianness.
+
+
template<typename T>
+ auto toBigEndian(T value) -> T +
+
Converts a value from local endianness to big endianness.
+
+
template<typename T>
+ auto move(T&& value) -> RemoveReference<T>::Type&& noexcept +
+
Returns an R-value reference to the given value.
+
+
template<typename T>
+ auto forward(typename RemoveReference<T>::Type& argument) -> T&& noexcept +
+
Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.
+
+
+
+

Enum documentation

+
+

+ enum class SeekOrigin + +

+

Stream seek origin.

+
+
+
+

Function documentation

+
+

+ +
+ template<typename T> +
+ T swapBytes(T value) +

+

Swaps the bytes of a value, changing its endianness.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to swap.
ReturnsSwapped value.
+
+
+

+ bool isLittleEndian() + +

+

Checks if the current platform is little endian.

+ + + + + + + +
ReturnsWhether its little endian.
+
+
+

+ +
+ template<typename T> +
+ T fromLittleEndian(T value) +

+

Converts a value from little endianness to local endianness.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to convert.
ReturnsConverted value.
+
+
+

+ +
+ template<typename T> +
+ T toLittleEndian(T value) +

+

Converts a value from local endianness to little endianness.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to convert.
ReturnsConverted value.
+
+
+

+ +
+ template<typename T> +
+ T fromBigEndian(T value) +

+

Converts a value from big endianness to local endianness.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to convert.
ReturnsConverted value.
+
+
+

+ +
+ template<typename T> +
+ T toBigEndian(T value) +

+

Converts a value from local endianness to big endianness.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to convert.
ReturnsConverted value.
+
+
+

+ +
+ template<typename T> +
+ RemoveReference<T>::Type&& move(T&& value) noexcept +

+

Returns an R-value reference to the given value.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TValue type.
Parameters
valueValue to move.
ReturnsMoved value.
+ +
+
+

+ +
+ template<typename T> +
+ T&& forward(typename RemoveReference<T>::Type& argument) noexcept +

+

Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TArgument type.
Parameters
argumentArgument to forward.
ReturnsForwarded argument.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-reflection.html b/preview/pr-1379/group__core-reflection.html new file mode 100644 index 0000000000..f56a6339b7 --- /dev/null +++ b/preview/pr-1379/group__core-reflection.html @@ -0,0 +1,615 @@ + + + + + Core » Reflection module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Reflection module

+

Provides utilities useful for handling type-erased data.

+ + +
+

Files

+
+
file comparison.hpp
+
Function cubos::core::reflection::compare.
+
file cstring.hpp
+
Reflection declaration for C-strings.
+
file glm.hpp
+
Reflection declarations for external glm types.
+
file map.hpp
+
Reflection declaration for std::map.
+
file primitives.hpp
+
Reflection declarations for primitive types.
+
file string.hpp
+
Reflection declaration for std::string.
+
file string_view.hpp
+
Reflection declaration for std::string_view.
+
file unordered_map.hpp
+
Reflection declaration for std::unordered_map.
+
file uuid.hpp
+
Reflection declaration for uuids::uuid.
+
file vector.hpp
+
Reflection declaration for std::vector.
+
file reflect.hpp
+
Function cubos::core::reflection::reflect and related macros.
+
file array.hpp
+
Class cubos::core::reflection::ArrayTrait.
+
file constructible.hpp
+
Class cubos::core::reflection::ConstructibleTrait.
+
file constructible_utils.hpp
+
Utilities for cubos::core::reflection::ConstructibleTrait.
+
file dictionary.hpp
+
Class cubos::core::reflection::DictionaryTrait.
+
file enum.hpp
+
Class cubos::core::reflection::EnumTrait.
+
file fields.hpp
+
Class cubos::core::reflection::FieldsTrait.
+
file inherits.hpp
+
Class cubos::core::reflection::InheritsTrait.
+
file mask.hpp
+
Class cubos::core::reflection::MaskTrait.
+
file nullable.hpp
+
Class cubos::core::reflection::NullableTrait.
+
file string_conversion.hpp
+
Class cubos::core::reflection::StringConversionTrait.
+
file type.hpp
+
Class cubos::core::reflection::Type.
+
file type_client.hpp
+
Class cubos::core::reflection::TypeClient.
+
file type_registry.hpp
+
Class cubos::core::reflection::TypeRegistry.
+
file type_server.hpp
+
Class cubos::core::reflection::TypeServer.
+
+
+
+

Classes

+
+
+
template<typename T>
+ struct cubos::core::reflection::Reflect +
+
Defines the reflection function for the given type T.
+
+ class cubos::core::reflection::ArrayTrait +
+
Exposes array-like functionality of a type.
+
+ class cubos::core::reflection::ConstructibleTrait +
+
Describes how a reflected type may be constructed and destructed.
+
+ class cubos::core::reflection::DictionaryTrait +
+
Exposes dictionary-like functionality of a type.
+
+ class cubos::core::reflection::EnumTrait +
+
Provides enumeration functionality to an enumerated type.
+
+ class cubos::core::reflection::FieldsTrait +
+
Describes the fields of a reflected type.
+
+ class cubos::core::reflection::InheritsTrait +
+
Provides inheritance relationship between types.
+
+ class cubos::core::reflection::MaskTrait +
+
Provides mask functionality to an enum mask type.
+
+ class cubos::core::reflection::NullableTrait +
+
Used to manipulate values of null-representable types.
+
+ class cubos::core::reflection::StringConversionTrait +
+
Stores functions for converting a type to and from a string.
+
+ class cubos::core::reflection::Type +
+
Describes a reflected type.
+
+ class cubos::core::reflection::TypeClient +
+
Manages the client-side of a reflection channel on top of a stream.
+
+ class cubos::core::reflection::TypeRegistry +
+
Stores a set of types which can be accessed by name.
+
+ class cubos::core::reflection::TypeServer +
+
Used to setup a TypeChannel on top of a stream, from the server side.
+
+
+
+

Functions

+
+
+ auto makeAnonymousType(const char* name, + const char* file, + std::size_t size, + std::size_t alignment, + void(*)(void*) destructor) -> CUBOS_CORE_API const Type& +
+
Creates a new reflection type with a unique name created from a type name and a file path, and with a minimal ConstructibleTrait.
+
+
template<typename T>
+ auto reflect() -> const Type& +
+
Reflects the given type T.
+
+
template<typename T>
+ auto autoConstructibleTrait() -> ConstructibleTrait +
+
Returns a ConstructibleTrait with the default, copy and move constructors, set only if the type has them.
+
+
+
+

Defines

+
+
+ #define CUBOS_PACK(...) +
+
Helper macro used to pass arguments with commas to other macros, wrapped in parentheses.
+
+ #define CUBOS_REFLECT +
+
Declares the static reflection methods.
+
+ #define CUBOS_REFLECT_IMPL(T) +
+
Defines a reflection method for a non-templated type.
+
+ #define CUBOS_REFLECT_TEMPLATE_IMPL(args, + T) +
+
Similar to CUBOS_REFLECT_IMPL but tailored to templated types.
+
+ #define CUBOS_REFLECT_EXTERNAL_DECL_TEMPLATE(api, + T) +
+
Declares a specialization of cubos::core::reflection::Reflect for a templated type.
+
+ #define CUBOS_REFLECT_EXTERNAL_DECL(api, + T) +
+
Declares a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_REFLECT_EXTERNAL_IMPL(T) +
+
Implements a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_REFLECT_EXTERNAL_TEMPLATE(args, + T) +
+
Both declares and implements a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_ANONYMOUS_REFLECT(...) +
+
Defines minimal reflection for a type private to a compilation unit.
+
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API const Type& makeAnonymousType(const char* name, + const char* file, + std::size_t size, + std::size_t alignment, + void(*)(void*) destructor) + +

+

Creates a new reflection type with a unique name created from a type name and a file path, and with a minimal ConstructibleTrait.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
nameType name.
filePath of the file where the type is defined.
sizeType size in bytes.
alignmentType alignment in bytes.
destructorType destructor.
+
+
+

+ +
+ template<typename T> +
+ const Type& reflect() +

+

Reflects the given type T.

+ + + + + + + + + + + + + + + + +
Template parameters
TType to reflect.
ReturnsType information.
+

Fails to compile if the type does not implement reflection, or, in the case of external types, if its reflection specialization has not been included.

+
+
+

+ +
+ template<typename T> +
+ ConstructibleTrait autoConstructibleTrait() +

+

Returns a ConstructibleTrait with the default, copy and move constructors, set only if the type has them.

+ + + + + + + + + + + + + + + + +
Template parameters
TType.
ReturnsConstructibleTrait.
+ +
+
+
+

Define documentation

+
+

+ #define CUBOS_PACK(...) + +

+

Helper macro used to pass arguments with commas to other macros, wrapped in parentheses.

+
#define FOO(T) T foo;
+FOO(int); // expands to int foo;
+FOO(std::map<int, int>); // error: too many arguments to macro 'FOO'
+
+// Instead, use CUBOS_PACK:
+#define FOO(T) CUBOS_PACK T foo;
+FOO((int)); // expands to CUBOS_PACK(int) foo, which expands to int foo;
+FOO((std::map<int, int>)); // expands to CUBOS_PACK(std::map<int, int>) foo, which expands to
+                           // std::map<int, int> foo;
+
+
+

+ #define CUBOS_REFLECT + +

+

Declares the static reflection methods.

+
// my_type.hpp
+#include <cubos/core/reflection/reflect.hpp>
+
+struct MyType
+{
+    // declares `static const Type& reflectGet()` and `static const Type& reflectMake()`
+    CUBOS_REFLECT;
+};
+
+
+

+ #define CUBOS_REFLECT_IMPL(T) + +

+

Defines a reflection method for a non-templated type.

+ + + + + + + + + + +
Parameters
TType to reflect.
+
// my_type.cpp
+#include "my_type.hpp"
+
+CUBOS_REFLECT_IMPL(MyType) // defines `const Type& MyType::reflectGet()` and `const Type& MyType::reflectMake()`.
+{
+    return /* create your type here */;
+}
+
+
+

+ #define CUBOS_REFLECT_TEMPLATE_IMPL(args, + T) + +

+

Similar to CUBOS_REFLECT_IMPL but tailored to templated types.

+ + + + + + + + + + + + + + +
Parameters
argsTemplate arguments.
TType to reflect.
+
// templated_type.cpp
+#include "templated_type.hpp"
+
+CUBOS_REFLECT_IMPL((typename T), (TemplatedType<T>))
+{
+    return /* create your type here */;
+}
+
+
+

+ #define CUBOS_REFLECT_EXTERNAL_DECL_TEMPLATE(api, + T) + +

+

Declares a specialization of cubos::core::reflection::Reflect for a templated type.

+ + + + + + + + + + + + + + +
Parameters
apiAPI macro to use. Set to CUBOS_EMPTY if not using an API macro.
TType to reflect.
+
// templated_type_reflection.hpp
+#include <cubos/core/reflection/reflect.hpp>
+
+template <typename T>
+CUBOS_REFLECT_EXTERNAL_DECL_TEMPLATE(TemplatedType<T>);
+
+
+

+ #define CUBOS_REFLECT_EXTERNAL_DECL(api, + T) + +

+

Declares a specialization of cubos::core::reflection::Reflect for a type.

+ + + + + + + + + + + + + + +
Parameters
apiAPI macro to use. Set to CUBOS_EMPTY if not using an API macro.
TType to reflect.
+
// not_my_type_reflection.hpp
+#include <cubos/core/reflection/reflect.hpp>
+
+CUBOS_REFLECT_EXTERNAL_DECL(CUBOS_CORE_API, NotMyType);
+
+
+

+ #define CUBOS_REFLECT_EXTERNAL_IMPL(T) + +

+

Implements a specialization of cubos::core::reflection::Reflect for a type.

+ + + + + + + + + + +
Parameters
TType to reflect.
+
// not_my_type_reflection.cpp
+#include "not_my_type_reflection.hpp"
+
+CUBOS_REFLECT_EXTERNAL_IMPL(NotMyType)
+{
+    return /* create your type here */;
+}
+
+
+

+ #define CUBOS_REFLECT_EXTERNAL_TEMPLATE(args, + T) + +

+

Both declares and implements a specialization of cubos::core::reflection::Reflect for a type.

+ + + + + + + + + + + + + + +
Parameters
argsTemplate parameters, wrapped in parentheses.
TType to reflect, wrapped in parentheses.
+
// templated_type_reflection.hpp
+#include <cubos/core/reflection/reflect.hpp>
+
+CUBOS_REFLECT_EXTERNAL_TEMPLATE((typename T), (TemplatedType<T>))
+{
+    return /* create your type here */;
+}
+
+
+

+ #define CUBOS_ANONYMOUS_REFLECT(...) + +

+

Defines minimal reflection for a type private to a compilation unit.

+

Equivalent to CUBOS_REFLECT with an implementation which uses makeAnonymousType.

// my_type.cpp
+#include <cubos/core/reflection/reflect.hpp>
+
+namespace
+{
+    struct State
+    {
+        CUBOS_ANONYMOUS_REFLECT(State);
+    };
+}
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-tel.html b/preview/pr-1379/group__core-tel.html new file mode 100644 index 0000000000..4b1ee51e98 --- /dev/null +++ b/preview/pr-1379/group__core-tel.html @@ -0,0 +1,456 @@ + + + + + Core-tel module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core-tel module

+ +
+

Files

+
+
file level.hpp
+
Telemetry levels.
+
file logging.hpp
+
Logging and assertion macros.
+
file metrics.hpp
+
Metrics and profiling utilities and macros.
+
file tracing.hpp
+
Tracing macros.
+
+
+
+

Classes

+
+
+ class cubos::core::tel::Logger +
+
Singleton which holds the logging state.
+
+
+
+

Enums

+
+
+ enum class Level { Trace = CUBOS_TEL_LEVEL_TRACE, + Debug = CUBOS_TEL_LEVEL_DEBUG, + Info = CUBOS_TEL_LEVEL_INFO, + Warn = CUBOS_TEL_LEVEL_WARN, + Error = CUBOS_TEL_LEVEL_ERROR, + Critical = CUBOS_TEL_LEVEL_CRITICAL, + Off = CUBOS_TEL_LEVEL_OFF } +
+
Represents a telemetry level.
+
+
+
+

Functions

+
+
+ void level(Level level) +
+
Set telemetry level.
+
+ auto level() -> Level -> auto +
+
Get telemetry level.
+
+
+
+

Defines

+
+
+ #define CUBOS_TEL_LEVEL_TRACE +
+
Trace telemetry level, lowest telemetry level. Very verbose.
+
+ #define CUBOS_TEL_LEVEL_DEBUG +
+
Debug telemetry level. Contains logs and tracing useful for debugging, but which are not necessary in release builds.
+
+ #define CUBOS_TEL_LEVEL_INFO +
+
Information telemetry level. Contains important events that are not errors.
+
+ #define CUBOS_TEL_LEVEL_WARN +
+
Warn telemetry level. Contains events that are not errors, but which are unexpected and may be problematic.
+
+ #define CUBOS_TEL_LEVEL_ERROR +
+
Error telemetry level. Contains errors which are recoverable from.
+
+ #define CUBOS_TEL_LEVEL_CRITICAL +
+
Critical telemetry level, highest log level. Contains errors which are unrecoverable from.
+
+ #define CUBOS_TEL_LEVEL_OFF +
+
Off telemetry level, disables all logging/tracing.
+
+ #define CUBOS_TEL_LEVEL +
+
Telemetry level to compile in.
+
+ #define CUBOS_SPAN(name, + level) +
+
Constructs a new span with a specified level.
+
+ #define CUBOS_SPAN_INFO(name) +
+
Constructs a new info span.
+
+ #define CUBOS_SPAN_DEBUG(name) +
+
Constructs a new debug span.
+
+ #define CUBOS_SPAN_TRACE(name) +
+
Constructs a new trace span.
+
+
+
+

Enum documentation

+
+

+ enum class Level + +

+

Represents a telemetry level.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enumerators
Trace +

Trace telemetry level, lowest telemetry level. Very verbose.

+
Debug +

Debug telemetry level. Contains logs and tracing useful for debugging, but which are not necessary in release builds.

+
Info +

Information telemetry level. Contains important events that are not errors.

+
Warn +

Warn telemetry level. Contains events that are not errors, but which are unexpected and may be problematic.

+
Error +

Error telemetry level. Contains errors which are recoverable from.

+
Critical +

Critical telemetry level, highest log level. Contains errors which are unrecoverable from.

+
Off +

Off telemetry level, disables all logging/tracing.

+
+
+
+
+

Function documentation

+
+

+ void level(Level level) + +

+

Set telemetry level.

+ + + + + + + + + + +
Parameters
levellevel
+
+
+

+ auto level() -> Level + +

+

Get telemetry level.

+ + + + + + + +
Returnslevel
+
+
+
+

Define documentation

+
+

+ #define CUBOS_TEL_LEVEL_TRACE + +

+

Trace telemetry level, lowest telemetry level. Very verbose.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_DEBUG + +

+

Debug telemetry level. Contains logs and tracing useful for debugging, but which are not necessary in release builds.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_INFO + +

+

Information telemetry level. Contains important events that are not errors.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_WARN + +

+

Warn telemetry level. Contains events that are not errors, but which are unexpected and may be problematic.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_ERROR + +

+

Error telemetry level. Contains errors which are recoverable from.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_CRITICAL + +

+

Critical telemetry level, highest log level. Contains errors which are unrecoverable from.

+ +
+
+

+ #define CUBOS_TEL_LEVEL_OFF + +

+

Off telemetry level, disables all logging/tracing.

+ +
+
+

+ #define CUBOS_TEL_LEVEL + +

+

Telemetry level to compile in.

+

This macro essentially controls the minimum Telemetry level that will be compiled into the binary.

Should be set to one of the following:

By default, on debug builds, this is set to CUBOS_TEL_LEVEL_TRACE. On release builds, this is set to CUBOS_TEL_LEVEL_INFO.

+
+
+

+ #define CUBOS_SPAN(name, + level) + +

+

Constructs a new span with a specified level.

+ + + + + + + + + + + + + + +
Parameters
nameSpan name.
levelSpan level.
+
+
+

+ #define CUBOS_SPAN_INFO(name) + +

+

Constructs a new info span.

+ + + + + + + + + + +
Parameters
nameSpan name.
+
+
+

+ #define CUBOS_SPAN_DEBUG(name) + +

+

Constructs a new debug span.

+ + + + + + + + + + +
Parameters
nameSpan name.
+
+
+

+ #define CUBOS_SPAN_TRACE(name) + +

+

Constructs a new trace span.

+ + + + + + + + + + +
Parameters
nameSpan name.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core-thread.html b/preview/pr-1379/group__core-thread.html new file mode 100644 index 0000000000..7432ec836e --- /dev/null +++ b/preview/pr-1379/group__core-thread.html @@ -0,0 +1,143 @@ + + + + + Core » Threading module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core » + Threading module

+

Provides threading and asynchronous related utilities.

+ +
+

Files

+
+
file pool.hpp
+
Class cubos::core::thread::ThreadPool.
+
file process.hpp
+
Class cubos::core::thread::Process.
+
file task.hpp
+
Class cubos::core::thread::Task.
+
+
+
+

Classes

+
+
+ class cubos::core::thread::ThreadPool +
+
Manages a pool of threads, to which tasks can be submitted.
+
+ class cubos::core::thread::Process +
+
Provides a cross-platform way to spawn child processes.
+
+
template<typename T>
+ class cubos::core::thread::Task +
+
Provides a mechanism to access the results of asynchronous operations.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__core.html b/preview/pr-1379/group__core.html new file mode 100644 index 0000000000..b301738675 --- /dev/null +++ b/preview/pr-1379/group__core.html @@ -0,0 +1,194 @@ + + + + + Core module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Core module

+

Cubos core library.

+ +

Macro used to export and import symbols from the library.

The core library contains loose utilities and functionality on which the rest of the Cubos libraries and applications are built on. Lives in the cubos::core namespace.

This library can be further divided into modules, which are documented in their respective module pages. Each of these modules has its own namespace and directory in the source tree. For example, the ECS module lives in the cubos::core::ecs namespace.

+
+

Modules

+
+
module Audio
+
Provides audio functionality.
+
module Data
+
Provides filesystem and serialization utilities.
+
module ECS
+
Entity Component System library.
+
module Geometry
+
Provides geometry utilities.
+
module Graphics
+
Provides a graphics API abstraction.
+
module Input and output
+
Provides a window API abstraction.
+
module Memory
+
Provides a stream library and memory utilities.
+
module Reflection
+
Provides utilities useful for handling type-erased data.
+
module Threading
+
Provides threading and asynchronous related utilities.
+
+
+
+

Files

+
+
file api.hpp
+
Macro CUBOS_CORE_API.
+
+
+
+

Classes

+
+
+ class cubos::core::tel::Metrics +
+
Singleton class that manages a collection of metrics.
+
+
+
+

Functions

+
+
+ void abort() +
+
Aborts the program and prints a pretty stack trace.
+
+
+
+

Defines

+
+
+ #define CUBOS_METRIC(...) +
+
Macro to add a metric.
+
+
+
+

Function documentation

+
+

+ void abort() + +

+

Aborts the program and prints a pretty stack trace.

+
+
+
+

Define documentation

+
+

+ #define CUBOS_METRIC(...) + +

+

Macro to add a metric.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__debug-camera-tool-plugin.html b/preview/pr-1379/group__debug-camera-tool-plugin.html new file mode 100644 index 0000000000..5f9a4fc0be --- /dev/null +++ b/preview/pr-1379/group__debug-camera-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Debug Camera module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Debug Camera module

+

Adds a toggleable debug camera.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto debugCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void debugCameraPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__defaults-plugin.html b/preview/pr-1379/group__defaults-plugin.html new file mode 100644 index 0000000000..1a9ba994c5 --- /dev/null +++ b/preview/pr-1379/group__defaults-plugin.html @@ -0,0 +1,151 @@ + + + + + Engine » Defaults module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Defaults module

+

Adds a series of pre-configured essential plugins to the engine.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void defaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void defaultsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__ecs-statistics-tool-plugin.html b/preview/pr-1379/group__ecs-statistics-tool-plugin.html new file mode 100644 index 0000000000..07d619d7f7 --- /dev/null +++ b/preview/pr-1379/group__ecs-statistics-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » ECS Statistics module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + ECS Statistics module

+

Shows tons of statistics and information about the internal state of the ECS.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto ecsStatisticsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void ecsStatisticsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__engine-api.html b/preview/pr-1379/group__engine-api.html new file mode 100644 index 0000000000..e641615fce --- /dev/null +++ b/preview/pr-1379/group__engine-api.html @@ -0,0 +1,120 @@ + + + + + Engine API module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine API module

+

C API for the Cubos engine library.

+ +

Macro used to export and import symbols from the library.

+
+

Files

+
+
file api.h
+
Macro CUBOS_ENGINE_C_API.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__engine.html b/preview/pr-1379/group__engine.html new file mode 100644 index 0000000000..9e900c9af4 --- /dev/null +++ b/preview/pr-1379/group__engine.html @@ -0,0 +1,178 @@ + + + + + Engine module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine module

+

Cubos engine library.

+ +

Macro used to export and import symbols from the library.

The engine library is built on top of the core library and contains code exclusive to game execution. This includes asset management, rendering and physics. It is built around the Cubos class and designed to be as modular as possible. Each sub-module corresponds to a plugin, or a set of plugins.

The library re-exports some of the core library functionality for convenience such that the user doesn't have to use the cubos::core namespace directly very often.

+
+

Modules

+
+
module Assets
+
Adds asset management to Cubos.
+
module Collisions
+
Adds collision detection to Cubos.
+
module Defaults
+
Adds a series of pre-configured essential plugins to the engine.
+
module Fixed Time Step
+
Adds a tag which makes its systems run at a fixed frame rate.
+
module Gizmos
+
Used to draw gizmos helpful for debugging and tools.
+
module Image
+
Adds images to Cubos using stb_image.
+
module ImGui integration
+
Initializes and configures ImGui for Cubos.
+
module Input
+
Adds input handling to Cubos.
+
module Physics
+
Creates and handles the physics simulation.
+
module Defaults
+
Adds the most frequently used rendering plugins to the engine.
+
module Render
+
Provides plugins for graphics rendering.
+
module Scene
+
Adds scenes to Cubos.
+
module Settings
+
Adds and manages settings.
+
module Tools
+
Adds various debugging tool plugins.
+
module Transform
+
Adds transform components which assign positions, rotations and scaling to entities.
+
module UI
+
Provides plugins for graphical user interfaces.
+
module Free Camera
+
Adds the free camera controller component, which locks the mouse and moves an entity.
+
module Voxels
+
Adds grid and palette assets to Cubos.
+
module Window
+
Creates and handles the lifecycle of a window.
+
+
+
+

Files

+
+
file api.hpp
+
Macro CUBOS_ENGINE_API.
+
file prelude.hpp
+
Includes commonly used headers and defines aliases for commonly used types.
+
file settings.hpp
+
Class cubos::engine::Settings.
+
+
+
+

Classes

+
+
+ class cubos::engine::Settings +
+
Stores settings as key-value pairs and provides methods to retrieve them.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__entity-inspector-tool-plugin.html b/preview/pr-1379/group__entity-inspector-tool-plugin.html new file mode 100644 index 0000000000..952166e5a6 --- /dev/null +++ b/preview/pr-1379/group__entity-inspector-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Entity Inspector module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Entity Inspector module

+

Allows inspecting and modifying the components of the current Selection.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto entityInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void entityInspectorPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__fixed-step-plugin.html b/preview/pr-1379/group__fixed-step-plugin.html new file mode 100644 index 0000000000..e37851c622 --- /dev/null +++ b/preview/pr-1379/group__fixed-step-plugin.html @@ -0,0 +1,165 @@ + + + + + Engine » Fixed Time Step module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Fixed Time Step module

+

Adds a tag which makes its systems run at a fixed frame rate.

+ +

Resources

  • FixedDeltaTime - holds the value of the fixed delta for the physics update.
+
+

Files

+
+
file fixed_delta_time.hpp
+
Resource cubos::engine::FixedDeltaTime.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::FixedDeltaTime +
+
Resource which holds the value of the fixed delta for the fixedStep plugin.
+
+
+
+

Functions

+
+
+ auto fixedStepPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void fixedStepPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__free-camera-plugin.html b/preview/pr-1379/group__free-camera-plugin.html new file mode 100644 index 0000000000..86f0ed6f48 --- /dev/null +++ b/preview/pr-1379/group__free-camera-plugin.html @@ -0,0 +1,153 @@ + + + + + Engine » Free Camera module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Free Camera module

+

Adds the free camera controller component, which locks the mouse and moves an entity.

+ +

Components

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto freeCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void freeCameraPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__gizmos-plugin.html b/preview/pr-1379/group__gizmos-plugin.html new file mode 100644 index 0000000000..a8bbfa3fd5 --- /dev/null +++ b/preview/pr-1379/group__gizmos-plugin.html @@ -0,0 +1,172 @@ + + + + + Engine » Gizmos module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Gizmos module

+

Used to draw gizmos helpful for debugging and tools.

+ +

Resources

  • Gizmos - used to queue gizmo draw commands.

Dependencies

+
+

Files

+
+
file gizmos.hpp
+
Resource cubos::engine::Gizmos.
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::GizmosTarget.
+
+
+
+

Classes

+
+
+ class cubos::engine::Gizmos +
+
Resource which queues commands for drawing gizmos, basic primitives useful for debugging and tools.
+
+ struct cubos::engine::GizmosTarget +
+
Component used to indicate that Gizmos should be rendered to a given RenderTarget.
+
+
+
+

Functions

+
+
+ auto gizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void gizmosPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__image-plugin.html b/preview/pr-1379/group__image-plugin.html new file mode 100644 index 0000000000..bc12230c01 --- /dev/null +++ b/preview/pr-1379/group__image-plugin.html @@ -0,0 +1,172 @@ + + + + + Engine » Image module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Image module

+

Adds images to Cubos using stb_image.

+ +

Bridges

Dependencies

+
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::ImageBridge.
+
file image.hpp
+
Class cubos::engine::Image.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ class cubos::engine::ImageBridge +
+
Bridge which loads and saves Image assets.
+
+ struct cubos::engine::Image +
+
Asset containing raw Image data.
+
+
+
+

Functions

+
+
+ auto imagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void imagePlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__imgui-plugin.html b/preview/pr-1379/group__imgui-plugin.html new file mode 100644 index 0000000000..3548cb5595 --- /dev/null +++ b/preview/pr-1379/group__imgui-plugin.html @@ -0,0 +1,172 @@ + + + + + Engine » ImGui integration module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + ImGui integration module

+

Initializes and configures ImGui for Cubos.

+ +

Resources

Dependencies

+
+

Files

+
+
file data_inspector.hpp
+
Resource cubos::engine::DataInspector.
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::ImGuiTarget.
+
+
+
+

Classes

+
+
+ class cubos::engine::DataInspector +
+
Resource which allows the user to inspect or modify any reflectable value on the UI.
+
+ struct cubos::engine::ImGuiTarget +
+
Component used to indicate that the ImGui frame should be rendered to a given RenderTarget.
+
+
+
+

Functions

+
+
+ auto imguiPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void imguiPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__input-plugin.html b/preview/pr-1379/group__input-plugin.html new file mode 100644 index 0000000000..918a5c30cc --- /dev/null +++ b/preview/pr-1379/group__input-plugin.html @@ -0,0 +1,192 @@ + + + + + Engine » Input module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Input module

+

Adds input handling to Cubos.

+ +

Bridges

Events

  • InputEvent - (TODO) emitted when an input event occurs.

Resources

  • Input - stateful input manager, used to query the input state.

Dependencies

+
+

Files

+
+
file action.hpp
+
Class cubos::engine::InputAction.
+
file axis.hpp
+
Class cubos::engine::InputAxis.
+
file bindings.hpp
+
Class cubos::engine::InputBindings.
+
file combination.hpp
+
Class cubos::engine::InputCombination.
+
file input.hpp
+
Resource cubos::engine::Input.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ class cubos::engine::InputAction +
+
Stores the state of a single input action, such as "jump" or "attack".
+
+ class cubos::engine::InputAxis +
+
Stores the state of a single input axis, such as "move forward" or "move right".
+
+ class cubos::engine::InputBindings +
+
Stores the input bindings for a single player.
+
+ class cubos::engine::InputCombination +
+
Stores the keys, gamepad buttons, and mouse buttons of a single input combination.
+
+ class cubos::engine::Input +
+
Resource which stores the input bindings for multiple players.
+
+
+
+

Functions

+
+
+ auto inputPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void inputPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__metrics-panel-tool-plugin.html b/preview/pr-1379/group__metrics-panel-tool-plugin.html new file mode 100644 index 0000000000..71a291d00a --- /dev/null +++ b/preview/pr-1379/group__metrics-panel-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Metrics Panel module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Metrics Panel module

+

Shows some useful performance metrics through a ImGui window.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto metricsPanelPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void metricsPanelPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__physics-gravity-plugin.html b/preview/pr-1379/group__physics-gravity-plugin.html new file mode 100644 index 0000000000..51919a06e6 --- /dev/null +++ b/preview/pr-1379/group__physics-gravity-plugin.html @@ -0,0 +1,176 @@ + + + + + Engine » Physics » Gravity module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Physics » + Gravity module

+

Adds gravity to particles.

+ +

Resources

  • Gravity - holds the global value of gravity.
+
+

Files

+
+
file gravity.hpp
+
Gravity plugin, resource cubos::engine::Gravity.
+
+
+
+

Functions

+
+
+ auto gravityPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto physicsSolverPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void gravityPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+

+ CUBOS_ENGINE_API void physicsSolverPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__physics-plugin.html b/preview/pr-1379/group__physics-plugin.html new file mode 100644 index 0000000000..b8fae0b392 --- /dev/null +++ b/preview/pr-1379/group__physics-plugin.html @@ -0,0 +1,255 @@ + + + + + Engine » Physics module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Physics module

+

Creates and handles the physics simulation.

+ +

Resources

  • Damping - holds the damping value for integration.
  • Substeps - holds the amount of substeps for the physics update.

Components

  • PhysicsBundle - bundle that holds the physics information to give to a new entity.
  • Velocity - holds the information for moving an object straight.
  • AngularVelocity - holds the angular velocity of an object.
  • Force - holds forces applied on a particle.
  • Torque - holds torque applied on an object.
  • Impulse - holds impulses applied on a particle.
  • AngularImpulse - holds angular impulses applied on a particle.
  • Mass - holds the mass of an object.
  • Inertia - holds the inertia tensor of an object.
  • CenterOfMass - holds the center of mass of an object.
  • AccumulatedCorrection - holds the corrections accumulated from the constraints solving.
  • PhysicsMaterial - holds the friction and bounciness properties of the particle.

Dependencies

+
+

Modules

+
+
module Gravity
+
Adds gravity to particles.
+
module Solver
+
Adds solver for constraints.
+
+
+
+

Files

+
+
file accumulated_correction.hpp
+
Component cubos::engine::AccumulatedCorrection.
+
file angular_impulse.hpp
+
Component cubos::engine::AngularImpulse.
+
file angular_velocity.hpp
+
Component cubos::engine::AngularVelocity.
+
file center_of_mass.hpp
+
Component cubos::engine::CenterOfMass.
+
file force.hpp
+
Component cubos::engine::Force.
+
file impulse.hpp
+
Component cubos::engine::Impulse.
+
file inertia.hpp
+
Component cubos::engine::Inertia.
+
file mass.hpp
+
Component cubos::engine::Mass.
+
file physics_material.hpp
+
Component cubos::engine::PhysicsMaterial.
+
file torque.hpp
+
Component cubos::engine::Torque.
+
file velocity.hpp
+
Component cubos::engine::Velocity.
+
file physics_bundle.hpp
+
Component cubos::engine::PhysicsBundle.
+
file plugin.hpp
+
Plugin entry point.
+
file damping.hpp
+
Resource cubos::engine::Damping.
+
file gravity.hpp
+
Resource cubos::engine::Gravity.
+
+
+
+

Classes

+
+
+ struct cubos::engine::AccumulatedCorrection +
+
Component which holds the corrections accumulated from the constraints solving.
+
+ struct cubos::engine::AngularImpulse +
+
Component which holds angular impulses applied on a body.
+
+ struct cubos::engine::AngularVelocity +
+
Component which holds angular velocity of a body.
+
+ struct cubos::engine::CenterOfMass +
+
Component which defines the center of mass of a body.
+
+ struct cubos::engine::Force +
+
Component which holds forces applied on a particle.
+
+ struct cubos::engine::Impulse +
+
Component which holds impulses applied on a particle.
+
+ struct cubos::engine::Inertia +
+
Component which defines the inertia of a body.
+
+ struct cubos::engine::Mass +
+
Component which defines the mass of a particle.
+
+ struct cubos::engine::PhysicsMaterial +
+
Component which defines the friction and bounciness of a body.
+
+ struct cubos::engine::Torque +
+
Component which holds torque applied on a body.
+
+ struct cubos::engine::Velocity +
+
Component which holds velocity and forces applied on a particle.
+
+ struct cubos::engine::PhysicsBundle +
+
Component which encapsulates the creation all components required for physics.
+
+ struct cubos::engine::Damping +
+
Resource which holds the damping value for integration.
+
+ struct cubos::engine::Gravity +
+
Resource which holds the global value of gravity.
+
+
+
+

Functions

+
+
+ auto physicsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void physicsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__physics-solver-plugin.html b/preview/pr-1379/group__physics-solver-plugin.html new file mode 100644 index 0000000000..5f62f4ea30 --- /dev/null +++ b/preview/pr-1379/group__physics-solver-plugin.html @@ -0,0 +1,121 @@ + + + + + Engine » Physics » Solver module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Physics » + Solver module

+

Adds solver for constraints.

+ +
+

Files

+
+
file plugin.hpp
+
Solver plugin, resource cubos::engine::Solver.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__play-pause-tool-plugin.html b/preview/pr-1379/group__play-pause-tool-plugin.html new file mode 100644 index 0000000000..010aac1001 --- /dev/null +++ b/preview/pr-1379/group__play-pause-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Play Pause module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Play Pause module

+

Allows changing the current simulation speed, or even pause it.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto playPauseToolPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void playPauseToolPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-bloom-plugin.html b/preview/pr-1379/group__render-bloom-plugin.html new file mode 100644 index 0000000000..723997c351 --- /dev/null +++ b/preview/pr-1379/group__render-bloom-plugin.html @@ -0,0 +1,186 @@ + + + + + Engine » Render » Bloom module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Bloom module

+

Applies the Bloom effect on the HDR texture.

+ +

Dependencies

+
+

Files

+
+
file bloom.hpp
+
Component cubos::engine::Bloom.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Bloom +
+
Component which stores the Bloom state for a render target.
+
+
+
+

Functions

+
+
+ auto bloomPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag bloomTag +
+
Tags the system which applies the Bloom effect.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void bloomPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag bloomTag + +

+

Tags the system which applies the Bloom effect.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-camera-plugin.html b/preview/pr-1379/group__render-camera-plugin.html new file mode 100644 index 0000000000..2ec25efcc2 --- /dev/null +++ b/preview/pr-1379/group__render-camera-plugin.html @@ -0,0 +1,182 @@ + + + + + Engine » Render » Camera module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Camera module

+

Adds PerspectiveCamera components and the DrawsTo relation.

+ +
+

Files

+
+
file camera.hpp
+
Component cubos::engine::Camera.
+
file draws_to.hpp
+
Relation cubos::engine::DrawsTo.
+
file orthographic.hpp
+
Component cubos::engine::OrthographicCamera.
+
file perspective.hpp
+
Component cubos::engine::PerspectiveCamera.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Camera +
+
Generic component to hold the projection matrix of a specific camera (either perspective or orthogonal).
+
+ struct cubos::engine::DrawsTo +
+
Relation which indicates the 'from' entity is a camera that draws to the 'to' target.
+
+ struct cubos::engine::OrthographicCamera +
+
Component which defines parameters of a orthographic camera used to render the world.
+
+ struct cubos::engine::PerspectiveCamera +
+
Component which defines parameters of a perspective camera used to render the world.
+
+
+
+

Functions

+
+
+ auto cameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void cameraPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-cascaded-shadow-maps-plugin.html b/preview/pr-1379/group__render-cascaded-shadow-maps-plugin.html new file mode 100644 index 0000000000..f5338ea41f --- /dev/null +++ b/preview/pr-1379/group__render-cascaded-shadow-maps-plugin.html @@ -0,0 +1,185 @@ + + + + + Engine » Render » Cascaded shadow maps module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Cascaded shadow maps module

+

Creates and manages shadow maps for directional shadow casters.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto cascadedShadowMapsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createCascadedShadowMapsTag +
+
Creates the shadow maps.
+
+ CUBOS_ENGINE_API Tag drawToCascadedShadowMapsTag +
+
Systems which draw to the cascaded shadow maps should be tagged with this.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void cascadedShadowMapsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+
+

+ CUBOS_ENGINE_API Tag drawToCascadedShadowMapsTag + +

+

Systems which draw to the cascaded shadow maps should be tagged with this.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-cascaded-shadow-maps-rasterizer-plugin.html b/preview/pr-1379/group__render-cascaded-shadow-maps-rasterizer-plugin.html new file mode 100644 index 0000000000..836c6c9f90 --- /dev/null +++ b/preview/pr-1379/group__render-cascaded-shadow-maps-rasterizer-plugin.html @@ -0,0 +1,154 @@ + + + + + Engine » Render » Cascaded shadow maps rasterizer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Cascaded shadow maps rasterizer module

+

Draws all render meshes for each directional light to its shadow map.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto cascadedShadowMapsRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void cascadedShadowMapsRasterizerPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-defaults-plugin.html b/preview/pr-1379/group__render-defaults-plugin.html new file mode 100644 index 0000000000..cd049e90ef --- /dev/null +++ b/preview/pr-1379/group__render-defaults-plugin.html @@ -0,0 +1,163 @@ + + + + + Engine » Defaults module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Defaults module

+

Adds the most frequently used rendering plugins to the engine.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::RenderTargetDefaults.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderTargetDefaults +
+
Component which replaces itself by the default render target components to an entity.
+
+
+
+

Functions

+
+
+ void renderDefaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void renderDefaultsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-deferred-shading-plugin.html b/preview/pr-1379/group__render-deferred-shading-plugin.html new file mode 100644 index 0000000000..bae2facf67 --- /dev/null +++ b/preview/pr-1379/group__render-deferred-shading-plugin.html @@ -0,0 +1,186 @@ + + + + + Engine » Render » Deferred Shading module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Deferred Shading module

+

Applies the Deferred Shading technique on the GBuffer and outputs the result to the HDR texture.

+ +

Dependencies

+
+

Files

+
+
file deferred_shading.hpp
+
Component cubos::engine::DeferredShading.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DeferredShading +
+
Component which stores the Deferred Shading state for a render target.
+
+
+
+

Functions

+
+
+ auto deferredShadingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag deferredShadingTag +
+
Tags the system which applies the Deferred Shading technique.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void deferredShadingPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag deferredShadingTag + +

+

Tags the system which applies the Deferred Shading technique.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-depth-plugin.html b/preview/pr-1379/group__render-depth-plugin.html new file mode 100644 index 0000000000..52c2c9a112 --- /dev/null +++ b/preview/pr-1379/group__render-depth-plugin.html @@ -0,0 +1,198 @@ + + + + + Engine » Render » Depth module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Depth module

+

Adds and manages the RenderDepth component.

+ +

Components

Dependencies

+
+

Files

+
+
file depth.hpp
+
Component cubos::engine::RenderDepth.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderDepth +
+
Component which stores the depth texture of a render target.
+
+
+
+

Functions

+
+
+ auto renderDepthPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createRenderDepthTag +
+
Recreates the RenderDepth texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderDepthTag +
+
Systems which draw to RenderDepth textures should be tagged with this.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void renderDepthPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag createRenderDepthTag + +

+

Recreates the RenderDepth texture if necessary - for example, due to a render target resize.

+
+
+

+ CUBOS_ENGINE_API Tag drawToRenderDepthTag + +

+

Systems which draw to RenderDepth textures should be tagged with this.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-g-buffer-plugin.html b/preview/pr-1379/group__render-g-buffer-plugin.html new file mode 100644 index 0000000000..573c860fbb --- /dev/null +++ b/preview/pr-1379/group__render-g-buffer-plugin.html @@ -0,0 +1,208 @@ + + + + + Engine » Render » G-Buffer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + G-Buffer module

+

Adds and manages GBuffer components.

+ +

Dependencies

+
+

Files

+
+
file g_buffer.hpp
+
Component cubos::engine::GBuffer.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::GBuffer +
+
Component which stores the GBuffer textures of a render target.
+
+
+
+

Functions

+
+
+ auto gBufferPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createGBufferTag +
+
Recreates the GBuffer if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToGBufferTag +
+
Systems which draw to GBuffer textures should be tagged with this.
+
+ CUBOS_ENGINE_API Tag rasterizeToGBufferTag +
+
Rasterizes RenderMesh components to the GBuffer textures.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void gBufferPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag createGBufferTag + +

+

Recreates the GBuffer if necessary - for example, due to a render target resize.

+
+
+

+ CUBOS_ENGINE_API Tag drawToGBufferTag + +

+

Systems which draw to GBuffer textures should be tagged with this.

+
+
+

+ CUBOS_ENGINE_API Tag rasterizeToGBufferTag + +

+

Rasterizes RenderMesh components to the GBuffer textures.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-g-buffer-rasterizer-plugin.html b/preview/pr-1379/group__render-g-buffer-rasterizer-plugin.html new file mode 100644 index 0000000000..d313957117 --- /dev/null +++ b/preview/pr-1379/group__render-g-buffer-rasterizer-plugin.html @@ -0,0 +1,166 @@ + + + + + Engine » Render » G-Buffer Rasterizer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + G-Buffer Rasterizer module

+

Draws RenderMesh components to the GBuffer.

+ +

Dependencies

+
+

Files

+
+
file g_buffer_rasterizer.hpp
+
Component cubos::engine::GBufferRasterizer.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::GBufferRasterizer +
+
Component which stores the GBuffer rasterizer state.
+
+
+
+

Functions

+
+
+ auto gBufferRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void gBufferRasterizerPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-hdr-plugin.html b/preview/pr-1379/group__render-hdr-plugin.html new file mode 100644 index 0000000000..ca4e9eda2e --- /dev/null +++ b/preview/pr-1379/group__render-hdr-plugin.html @@ -0,0 +1,197 @@ + + + + + Engine » Render » HDR module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + HDR module

+

Adds and manages HDR components.

+ +

Dependencies

+
+

Files

+
+
file hdr.hpp
+
Component cubos::engine::HDR.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::HDR +
+
Component which stores the HDR texture of a render target.
+
+
+
+

Functions

+
+
+ auto hdrPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createHDRTag +
+
Recreates the HDR texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToHDRTag +
+
Systems which draw to HDR textures should be tagged with this.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void hdrPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag createHDRTag + +

+

Recreates the HDR texture if necessary - for example, due to a render target resize.

+
+
+

+ CUBOS_ENGINE_API Tag drawToHDRTag + +

+

Systems which draw to HDR textures should be tagged with this.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-lights-plugin.html b/preview/pr-1379/group__render-lights-plugin.html new file mode 100644 index 0000000000..c37a3a638a --- /dev/null +++ b/preview/pr-1379/group__render-lights-plugin.html @@ -0,0 +1,182 @@ + + + + + Engine » Render » Lights module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Lights module

+

Common interface for the lighting part of rendering plugins.

+ +
+

Files

+
+
file directional.hpp
+
Component cubos::engine::DirectionalLight.
+
file environment.hpp
+
Resource cubos::engine::RenderEnvironment.
+
file plugin.hpp
+
Plugin entry point.
+
file point.hpp
+
Component cubos::engine::PointLight.
+
file spot.hpp
+
Component cubos::engine::SpotLight.
+
+
+
+

Classes

+
+
+ struct cubos::engine::DirectionalLight +
+
Component which makes an entity behave like a directional light.
+
+ struct cubos::engine::RenderEnvironment +
+
Resource which stores the scene's ambient light and sky colors.
+
+ struct cubos::engine::PointLight +
+
Component which makes an entity behave like a point light.
+
+ struct cubos::engine::SpotLight +
+
Component which makes an entity emit a spot light in the direction of its local forward vector.
+
+
+
+

Functions

+
+
+ auto lightsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void lightsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-mesh-plugin.html b/preview/pr-1379/group__render-mesh-plugin.html new file mode 100644 index 0000000000..d791a75986 --- /dev/null +++ b/preview/pr-1379/group__render-mesh-plugin.html @@ -0,0 +1,179 @@ + + + + + Engine » Render » Mesh module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Mesh module

+

Adds and manages RenderMesh components.

+ +

Settings

  • renderMeshPool.bucketCount - number of buckets in the mesh pool (default: 1024).
  • renderMeshPool.bucketSize - maximum face count per bucket (default: 1024).

Dependencies

+
+

Files

+
+
file mesh.hpp
+
Component cubos::engine::RenderMesh.
+
file plugin.hpp
+
Plugin entry point.
+
file pool.hpp
+
Resource cubos::engine::RenderMeshPool.
+
file vertex.hpp
+
Struct cubos::engine::RenderMeshVeretx.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderMesh +
+
Component used to draw meshes stored in the vertex pool.
+
+ class cubos::engine::RenderMeshPool +
+
Used to allocate render meshes, which can then be rendered using a single draw call.
+
+ struct cubos::engine::RenderMeshVertex +
+
Vertex data type stored in the RenderMeshPool's vertex buffer.
+
+
+
+

Functions

+
+
+ auto renderMeshPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void renderMeshPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-picker-plugin.html b/preview/pr-1379/group__render-picker-plugin.html new file mode 100644 index 0000000000..aec44920a8 --- /dev/null +++ b/preview/pr-1379/group__render-picker-plugin.html @@ -0,0 +1,166 @@ + + + + + Engine » Render » RenderPicker module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + RenderPicker module

+

Adds and manages RenderPicker components.

+ +

Dependencies

+
+

Files

+
+
file picker.hpp
+
Component cubos::engine::RenderPicker.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderPicker +
+
Component which provides a texture to store entity/gizmo ids, for selection with a mouse.
+
+
+
+

Functions

+
+
+ auto renderPickerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void renderPickerPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-plugins.html b/preview/pr-1379/group__render-plugins.html new file mode 100644 index 0000000000..cc50a06e3a --- /dev/null +++ b/preview/pr-1379/group__render-plugins.html @@ -0,0 +1,160 @@ + + + + + Engine » Render module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render module

+

Provides plugins for graphics rendering.

+ +
+

Modules

+
+
module Bloom
+
Applies the Bloom effect on the HDR texture.
+
module Camera
+
Adds PerspectiveCamera components and the DrawsTo relation.
+
module Cascaded shadow maps
+
Creates and manages shadow maps for directional shadow casters.
+
module Cascaded shadow maps rasterizer
+
Draws all render meshes for each directional light to its shadow map.
+
module Deferred Shading
+
Applies the Deferred Shading technique on the GBuffer and outputs the result to the HDR texture.
+
module Depth
+
Adds and manages the RenderDepth component.
+
module G-Buffer
+
Adds and manages GBuffer components.
+
module G-Buffer Rasterizer
+
Draws RenderMesh components to the GBuffer.
+
module HDR
+
Adds and manages HDR components.
+
module Lights
+
Common interface for the lighting part of rendering plugins.
+
module Mesh
+
Adds and manages RenderMesh components.
+
module RenderPicker
+
Adds and manages RenderPicker components.
+
module Shader
+
Adds shader assets to Cubos.
+
module Shadow atlas
+
Creates and manages a shadow map atlas.
+
module Shadow atlas rasterizer
+
Draws all render meshes for each light to the shadow map atlas.
+
module Shadows
+
Base interface plugin for shadows.
+
module Splitscreen
+
Adjusts the viewport in DrawsTo relations to achieve a splitscreen layout.
+
module Screen Space Ambient Occlusion
+
Applies the SSAO technique on the GBuffer and outputs the result to the SSAO texture.
+
module Render Target
+
Adds and manages RenderTarget components.
+
module Tone Mapping
+
Draws the tone-mapped HDR texture to the render target's framebuffer.
+
module Render Voxels
+
Common interface for voxel rendering plugins.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-shader-plugin.html b/preview/pr-1379/group__render-shader-plugin.html new file mode 100644 index 0000000000..9c64703af7 --- /dev/null +++ b/preview/pr-1379/group__render-shader-plugin.html @@ -0,0 +1,173 @@ + + + + + Engine » Render » Shader module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Shader module

+

Adds shader assets to Cubos.

+ +

Bridges

Dependencies

+
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::ShaderBridge.
+
file plugin.hpp
+
Plugin entry point.
+
file shader.hpp
+
Class cubos::engine::Shader.
+
+
+
+

Classes

+
+
+ class cubos::engine::ShaderBridge +
+
Bridge for loading shader assets.
+
+ class cubos::engine::Shader +
+
Contains a shader stage created from GLSL code.
+
+
+
+

Functions

+
+
+ auto shaderPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void shaderPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-shadow-atlas-plugin.html b/preview/pr-1379/group__render-shadow-atlas-plugin.html new file mode 100644 index 0000000000..c01b4e0a02 --- /dev/null +++ b/preview/pr-1379/group__render-shadow-atlas-plugin.html @@ -0,0 +1,208 @@ + + + + + Engine » Render » Shadow atlas module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Shadow atlas module

+

Creates and manages a shadow map atlas.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file shadow_atlas.hpp
+
Resource cubos::engine::ShadowAtlas.
+
+
+
+

Classes

+
+
+ class cubos::engine::ShadowAtlas +
+
Resource which stores the shadow map atlas, a large texture that holds the shadow maps for each shadow caster in a quadtree structure, reducing texture switching.
+
+
+
+

Functions

+
+
+ auto shadowAtlasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag createShadowAtlasTag +
+
Creates the shadow atlas.
+
+ CUBOS_ENGINE_API Tag reserveShadowCastersTag +
+
Reserves space for shadow casters.
+
+ CUBOS_ENGINE_API Tag drawToShadowAtlasTag +
+
Systems which draw to the shadow atlas texture should be tagged with this.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void shadowAtlasPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag createShadowAtlasTag + +

+

Creates the shadow atlas.

+
+
+

+ CUBOS_ENGINE_API Tag reserveShadowCastersTag + +

+

Reserves space for shadow casters.

+
+
+

+ CUBOS_ENGINE_API Tag drawToShadowAtlasTag + +

+

Systems which draw to the shadow atlas texture should be tagged with this.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-shadow-atlas-rasterizer-plugin.html b/preview/pr-1379/group__render-shadow-atlas-rasterizer-plugin.html new file mode 100644 index 0000000000..a0b85245fd --- /dev/null +++ b/preview/pr-1379/group__render-shadow-atlas-rasterizer-plugin.html @@ -0,0 +1,166 @@ + + + + + Engine » Render » Shadow atlas rasterizer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Shadow atlas rasterizer module

+

Draws all render meshes for each light to the shadow map atlas.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file shadow_atlas_rasterizer.hpp
+
Resource cubos::engine::ShadowAtlasRasterizer.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ShadowAtlasRasterizer +
+
Resource which stores the ShadowAtlas rasterizer state.
+
+
+
+

Functions

+
+
+ auto shadowAtlasRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void shadowAtlasRasterizerPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-shadows-plugin.html b/preview/pr-1379/group__render-shadows-plugin.html new file mode 100644 index 0000000000..73c71843d5 --- /dev/null +++ b/preview/pr-1379/group__render-shadows-plugin.html @@ -0,0 +1,182 @@ + + + + + Engine » Render » Shadows module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Shadows module

+

Base interface plugin for shadows.

+ +
+

Files

+
+
file caster.hpp
+
Struct cubos::engine::ShadowCaster.
+
file directional_caster.hpp
+
Component cubos::engine::DirectionalShadowCaster.
+
file plugin.hpp
+
Plugin entry point.
+
file point_caster.hpp
+
Component cubos::engine::PointShadowCaster.
+
file spot_caster.hpp
+
Component cubos::engine::SpotShadowCaster.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ShadowCaster +
+
Struct which contains the settings common to all shadow casters.
+
+ struct cubos::engine::DirectionalShadowCaster +
+
Component which enables shadow casting on a directional light.
+
+ struct cubos::engine::PointShadowCaster +
+
Component which enables shadow casting on a point light.
+
+ struct cubos::engine::SpotShadowCaster +
+
Component which enables shadow casting on a spot light.
+
+
+
+

Functions

+
+
+ auto shadowsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void shadowsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-split-screen-plugin.html b/preview/pr-1379/group__render-split-screen-plugin.html new file mode 100644 index 0000000000..bf386ac4f2 --- /dev/null +++ b/preview/pr-1379/group__render-split-screen-plugin.html @@ -0,0 +1,186 @@ + + + + + Engine » Render » Splitscreen module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Splitscreen module

+

Adjusts the viewport in DrawsTo relations to achieve a splitscreen layout.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file split_screen.hpp
+
Component cubos::engine::SplitScreen.
+
+
+
+

Classes

+
+
+ struct cubos::engine::SplitScreen +
+
Component which enables splitscreen in a render target.
+
+
+
+

Functions

+
+
+ auto splitScreenPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag splitScreenTag +
+
Tags the system which adjusts the viewports.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void splitScreenPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag splitScreenTag + +

+

Tags the system which adjusts the viewports.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-ssao-plugin.html b/preview/pr-1379/group__render-ssao-plugin.html new file mode 100644 index 0000000000..f1578766ea --- /dev/null +++ b/preview/pr-1379/group__render-ssao-plugin.html @@ -0,0 +1,186 @@ + + + + + Engine » Render » Screen Space Ambient Occlusion module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Screen Space Ambient Occlusion module

+

Applies the SSAO technique on the GBuffer and outputs the result to the SSAO texture.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file ssao.hpp
+
Component cubos::engine::SSAO.
+
+
+
+

Classes

+
+
+ struct cubos::engine::SSAO +
+
Component which stores the SSAO textures for a render target.
+
+
+
+

Functions

+
+
+ auto ssaoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag drawToSSAOTag +
+
Tags the system which applies the Screen Space Ambient Occlusion technique.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void ssaoPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag drawToSSAOTag + +

+

Tags the system which applies the Screen Space Ambient Occlusion technique.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-target-plugin.html b/preview/pr-1379/group__render-target-plugin.html new file mode 100644 index 0000000000..cdc5a6aff1 --- /dev/null +++ b/preview/pr-1379/group__render-target-plugin.html @@ -0,0 +1,197 @@ + + + + + Engine » Render » Render Target module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Render Target module

+

Adds and manages RenderTarget components.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file target.hpp
+
Component cubos::engine::RenderTarget.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderTarget +
+
Component which represents a render target.
+
+
+
+

Functions

+
+
+ auto renderTargetPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag resizeRenderTargetTag +
+
Resizes the Render Target if necessary - for example, due to a window resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderTargetTag +
+
Systems which draw to Render Target framebuffers should be tagged with this.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void renderTargetPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag resizeRenderTargetTag + +

+

Resizes the Render Target if necessary - for example, due to a window resize.

+
+
+

+ CUBOS_ENGINE_API Tag drawToRenderTargetTag + +

+

Systems which draw to Render Target framebuffers should be tagged with this.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-tone-mapping-plugin.html b/preview/pr-1379/group__render-tone-mapping-plugin.html new file mode 100644 index 0000000000..9bd2a6e194 --- /dev/null +++ b/preview/pr-1379/group__render-tone-mapping-plugin.html @@ -0,0 +1,186 @@ + + + + + Engine » Render » Tone Mapping module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Tone Mapping module

+

Draws the tone-mapped HDR texture to the render target's framebuffer.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file tone_mapping.hpp
+
Component cubos::engine::ToneMapping.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ToneMapping +
+
Component which stores Tone Mapping configuration for a render target.
+
+
+
+

Functions

+
+
+ auto toneMappingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag toneMappingTag +
+
Tags the system which does the tone mapping.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void toneMappingPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag toneMappingTag + +

+

Tags the system which does the tone mapping.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__render-voxels-plugin.html b/preview/pr-1379/group__render-voxels-plugin.html new file mode 100644 index 0000000000..fdb995243c --- /dev/null +++ b/preview/pr-1379/group__render-voxels-plugin.html @@ -0,0 +1,177 @@ + + + + + Engine » Render » Render Voxels module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Render » + Render Voxels module

+

Common interface for voxel rendering plugins.

+ +

By itself, this plugin does not provide any behavior. It simply registers the basic components which are then used by other plugins to render voxels. This allows for a modular design, where different rendering techniques can be implemented and swapped out without changing the rest of the engine.

+
+

Files

+
+
file grid.hpp
+
Component cubos::engine::RenderVoxelGrid.
+
file load.hpp
+
Component cubos::engine::LoadRenderVoxels.
+
file palette.hpp
+
Resource cubos::engine::RenderPalette.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderVoxelGrid +
+
Component used to draw voxel grids.
+
+ struct cubos::engine::LoadRenderVoxels +
+
Component used to indicate that a voxel grid should be sent to the GPU.
+
+ struct cubos::engine::RenderPalette +
+
Resource which identifies the currently active palette of the scene.
+
+
+
+

Functions

+
+
+ auto renderVoxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void renderVoxelsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__scene-plugin.html b/preview/pr-1379/group__scene-plugin.html new file mode 100644 index 0000000000..8784223672 --- /dev/null +++ b/preview/pr-1379/group__scene-plugin.html @@ -0,0 +1,180 @@ + + + + + Engine » Scene module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Scene module

+

Adds scenes to Cubos.

+ +

Bridges

Dependencies

+
+

Files

+
+
file bridge.hpp
+
Class cubos::engine::SceneBridge.
+
file plugin.hpp
+
Plugin entry point.
+
file scene.hpp
+
Class cubos::engine::Scene.
+
+
+
+

Classes

+
+
+ class cubos::engine::SceneBridge +
+
Bridge which loads and saves Scene assets.
+
+ struct cubos::engine::Scene +
+
Asset equivalent to ECS blueprints - a bundle of entities and their components.
+
+ class cubos::engine::VoxelModelBridge +
+
Bridge which loads and saves VoxelModel assets.
+
+ class cubos::engine::VoxelPaletteBridge +
+
Bridge which loads and saves Palette assets.
+
+
+
+

Functions

+
+
+ auto scenePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void scenePlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__selection-tool-plugin.html b/preview/pr-1379/group__selection-tool-plugin.html new file mode 100644 index 0000000000..8d90550e91 --- /dev/null +++ b/preview/pr-1379/group__selection-tool-plugin.html @@ -0,0 +1,165 @@ + + + + + Engine » Tools » Selection module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Selection module

+

Adds a resource which keeps track of what the current selection is.

+ +

This plugins exists to reduce coupling between plugins. For example, a plugin which allows selecting entities through a ImGui window only needs to depend on this plugin, instead of having to know about all the plugins which care about it. The same applies in the other direction.

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file selection.hpp
+
Resource cubos::engine::Selection.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Selection +
+
Resource which identifies the current selection.
+
+
+
+

Functions

+
+
+ auto selectionPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void selectionPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__settings-inspector-tool-plugin.html b/preview/pr-1379/group__settings-inspector-tool-plugin.html new file mode 100644 index 0000000000..69ecb5c08b --- /dev/null +++ b/preview/pr-1379/group__settings-inspector-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » Settings Inspector module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Settings Inspector module

+

Allows inspecting the current setting values through a ImGui window.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto settingsInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void settingsInspectorPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__settings-plugin.html b/preview/pr-1379/group__settings-plugin.html new file mode 100644 index 0000000000..9ea83bfa6e --- /dev/null +++ b/preview/pr-1379/group__settings-plugin.html @@ -0,0 +1,154 @@ + + + + + Engine » Settings module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Settings module

+

Adds and manages settings.

+ +

Initially, parses settings from the Arguments resource. Then, the file at settings.path is loaded, as a JSON file. If the file does not exist, it is created. If it can't be parsed, the plugin aborts. Previously set settings will be overriden, and file settings will be overriden by command line arguments.

Settings

  • settings.path - path of the settings file (default: ./settings.json).

Resources

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto settingsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void settingsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-asset-explorer-plugin.html b/preview/pr-1379/group__tesseratos-asset-explorer-plugin.html new file mode 100644 index 0000000000..23183c90c9 --- /dev/null +++ b/preview/pr-1379/group__tesseratos-asset-explorer-plugin.html @@ -0,0 +1,153 @@ + + + + + Tesseratos » Asset explorer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Asset explorer module

+

Allows viewing and selecting assets through a ImGui window.

+ +

Events

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void assetExplorerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void assetExplorerPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-debugger-plugin.html b/preview/pr-1379/group__tesseratos-debugger-plugin.html new file mode 100644 index 0000000000..e109022d64 --- /dev/null +++ b/preview/pr-1379/group__tesseratos-debugger-plugin.html @@ -0,0 +1,157 @@ + + + + + Tesseratos » Debugger module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Debugger module

+

Adds a resource used to manage a connection to a Cubos debugger.

+ +

Resources

  • Debugger - contains connection information.
+
+

Files

+
+
file debugger.hpp
+
Resource tesseratos::Debugger.
+
file plugin.hpp
+
Plugin entry point.
+
file manager.hpp
+
System argument tesseratos::ProjectManager.
+
+
+
+

Functions

+
+
+ void debuggerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void debuggerPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-importer-plugin.html b/preview/pr-1379/group__tesseratos-importer-plugin.html new file mode 100644 index 0000000000..4c90be1508 --- /dev/null +++ b/preview/pr-1379/group__tesseratos-importer-plugin.html @@ -0,0 +1,153 @@ + + + + + Tesseratos » Asset explorer module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Asset explorer module

+

Allows importing files such as .qb through a ImGui window.

+ +

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void importerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void importerPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-project-plugin.html b/preview/pr-1379/group__tesseratos-project-plugin.html new file mode 100644 index 0000000000..d927c365e5 --- /dev/null +++ b/preview/pr-1379/group__tesseratos-project-plugin.html @@ -0,0 +1,151 @@ + + + + + Tesseratos » Project module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Project module

+

Adds a resource used to manage the currently loaded project.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void projectPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void projectPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-scene-editor-plugin.html b/preview/pr-1379/group__tesseratos-scene-editor-plugin.html new file mode 100644 index 0000000000..605e005d5e --- /dev/null +++ b/preview/pr-1379/group__tesseratos-scene-editor-plugin.html @@ -0,0 +1,152 @@ + + + + + Tesseratos » Scene editor module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Scene editor module

+

Adds a window to edit scenes and select entities in them.

+ + +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void sceneEditorPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void sceneEditorPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos-voxel-palette-editor-plugin.html b/preview/pr-1379/group__tesseratos-voxel-palette-editor-plugin.html new file mode 100644 index 0000000000..78fae3f52e --- /dev/null +++ b/preview/pr-1379/group__tesseratos-voxel-palette-editor-plugin.html @@ -0,0 +1,151 @@ + + + + + Tesseratos » Palette editor module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos » + Palette editor module

+

Allows the user to open and inspect/edit a palette asset.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ void voxelPaletteEditorPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ void voxelPaletteEditorPlugin(cubos::engine::Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tesseratos.html b/preview/pr-1379/group__tesseratos.html new file mode 100644 index 0000000000..9e522b52e5 --- /dev/null +++ b/preview/pr-1379/group__tesseratos.html @@ -0,0 +1,130 @@ + + + + + Tesseratos module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Tesseratos module

+

Tesseratos application.

+ +

Tesseratos is the Cubos editor application. It is itself made with Cubos.

+
+

Modules

+
+
module Asset explorer
+
Allows viewing and selecting assets through a ImGui window.
+
module Debugger
+
Adds a resource used to manage a connection to a Cubos debugger.
+
module Asset explorer
+
Allows importing files such as .qb through a ImGui window.
+
module Project
+
Adds a resource used to manage the currently loaded project.
+
module Scene editor
+
Adds a window to edit scenes and select entities in them.
+
module Palette editor
+
Allows the user to open and inspect/edit a palette asset.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__tool-plugins.html b/preview/pr-1379/group__tool-plugins.html new file mode 100644 index 0000000000..649eb415ef --- /dev/null +++ b/preview/pr-1379/group__tool-plugins.html @@ -0,0 +1,182 @@ + + + + + Engine » Tools module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools module

+

Adds various debugging tool plugins.

+ +

Most of these tools provide their own ImGui windows which can be toggled with the toolbox-plugin.

+
+

Modules

+
+
module Collider Gizmos
+
Draws gizmos for colliders of selected entities.
+
module Console
+
Displays the log messages in an ImGui window.
+
module Debug Camera
+
Adds a toggleable debug camera.
+
module ECS Statistics
+
Shows tons of statistics and information about the internal state of the ECS.
+
module Entity Inspector
+
Allows inspecting and modifying the components of the current Selection.
+
module Metrics Panel
+
Shows some useful performance metrics through a ImGui window.
+
module Play Pause
+
Allows changing the current simulation speed, or even pause it.
+
module Selection
+
Adds a resource which keeps track of what the current selection is.
+
module Settings Inspector
+
Allows inspecting the current setting values through a ImGui window.
+
module Toolbox
+
Allows toggling the visibility of other tools.
+
module Transform Gizmo
+
Adds a gizmo that allows changing the selected entity's position.
+
module World Inspector
+
Shows all of the entities in the world, and allows selecting them.
+
+
+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto toolsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void toolsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__toolbox-tool-plugin.html b/preview/pr-1379/group__toolbox-tool-plugin.html new file mode 100644 index 0000000000..430d00d916 --- /dev/null +++ b/preview/pr-1379/group__toolbox-tool-plugin.html @@ -0,0 +1,165 @@ + + + + + Engine » Tools » Toolbox module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Toolbox module

+

Allows toggling the visibility of other tools.

+ +

Most tools in the Tools module rely on the Toolbox to keep track of whether they are open or not.

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
file toolbox.hpp
+
Resource cubos::engine::Toolbox.
+
+
+
+

Classes

+
+
+ class cubos::engine::Toolbox +
+
Manages the visibility of each tool.
+
+
+
+

Functions

+
+
+ auto toolboxPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void toolboxPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__transform-gizmo-tool-plugin.html b/preview/pr-1379/group__transform-gizmo-tool-plugin.html new file mode 100644 index 0000000000..29b9a77bd3 --- /dev/null +++ b/preview/pr-1379/group__transform-gizmo-tool-plugin.html @@ -0,0 +1,154 @@ + + + + + Engine » Tools » Transform Gizmo module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + Transform Gizmo module

+

Adds a gizmo that allows changing the selected entity's position.

+ +

Settings

  • "transformGizmo.useLocalAxis" - whether to use local instead of global axis (default: true).
  • "transformGizmo.distanceToCamera" - distance at which the gizmo is drawn, the larger the value the smaller the gizmo will be (default: 10).
+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto transformGizmoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void transformGizmoPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__transform-plugin.html b/preview/pr-1379/group__transform-plugin.html new file mode 100644 index 0000000000..194901cd21 --- /dev/null +++ b/preview/pr-1379/group__transform-plugin.html @@ -0,0 +1,196 @@ + + + + + Engine » Transform module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Transform module

+

Adds transform components which assign positions, rotations and scaling to entities.

+ +

This plugin operates on entities with LocalToWorld and LocalToParent components, and any combination of the Position, Rotation and Scale components. For example, if you have an entity which doesn't need rotation, but has a position and a scale, you do not need to add the Rotation component, and its transform will still be updated.

Components

  • LocalToParent - holds the local to parent transform matrix.
  • LocalToWorld - holds the local to world transform matrix.
  • Position - holds the position of an entity.
  • Rotation - holds the rotation of an entity.
  • Scale - holds the scaling of an entity.

Relations

  • ChildOf - tree like relation which indicates an entity is a child of another.
+
+

Files

+
+
file child_of.hpp
+
Relation cubos::engine::ChildOf.
+
file local_to_parent.hpp
+
Component cubos::engine::LocalToParent.
+
file local_to_world.hpp
+
Component cubos::engine::LocalToWorld.
+
file plugin.hpp
+
Plugin entry point.
+
file position.hpp
+
Component cubos::engine::Position.
+
file rotation.hpp
+
Component cubos::engine::Rotation.
+
file scale.hpp
+
Component cubos::engine::Scale.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ChildOf +
+
Tree relation which indicates the 'from' entity is a child of the 'to' entity.
+
+ struct cubos::engine::LocalToParent +
+
Component which stores the transformation matrix of an entity, from local to parent space.
+
+ struct cubos::engine::LocalToWorld +
+
Component which stores the transformation matrix of an entity, from local to world space.
+
+ struct cubos::engine::Position +
+
Component which assigns a position to an entity.
+
+ struct cubos::engine::Rotation +
+
Component which assigns a rotation to an entity.
+
+ struct cubos::engine::Scale +
+
Component which assigns a uniform scale to an entity.
+
+
+
+

Functions

+
+
+ auto transformPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void transformPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__ui-canvas-plugin.html b/preview/pr-1379/group__ui-canvas-plugin.html new file mode 100644 index 0000000000..1b1cb966bb --- /dev/null +++ b/preview/pr-1379/group__ui-canvas-plugin.html @@ -0,0 +1,236 @@ + + + + + Engine » UI » Canvas module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + UI » + Canvas module

+

Adds the core UI functionality and rendering logic.

+ +

Architecture

The two main UI components are UIElement and UICanvas. For it to work properly, each UIElement must be a child of a UICanvas, or of another UIElement.

Each UIElement generates a list of drawing commands, UIDrawList, that are then pooled together by the UICanvas at the root of the hierarchy.

Each entry in a draw list contains a UIDrawList::Type and a UIDrawList::Command. The Type holds information that is common for all similar commands, and the Command contains the specifics to that one command. Each entry also has a raw data buffer to hold the data the command needs to pass to the shaders.

After aggregating the draw commands, the UICanvas draws them, grouped by type.

Check out UI for the an example of the UI plugin in use.

+
+

Files

+
+
file canvas.hpp
+
Component cubos::engine::UICanvas.
+
file draw_list.hpp
+
Class cubos::engine::UIDrawList.
+
file element.hpp
+
Component cubos::engine::UIElement.
+
file expand.hpp
+
Component cubos::engine::UIExpand.
+
file horizontal_stretch.hpp
+
Component cubos::engine::UIHorizontalStretch.
+
file keep_pixel_size.hpp
+
Component cubos::engine::UIKeepPixelSize.
+
file match_height.hpp
+
Component cubos::engine::UIMatchHeight.
+
file match_width.hpp
+
Component cubos::engine::UIMatchWidth.
+
file native_aspect_ratio.hpp
+
Component cubos::engine::UINativeAspectRatio.
+
file plugin.hpp
+
Plugin entry point.
+
file vertical_stretch.hpp
+
Component cubos::engine::UIVerticalStretch.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UICanvas +
+
Component which represents a target for UI rendering.
+
+ class cubos::engine::UIDrawList +
+
Holds a collections of draw commands and their data.
+
+ struct cubos::engine::UIDrawList::Type +
+
Describes a UI draw call type.
+
+ struct cubos::engine::UIDrawList::Command +
+
Describes a UI draw instruction.
+
+ struct cubos::engine::UIDrawList::Entry +
+
Describes a draw commands and how it fits into the draw list carrying it.
+
+ class cubos::engine::UIDrawList::EntryBuilder +
+
Builds an Entry.
+
+ struct cubos::engine::UIElement +
+
Component which defines the space an element of the UI occupies as a rect.
+
+ struct cubos::engine::UIExpand +
+
Component which makes a UI canvas scale to maintain proportions, choosing the dimension which reduces the element sizes on screen.
+
+ struct cubos::engine::UIHorizontalStretch +
+
Component which makes a UI element fit horizontally to its parent.
+
+ struct cubos::engine::UIKeepPixelSize +
+
Component which makes a UI canvas scale to keep its elements at the same pixel size.
+
+ struct cubos::engine::UIMatchHeight +
+
Component which makes a UI canvas scale to maintain vertical proportions.
+
+ struct cubos::engine::UIMatchWidth +
+
Component which makes a UI canvas scale to maintain horizontal proportions.
+
+ struct cubos::engine::UINativeAspectRatio +
+
Component which makes a UI element keep the aspect ratio of its source.
+
+ struct cubos::engine::UIVerticalStretch +
+
Component which makes a UI element fit vertically to its parent.
+
+
+
+

Functions

+
+
+ auto uiCanvasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void uiCanvasPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__ui-color-rect-plugin.html b/preview/pr-1379/group__ui-color-rect-plugin.html new file mode 100644 index 0000000000..2cea716ca4 --- /dev/null +++ b/preview/pr-1379/group__ui-color-rect-plugin.html @@ -0,0 +1,164 @@ + + + + + Engine » UI » Color Rect module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + UI » + Color Rect module

+

Adds color rectangle elements.

+ +
+

Files

+
+
file color_rect.hpp
+
Component cubos::engine::UIColorRect.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIColorRect +
+
Component that draws a UI element as a solid color.
+
+
+
+

Functions

+
+
+ auto colorRectPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void colorRectPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__ui-image-plugin.html b/preview/pr-1379/group__ui-image-plugin.html new file mode 100644 index 0000000000..4f6fb654b0 --- /dev/null +++ b/preview/pr-1379/group__ui-image-plugin.html @@ -0,0 +1,164 @@ + + + + + Engine » UI » Color Rect module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + UI » + Color Rect module

+

Adds image element to UI.

+ +
+

Files

+
+
file image.hpp
+
Component cubos::engine::UIImage.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIImage +
+
Component used to draw images on the UI.
+
+
+
+

Functions

+
+
+ auto uiImagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void uiImagePlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__ui-plugins.html b/preview/pr-1379/group__ui-plugins.html new file mode 100644 index 0000000000..8507609dbc --- /dev/null +++ b/preview/pr-1379/group__ui-plugins.html @@ -0,0 +1,124 @@ + + + + + Engine » UI module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + UI module

+

Provides plugins for graphical user interfaces.

+ +
+

Modules

+
+
module Canvas
+
Adds the core UI functionality and rendering logic.
+
module Color Rect
+
Adds color rectangle elements.
+
module Color Rect
+
Adds image element to UI.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__voxels-plugin.html b/preview/pr-1379/group__voxels-plugin.html new file mode 100644 index 0000000000..7d34899fd9 --- /dev/null +++ b/preview/pr-1379/group__voxels-plugin.html @@ -0,0 +1,194 @@ + + + + + Engine » Voxels module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Voxels module

+

Adds grid and palette assets to Cubos.

+ +

Bridges

Dependencies

+
+

Files

+
+
file grid.hpp
+
Class cubos::engine::VoxelGrid.
+
file grid_bridge.hpp
+
Class cubos::engine::GridBridge.
+
file material.hpp
+
Class cubos::engine::VoxelMaterial.
+
file model.hpp
+
Class cubos::engine::VoxelModel.
+
file model_bridge.hpp
+
Class cubos::engine::VoxelModelBridge.
+
file palette.hpp
+
Class cubos::engine::VoxelPalette.
+
file palette_bridge.hpp
+
Class cubos::engine::PaletteBridge.
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Classes

+
+
+ class cubos::engine::VoxelGrid +
+
Represents a voxel object using a 3D grid.
+
+ class cubos::engine::VoxelGridBridge +
+
Bridge which loads and saves Grid assets.
+
+ struct cubos::engine::VoxelMaterial +
+
Describes a voxel material.
+
+ class cubos::engine::VoxelModel +
+
Holds the data loaded from voxel model files, such as Qubicle models.
+
+ class cubos::engine::VoxelPalette +
+
Holds a palette of materials. Supports up to 65535 materials.
+
+
+
+

Functions

+
+
+ auto voxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void voxelsPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__window-plugin.html b/preview/pr-1379/group__window-plugin.html new file mode 100644 index 0000000000..75ed4d8190 --- /dev/null +++ b/preview/pr-1379/group__window-plugin.html @@ -0,0 +1,156 @@ + + + + + Engine » Window module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Window module

+

Creates and handles the lifecycle of a window.

+ +

Initially sets ShouldQuit to false, and sets it to true only when the window is closed.

Settings

  • window.title - the window's title (default: Cubos).
  • window.width - the window's width (default: 800).
  • window.height - the window's height (default: 600).
  • window.vSync - whether vertical synchronization is enabled (default: true).

Events

Resources

Dependencies

+
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto windowPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void windowPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/group__world-inspector-tool-plugin.html b/preview/pr-1379/group__world-inspector-tool-plugin.html new file mode 100644 index 0000000000..f9dbf0384f --- /dev/null +++ b/preview/pr-1379/group__world-inspector-tool-plugin.html @@ -0,0 +1,152 @@ + + + + + Engine » Tools » World Inspector module | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Engine » + Tools » + World Inspector module

+

Shows all of the entities in the world, and allows selecting them.

+ +
+

Files

+
+
file plugin.hpp
+
Plugin entry point.
+
+
+
+

Functions

+
+
+ auto worldInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ CUBOS_ENGINE_API void worldInspectorPlugin(Cubos& cubos) + +

+

Plugin entry function.

+ + + + + + + + + + +
Parameters
cubosCubos main class
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/guards_8hpp.html b/preview/pr-1379/guards_8hpp.html new file mode 100644 index 0000000000..e960774b3d --- /dev/null +++ b/preview/pr-1379/guards_8hpp.html @@ -0,0 +1,140 @@ + + + + + core/memory/guards.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/guards.hpp file +

+

Classes cubos::core::memory::ReadGuard and cubos::core::memory::WriteGuard.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+
template<typename T, typename Lock>
+ class cubos::core::memory::ReadGuard +
+
Provides safe read-only access to an object using a lock.
+
+
template<typename T, typename Lock>
+ class cubos::core::memory::WriteGuard +
+
Provides safe read-write access to an object using a lock.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/hash_8hpp.html b/preview/pr-1379/hash_8hpp.html new file mode 100644 index 0000000000..2f813174a1 --- /dev/null +++ b/preview/pr-1379/hash_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/entity/hash.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/entity/hash.hpp file +

+

Struct cubos::core::ecs::EntityHash.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::EntityHash +
+
Used to hash Entity objects.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/hdr_8hpp.html b/preview/pr-1379/hdr_8hpp.html new file mode 100644 index 0000000000..86dc3fd752 --- /dev/null +++ b/preview/pr-1379/hdr_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/hdr/hdr.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/hdr/hdr.hpp file +

+

Component cubos::engine::HDR.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::HDR +
+
Component which stores the HDR texture of a render target.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/horizontal__stretch_8hpp.html b/preview/pr-1379/horizontal__stretch_8hpp.html new file mode 100644 index 0000000000..5ad408042d --- /dev/null +++ b/preview/pr-1379/horizontal__stretch_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/horizontal_stretch.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/horizontal_stretch.hpp file +

+

Component cubos::engine::UIHorizontalStretch.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIHorizontalStretch +
+
Component which makes a UI element fit horizontally to its parent.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/image_2bridge_8hpp.html b/preview/pr-1379/image_2bridge_8hpp.html new file mode 100644 index 0000000000..f893ce0b0c --- /dev/null +++ b/preview/pr-1379/image_2bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/image/bridge.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/image/bridge.hpp file +

+

Class cubos::engine::ImageBridge.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::ImageBridge +
+
Bridge which loads and saves Image assets.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/image_2image_8hpp.html b/preview/pr-1379/image_2image_8hpp.html new file mode 100644 index 0000000000..13a1937559 --- /dev/null +++ b/preview/pr-1379/image_2image_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/image/image.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/image/image.hpp file +

+

Class cubos::engine::Image.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Image +
+
Asset containing raw Image data.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/img1.png b/preview/pr-1379/img1.png new file mode 100644 index 0000000000..9133dfe375 Binary files /dev/null and b/preview/pr-1379/img1.png differ diff --git a/preview/pr-1379/img2.png b/preview/pr-1379/img2.png new file mode 100644 index 0000000000..7ac6b5daa8 Binary files /dev/null and b/preview/pr-1379/img2.png differ diff --git a/preview/pr-1379/imgui_2target_8hpp.html b/preview/pr-1379/imgui_2target_8hpp.html new file mode 100644 index 0000000000..e741ba5a24 --- /dev/null +++ b/preview/pr-1379/imgui_2target_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/imgui/target.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/imgui/target.hpp file +

+

Component cubos::engine::ImGuiTarget.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::ImGuiTarget +
+
Component used to indicate that the ImGui frame should be rendered to a given RenderTarget.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/impulse_8hpp.html b/preview/pr-1379/impulse_8hpp.html new file mode 100644 index 0000000000..d3f6c3b0a7 --- /dev/null +++ b/preview/pr-1379/impulse_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/impulse.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/impulse.hpp file +

+

Component cubos::engine::Impulse.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Impulse +
+
Component which holds impulses applied on a particle.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/index.html b/preview/pr-1379/index.html new file mode 100644 index 0000000000..de84d9e2c8 --- /dev/null +++ b/preview/pr-1379/index.html @@ -0,0 +1,102 @@ + + + + + Introduction | Cubos Docs + + + + + + + +
+
+
+
+
+

+ Introduction +

+

Image

Voxel based engine

Cubos aims to be a simple, but powerful game engine for PC, where everything is made out of voxels.

It is open source and free to use for any purpose. Written in modern C++ (20) and with data-oriented design in mind, its goal is to be both performant and highly flexible.

Getting started

The best way to get started is to read the getting started guide, which will guide you through the process of downloading and building the engine, as well as where to go from there.

There is also a feature guide which gives you a high-level overview of the engine's design and features. If you're just looking for a quick overview, this is the place to go. You can also take a look at the modules page, which describes each of the engine's modules.

In the examples page you can find examples on how to use specific parts of the engine.

Consider taking a look at the exercises page if you want some challenges to help you understand how to work with Cubos.

If you're looking to contribute to the project, make sure you read the contribution guidelines, which introduces you to the project's conventions and code style.

Team

Cubos is developed by a team at GameDev Técnico, a student group at Instituto Superior Técnico who make games. Our goal is to build a game engine from the ground up and have fun doing it.

Join us

If you're interested in joining us or learning more about the project, join our discord server!

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/inertia_8hpp.html b/preview/pr-1379/inertia_8hpp.html new file mode 100644 index 0000000000..88bfcb3ae2 --- /dev/null +++ b/preview/pr-1379/inertia_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/inertia.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/physics/components/inertia.hpp file +

+

Component cubos::engine::Inertia.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::Inertia +
+
Component which defines the inertia of a body.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/inherits_8hpp.html b/preview/pr-1379/inherits_8hpp.html new file mode 100644 index 0000000000..43af4e835f --- /dev/null +++ b/preview/pr-1379/inherits_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/inherits.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/traits/inherits.hpp file +

+

Class cubos::core::reflection::InheritsTrait.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+ class cubos::core::reflection::InheritsTrait +
+
Provides inheritance relationship between types.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/input_8hpp.html b/preview/pr-1379/input_8hpp.html new file mode 100644 index 0000000000..bbbf12cb3d --- /dev/null +++ b/preview/pr-1379/input_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/input/input.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/input/input.hpp file +

+

Resource cubos::engine::Input.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::Input +
+
Resource which stores the input bindings for multiple players.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/intersections_8hpp.html b/preview/pr-1379/intersections_8hpp.html new file mode 100644 index 0000000000..fec25bdfbe --- /dev/null +++ b/preview/pr-1379/intersections_8hpp.html @@ -0,0 +1,162 @@ + + + + + core/geom/intersections.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/geom/intersections.hpp file +

+

Class cubos::core::geom::Intersections.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::geom
+
Geometry module.
+
+
+
+

Classes

+
+
+ struct cubos::core::geom::Intersection +
+
Contains info regarding an intersection between shapes.
+
+
+
+

Functions

+
+
+ auto intersects(const Box& box1, + const glm::mat4& localToWorld1, + const Box& box2, + const glm::mat4& localToWorld2, + Intersection& intersect) -> CUBOS_CORE_API bool +
+
Computes the intersection between two box shapes.
+
+ auto sutherlandHodgmanClipping(const std::vector<glm::vec3>& inputPolygon, + int numClipPlanes, + const cubos::core::geom::Plane* clipPlanes, + bool removeNotClipToPlane) -> CUBOS_CORE_API std::vector<glm::vec3> +
+
Performs the Sutherland-Hodgman Clipping algorithm.
+
+ auto planeEdgeIntersection(const cubos::core::geom::Plane& plane, + const glm::vec3& start, + const glm::vec3& end, + glm::vec3& outPoint) -> CUBOS_CORE_API bool +
+
Compute the intersection between a plane and an edge.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/keep__pixel__size_8hpp.html b/preview/pr-1379/keep__pixel__size_8hpp.html new file mode 100644 index 0000000000..b92a8546e9 --- /dev/null +++ b/preview/pr-1379/keep__pixel__size_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/keep_pixel_size.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/ui/canvas/keep_pixel_size.hpp file +

+

Component cubos::engine::UIKeepPixelSize.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::UIKeepPixelSize +
+
Component which makes a UI canvas scale to keep its elements at the same pixel size.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/keyboard_8hpp.html b/preview/pr-1379/keyboard_8hpp.html new file mode 100644 index 0000000000..d2fe4b95da --- /dev/null +++ b/preview/pr-1379/keyboard_8hpp.html @@ -0,0 +1,241 @@ + + + + + core/io/keyboard.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/io/keyboard.hpp file +

+

Enums cubos::core::io::Key and cubos::core::io::Modifiers.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::io
+
Input and output module.
+
+
+
+

Enums

+
+
+ enum class Key { Invalid = -1, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + Num0, + Num1, + Num2, + Num3, + Num4, + Num5, + Num6, + Num7, + Num8, + Num9, + Escape, + LControl, + LShift, + LAlt, + LSystem, + RControl, + RShift, + RAlt, + RSystem, + Menu, + LBracket, + RBracket, + SemiColon, + Comma, + Period, + Quote, + Slash, + BackSlash, + Tilde, + Equal, + Dash, + Space, + Return, + BackSpace, + Tab, + PageUp, + PageDown, + End, + Home, + Insert, + Delete, + Add, + Subtract, + Multiply, + Divide, + Left, + Right, + Up, + Down, + Numpad0, + Numpad1, + Numpad2, + Numpad3, + Numpad4, + Numpad5, + Numpad6, + Numpad7, + Numpad8, + Numpad9, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Pause, + Count } +
+
Keyboard key codes enum.
+
+ enum class Modifiers { None = 0, + Control = 1, + Shift = 2, + Alt = 4, + System = 8 } +
+
Keyboard modifier flags enum.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/level_8hpp.html b/preview/pr-1379/level_8hpp.html new file mode 100644 index 0000000000..9dda81193a --- /dev/null +++ b/preview/pr-1379/level_8hpp.html @@ -0,0 +1,190 @@ + + + + + core/tel/level.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/tel/level.hpp file +

+

Telemetry levels.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
+
+
+

Enums

+
+
+ enum class Level { Trace = CUBOS_TEL_LEVEL_TRACE, + Debug = CUBOS_TEL_LEVEL_DEBUG, + Info = CUBOS_TEL_LEVEL_INFO, + Warn = CUBOS_TEL_LEVEL_WARN, + Error = CUBOS_TEL_LEVEL_ERROR, + Critical = CUBOS_TEL_LEVEL_CRITICAL, + Off = CUBOS_TEL_LEVEL_OFF } +
+
Represents a telemetry level.
+
+
+
+

Functions

+
+
+ void level(Level level) +
+
Set telemetry level.
+
+ auto level() -> Level -> auto +
+
Get telemetry level.
+
+
+
+

Defines

+
+
+ #define CUBOS_TEL_LEVEL_TRACE +
+
Trace telemetry level, lowest telemetry level. Very verbose.
+
+ #define CUBOS_TEL_LEVEL_DEBUG +
+
Debug telemetry level. Contains logs and tracing useful for debugging, but which are not necessary in release builds.
+
+ #define CUBOS_TEL_LEVEL_INFO +
+
Information telemetry level. Contains important events that are not errors.
+
+ #define CUBOS_TEL_LEVEL_WARN +
+
Warn telemetry level. Contains events that are not errors, but which are unexpected and may be problematic.
+
+ #define CUBOS_TEL_LEVEL_ERROR +
+
Error telemetry level. Contains errors which are recoverable from.
+
+ #define CUBOS_TEL_LEVEL_CRITICAL +
+
Critical telemetry level, highest log level. Contains errors which are unrecoverable from.
+
+ #define CUBOS_TEL_LEVEL_OFF +
+
Off telemetry level, disables all logging/tracing.
+
+ #define CUBOS_TEL_LEVEL +
+
Telemetry level to compile in.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/load_8hpp.html b/preview/pr-1379/load_8hpp.html new file mode 100644 index 0000000000..26ea460c73 --- /dev/null +++ b/preview/pr-1379/load_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/voxels/load.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/voxels/load.hpp file +

+

Component cubos::engine::LoadRenderVoxels.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::LoadRenderVoxels +
+
Component used to indicate that a voxel grid should be sent to the GPU.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/local__to__parent_8hpp.html b/preview/pr-1379/local__to__parent_8hpp.html new file mode 100644 index 0000000000..88f22c7a42 --- /dev/null +++ b/preview/pr-1379/local__to__parent_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/local_to_parent.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/transform/local_to_parent.hpp file +

+

Component cubos::engine::LocalToParent.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::LocalToParent +
+
Component which stores the transformation matrix of an entity, from local to parent space.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/local__to__world_8hpp.html b/preview/pr-1379/local__to__world_8hpp.html new file mode 100644 index 0000000000..bf1e66657b --- /dev/null +++ b/preview/pr-1379/local__to__world_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/local_to_world.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/transform/local_to_world.hpp file +

+

Component cubos::engine::LocalToWorld.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::LocalToWorld +
+
Component which stores the transformation matrix of an entity, from local to world space.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/logging_8hpp.html b/preview/pr-1379/logging_8hpp.html new file mode 100644 index 0000000000..aa46544bff --- /dev/null +++ b/preview/pr-1379/logging_8hpp.html @@ -0,0 +1,351 @@ + + + + + core/tel/logging.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/tel/logging.hpp file +

+

Logging and assertion macros.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
+
+
+

Classes

+
+
+ class cubos::core::tel::Logger +
+
Singleton which holds the logging state.
+
+ struct cubos::core::tel::Logger::Location +
+
Identifies a location in the code.
+
+ struct cubos::core::tel::Logger::Timestamp +
+
A timestamp used to identify when a logging message was written.
+
+ struct cubos::core::tel::Logger::Entry +
+
Data created by a call to log.
+
+
+
+

Functions

+
+
+ void abort() +
+
Aborts the program and prints a pretty stack trace.
+
+
+
+

Defines

+
+
+ #define CUBOS_TRACE(...) +
+
Used for logging very verbose information.
+
+ #define CUBOS_DEBUG(...) +
+
Used for logging information which is useful for debugging but not necessary in release builds.
+
+ #define CUBOS_INFO(...) +
+
Used for logging information which is useful in release builds.
+
+ #define CUBOS_WARN(...) +
+
Used for logging unexpected events.
+
+ #define CUBOS_ERROR(...) +
+
Used for logging recoverable errors.
+
+ #define CUBOS_CRITICAL(...) +
+
Used for logging unrecoverable errors.
+
+ #define CUBOS_LOG(level, + ...) +
+
Used for logging messages.
+
+ #define CUBOS_FAIL(...) +
+
Aborts a program, optionally printing a critical error message.
+
+ #define CUBOS_UNREACHABLE(...) +
+
Marks a code path as supposedly unreachable. Aborts the program when reached.
+
+ #define CUBOS_TODO(...) +
+
Marks a code path as unfinished. Aborts the program when reached.
+
+ #define CUBOS_ASSERT(cond, + ...) +
+
Asserts that a condition is true, aborting the program if it is not.
+
+ #define CUBOS_ASSERT_IMP(cond, + cons, + ...) +
+
Asserts that an implication is true, aborting the program if it is not.
+
+ #define CUBOS_DEBUG_ASSERT(cond, + ...) +
+
In debug builds asserts that a condition is true, aborting the program if it is not.
+
+
+
+

Define documentation

+
+

+ #define CUBOS_TRACE(...) +

+

Used for logging very verbose information.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_DEBUG(...) +

+

Used for logging information which is useful for debugging but not necessary in release builds.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_INFO(...) +

+

Used for logging information which is useful in release builds.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_WARN(...) +

+

Used for logging unexpected events.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_ERROR(...) +

+

Used for logging recoverable errors.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_CRITICAL(...) +

+

Used for logging unrecoverable errors.

+ + + + + + + + + + +
Parameters
...Format string and arguments.
+ +
+
+

+ #define CUBOS_LOG(level, + ...) +

+

Used for logging messages.

+ + + + + + + + + + + + + + +
Parameters
levelLog level.
...Format string and arguments.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/m-dark+documentation.compiled.css b/preview/pr-1379/m-dark+documentation.compiled.css new file mode 100644 index 0000000000..7d091c2fad --- /dev/null +++ b/preview/pr-1379/m-dark+documentation.compiled.css @@ -0,0 +1,2925 @@ +/* Generated using `./postprocess.py m-dark.css m-documentation.css -o m-dark+documentation.compiled.css`. Do not edit. */ + +/* + This file is part of m.css. + + Copyright © 2017, 2018, 2019, 2020, 2021, 2022, 2023 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +*, ::before, ::after { box-sizing: border-box; } +body { margin: 0; } +.m-container { + width: 100%; + margin: auto; + padding-left: 1rem; + padding-right: 1rem; +} +.m-row { + margin-left: -1rem; + margin-right: -1rem; +} +.m-row::after { + content: ' '; + clear: both; + display: table; +} +.m-row > [class*='m-col-'] { + position: relative; + padding: 1rem; +} +[class*='m-clearfix-']::after { + display: block; + content: ' '; + clear: both; +} +[class*='m-show-'] { + display: none; +} +.m-container-inflate, :not(.m-row) > [class*='m-col-'] { + margin-bottom: 1rem; +} +.m-container-inflate:last-child, :not(.m-row) > [class*='m-col-']:last-child { + margin-bottom: 0; +} +.m-container.m-nopad, [class*='m-col-'].m-nopad, +.m-container.m-nopadx, [class*='m-col-'].m-nopadx, +.m-container.m-nopadl, [class*='m-col-'].m-nopadl { + padding-left: 0; +} +.m-container.m-nopad, [class*='m-col-'].m-nopad, +.m-container.m-nopadx, [class*='m-col-'].m-nopadx, +.m-container.m-nopadr, [class*='m-col-'].m-nopadr { + padding-right: 0; +} +[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadt { + padding-top: 0; +} +[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadb, +.m-container-inflate.m-nopadb { + padding-bottom: 0; +} +[class*='m-col-t-'] { float: left; } +.m-left-t { + padding-right: 1rem; + float: left; +} +.m-right-t, [class*='m-col-t-'].m-right-t { + padding-left: 1rem; + float: right; +} +.m-center-t, [class*='m-col-t-'].m-center-t { + float: none; +} +.m-center-t, [class*='m-col-t-'].m-center-t { + margin-left: auto; + margin-right: auto; + float: none; +} +.m-col-t-1 { width: calc(1 * 100% / 12); } +.m-col-t-2 { width: calc(2 * 100% / 12); } +.m-col-t-3 { width: calc(3 * 100% / 12); } +.m-col-t-4 { width: calc(4 * 100% / 12); } +.m-col-t-5 { width: calc(5 * 100% / 12); } +.m-col-t-6 { width: calc(6 * 100% / 12); } +.m-col-t-7 { width: calc(7 * 100% / 12); } +.m-col-t-8 { width: calc(8 * 100% / 12); } +.m-col-t-9 { width: calc(9 * 100% / 12); } +.m-col-t-10 { width: calc(10 * 100% / 12); } +.m-col-t-11 { width: calc(11 * 100% / 12); } +.m-col-t-12 { width: calc(12 * 100% / 12); } +.m-push-t-1 { left: calc(1 * 100% / 12); } +.m-push-t-2 { left: calc(2 * 100% / 12); } +.m-push-t-3 { left: calc(3 * 100% / 12); } +.m-push-t-4 { left: calc(4 * 100% / 12); } +.m-push-t-5 { left: calc(5 * 100% / 12); } +.m-push-t-6 { left: calc(6 * 100% / 12); } +.m-push-t-7 { left: calc(7 * 100% / 12); } +.m-push-t-8 { left: calc(8 * 100% / 12); } +.m-push-t-9 { left: calc(9 * 100% / 12); } +.m-push-t-10 { left: calc(10 * 100% / 12); } +.m-push-t-11 { left: calc(11 * 100% / 12); } +.m-pull-t-1 { right: calc(1 * 100% / 12); } +.m-pull-t-2 { right: calc(2 * 100% / 12); } +.m-pull-t-3 { right: calc(3 * 100% / 12); } +.m-pull-t-4 { right: calc(4 * 100% / 12); } +.m-pull-t-5 { right: calc(5 * 100% / 12); } +.m-pull-t-6 { right: calc(6 * 100% / 12); } +.m-pull-t-7 { right: calc(7 * 100% / 12); } +.m-pull-t-8 { right: calc(8 * 100% / 12); } +.m-pull-t-9 { right: calc(9 * 100% / 12); } +.m-pull-t-10 { right: calc(10 * 100% / 12); } +.m-pull-t-11 { right: calc(11 * 100% / 12); } +@media screen and (min-width: 576px) { + .m-container { width: 560px; } + .m-container-inflatable .m-col-s-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-s-10 .m-container-inflate.m-left-s { + margin-left: -10%; + } + .m-container-inflatable .m-col-s-10 .m-container-inflate.m-right-s { + margin-right: -10%; + } + [class*='m-col-s-'] { float: left; } + .m-left-s { + padding-right: 1rem; + float: left; + } + .m-right-s, [class*='m-col-s-'].m-right-s { + padding-left: 1rem; + float: right; + } + .m-center-s, [class*='m-col-s-'].m-center-s { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-s-1 { width: calc(1 * 100% / 12); } + .m-col-s-2 { width: calc(2 * 100% / 12); } + .m-col-s-3 { width: calc(3 * 100% / 12); } + .m-col-s-4 { width: calc(4 * 100% / 12); } + .m-col-s-5 { width: calc(5 * 100% / 12); } + .m-col-s-6 { width: calc(6 * 100% / 12); } + .m-col-s-7 { width: calc(7 * 100% / 12); } + .m-col-s-8 { width: calc(8 * 100% / 12); } + .m-col-s-9 { width: calc(9 * 100% / 12); } + .m-col-s-10 { width: calc(10 * 100% / 12); } + .m-col-s-11 { width: calc(11 * 100% / 12); } + .m-col-s-12 { width: calc(12 * 100% / 12); } + .m-push-s-0 { left: calc(0 * 100% / 12); } + .m-push-s-1 { left: calc(1 * 100% / 12); } + .m-push-s-2 { left: calc(2 * 100% / 12); } + .m-push-s-3 { left: calc(3 * 100% / 12); } + .m-push-s-4 { left: calc(4 * 100% / 12); } + .m-push-s-5 { left: calc(5 * 100% / 12); } + .m-push-s-6 { left: calc(6 * 100% / 12); } + .m-push-s-7 { left: calc(7 * 100% / 12); } + .m-push-s-8 { left: calc(8 * 100% / 12); } + .m-push-s-9 { left: calc(9 * 100% / 12); } + .m-push-s-10 { left: calc(10 * 100% / 12); } + .m-push-s-11 { left: calc(11 * 100% / 12); } + .m-pull-s-0 { right: calc(0 * 100% / 12); } + .m-pull-s-1 { right: calc(1 * 100% / 12); } + .m-pull-s-2 { right: calc(2 * 100% / 12); } + .m-pull-s-3 { right: calc(3 * 100% / 12); } + .m-pull-s-4 { right: calc(4 * 100% / 12); } + .m-pull-s-5 { right: calc(5 * 100% / 12); } + .m-pull-s-6 { right: calc(6 * 100% / 12); } + .m-pull-s-7 { right: calc(7 * 100% / 12); } + .m-pull-s-8 { right: calc(8 * 100% / 12); } + .m-pull-s-9 { right: calc(9 * 100% / 12); } + .m-pull-s-10 { right: calc(10 * 100% / 12); } + .m-pull-s-11 { right: calc(11 * 100% / 12); } + .m-clearfix-t::after { display: none; } + .m-hide-s { display: none; } + .m-show-s { display: block; } + .m-col-s-none { + width: auto; + float: none; + } +} +@media screen and (min-width: 768px) { + .m-container { width: 750px; } + .m-container-inflatable .m-col-m-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-m-10 .m-container-inflate.m-left-m { + margin-left: -10%; + } + .m-container-inflatable .m-col-m-10 .m-container-inflate.m-right-m { + margin-right: -10%; + } + [class*='m-col-m-'] { float: left; } + .m-left-m { + padding-right: 1rem; + float: left; + } + .m-right-m, [class*='m-col-m-'].m-right-m { + padding-left: 1rem; + float: right; + } + .m-center-m, [class*='m-col-m-'].m-center-m { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-m-1 { width: calc(1 * 100% / 12); } + .m-col-m-2 { width: calc(2 * 100% / 12); } + .m-col-m-3 { width: calc(3 * 100% / 12); } + .m-col-m-4 { width: calc(4 * 100% / 12); } + .m-col-m-5 { width: calc(5 * 100% / 12); } + .m-col-m-6 { width: calc(6 * 100% / 12); } + .m-col-m-7 { width: calc(7 * 100% / 12); } + .m-col-m-8 { width: calc(8 * 100% / 12); } + .m-col-m-9 { width: calc(9 * 100% / 12); } + .m-col-m-10 { width: calc(10 * 100% / 12); } + .m-col-m-11 { width: calc(11 * 100% / 12); } + .m-col-m-12 { width: calc(12 * 100% / 12); } + .m-push-m-0 { left: calc(0 * 100% / 12); } + .m-push-m-1 { left: calc(1 * 100% / 12); } + .m-push-m-2 { left: calc(2 * 100% / 12); } + .m-push-m-3 { left: calc(3 * 100% / 12); } + .m-push-m-4 { left: calc(4 * 100% / 12); } + .m-push-m-5 { left: calc(5 * 100% / 12); } + .m-push-m-6 { left: calc(6 * 100% / 12); } + .m-push-m-7 { left: calc(7 * 100% / 12); } + .m-push-m-8 { left: calc(8 * 100% / 12); } + .m-push-m-9 { left: calc(9 * 100% / 12); } + .m-push-m-10 { left: calc(10 * 100% / 12); } + .m-push-m-11 { left: calc(11 * 100% / 12); } + .m-pull-m-0 { right: calc(0 * 100% / 12); } + .m-pull-m-1 { right: calc(1 * 100% / 12); } + .m-pull-m-2 { right: calc(2 * 100% / 12); } + .m-pull-m-3 { right: calc(3 * 100% / 12); } + .m-pull-m-4 { right: calc(4 * 100% / 12); } + .m-pull-m-5 { right: calc(5 * 100% / 12); } + .m-pull-m-6 { right: calc(6 * 100% / 12); } + .m-pull-m-7 { right: calc(7 * 100% / 12); } + .m-pull-m-8 { right: calc(8 * 100% / 12); } + .m-pull-m-9 { right: calc(9 * 100% / 12); } + .m-pull-m-10 { right: calc(10 * 100% / 12); } + .m-pull-m-11 { right: calc(11 * 100% / 12); } + .m-clearfix-s::after { display: none; } + .m-hide-m { display: none; } + .m-show-m { display: block; } + .m-col-m-none { + width: auto; + float: none; + } +} +@media screen and (min-width: 992px) { + .m-container { width: 960px; } + .m-container-inflatable .m-col-l-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { + margin-left: -10%; + margin-right: -10%; + } + .m-container-inflatable .m-col-l-10 .m-container-inflate.m-left-l { + margin-left: -10%; + } + .m-container-inflatable .m-col-l-10 .m-container-inflate.m-right-l { + margin-right: -10%; + } + [class*='m-col-l-'] { float: left; } + .m-left-l { + padding-right: 1rem; + float: left; + } + .m-right-l, [class*='m-col-l-'].m-right-l { + padding-left: 1rem; + float: right; + } + .m-center-l, [class*='m-col-l-'].m-center-l { + margin-left: auto; + margin-right: auto; + float: none; + } + .m-col-l-1 { width: calc(1 * 100% / 12); } + .m-col-l-2 { width: calc(2 * 100% / 12); } + .m-col-l-3 { width: calc(3 * 100% / 12); } + .m-col-l-4 { width: calc(4 * 100% / 12); } + .m-col-l-5 { width: calc(5 * 100% / 12); } + .m-col-l-6 { width: calc(6 * 100% / 12); } + .m-col-l-7 { width: calc(7 * 100% / 12); } + .m-col-l-8 { width: calc(8 * 100% / 12); } + .m-col-l-9 { width: calc(9 * 100% / 12); } + .m-col-l-10 { width: calc(10 * 100% / 12); } + .m-col-l-11 { width: calc(11 * 100% / 12); } + .m-col-l-12 { width: calc(12 * 100% / 12); } + .m-push-l-0 { left: calc(0 * 100% / 12); } + .m-push-l-1 { left: calc(1 * 100% / 12); } + .m-push-l-2 { left: calc(2 * 100% / 12); } + .m-push-l-3 { left: calc(3 * 100% / 12); } + .m-push-l-4 { left: calc(4 * 100% / 12); } + .m-push-l-5 { left: calc(5 * 100% / 12); } + .m-push-l-6 { left: calc(6 * 100% / 12); } + .m-push-l-7 { left: calc(7 * 100% / 12); } + .m-push-l-8 { left: calc(8 * 100% / 12); } + .m-push-l-9 { left: calc(9 * 100% / 12); } + .m-push-l-10 { left: calc(10 * 100% / 12); } + .m-push-l-11 { left: calc(11 * 100% / 12); } + .m-pull-l-0 { right: calc(0 * 100% / 12); } + .m-pull-l-1 { right: calc(1 * 100% / 12); } + .m-pull-l-2 { right: calc(2 * 100% / 12); } + .m-pull-l-3 { right: calc(3 * 100% / 12); } + .m-pull-l-4 { right: calc(4 * 100% / 12); } + .m-pull-l-5 { right: calc(5 * 100% / 12); } + .m-pull-l-6 { right: calc(6 * 100% / 12); } + .m-pull-l-7 { right: calc(7 * 100% / 12); } + .m-pull-l-8 { right: calc(8 * 100% / 12); } + .m-pull-l-9 { right: calc(9 * 100% / 12); } + .m-pull-l-10 { right: calc(10 * 100% / 12); } + .m-pull-l-11 { right: calc(11 * 100% / 12); } + .m-clearfix-m::after { display: none; } + .m-hide-l { display: none; } + .m-show-l { display: block; } + .m-col-l-none { + width: auto; + float: none; + } +} + +html { + font-size: 16px; + background-color: #2f363f; +} +body { + font-family: 'Source Sans Pro', sans-serif; + font-size: 1rem; + line-height: normal; + color: #dcdcdc; +} +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + font-weight: 600; +} +h1 { + margin-bottom: 1rem; +} +h2, h3, h4, h5, h6 { + margin-bottom: 0.5rem; +} +p, ul, ol, dl { + margin-top: 0; +} +ul, ol { + padding-left: 2rem; +} +ul ol, ul ul, ol ol, ol ul { + margin-bottom: 0; +} +main p { + text-indent: 1.5rem; + text-align: justify; +} +main p.m-noindent, li > p, dd > p, table.m-table td > p { + text-indent: 0; + text-align: left; +} +blockquote { + margin-top: 0; + margin-left: 1rem; + margin-right: 1rem; + padding: 1rem; + border-left-style: solid; + border-left-width: 0.25rem; +} +hr { + width: 75%; + border-width: 0.0625rem; + border-style: solid; +} +blockquote, hr { + border-color: #405363; +} +strong, .m-text.m-strong { font-weight: bold; } +em, .m-text.m-em { font-style: italic; } +s, .m-text.m-s { text-decoration: line-through; } +sub, sup, .m-text.m-sub, .m-text.m-sup { + font-size: 0.75rem; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup, .m-text.m-sup { top: -0.35rem; } +sub, .m-text.m-sub { bottom: -0.2rem; } +abbr { + cursor: help; + text-decoration: underline dotted; +} +a { + color: #5b9dd9; +} +a.m-flat { + text-decoration: none; +} +a:hover, a:focus, a:active { + color: #a5c9ea; +} +a img { border: 0; } +svg a { cursor: pointer; } +mark { + padding: 0.0625rem; + background-color: #c7cf2f; + color: #2f83cc; +} +.m-link-wrap { + word-break: break-all; +} +pre, code { + font-family: 'Source Code Pro', monospace, monospace, monospace; + font-size: 0.9em; + color: #e6e6e6; + background-color: #282e36; +} +pre.m-console, code.m-console { + color: #e6e6e6; + background-color: #1a1c1d; +} +pre { + padding: 0.5rem 1rem; + border-radius: 0.2rem; + overflow-x: auto; + margin-top: 0; +} +pre.m-console-wrap { + white-space: pre-wrap; + word-break: break-all; +} +code { + padding: 0.125rem; +} +*:focus { outline-color: #5b9dd9; } +div.m-scroll { + max-width: 100%; + overflow-x: auto; +} +.m-fullwidth { + width: 100%; +} +.m-spacing-150 { + line-height: 1.5rem; +} +.m-text-center, .m-text-center.m-noindent, table.m-table th.m-text-center, .m-text-center p { + text-align: center; +} +.m-text-left, .m-text-left.m-noindent, table.m-table th.m-text-left, .m-text-right p { + text-align: left; +} +.m-text-right, .m-text-right.m-noindent, table.m-table th.m-text-right, .m-text-right p { + text-align: right; +} +.m-text-top, table.m-table th.m-text-top, table.m-table td.m-text-top { + vertical-align: top; +} +.m-text-middle, table.m-table th.m-text-middle, table.m-table td.m-text-middle { + vertical-align: middle; +} +.m-text-bottom, table.m-table th.m-text-bottom, table.m-table td.m-text-bottom { + vertical-align: bottom; +} +.m-text.m-tiny { font-size: 50.0%; } +.m-text.m-small { font-size: 85.4%; } +.m-text.m-big { font-size: 117%; } +h1 .m-thin, h2 .m-thin, h3 .m-thin, h4 .m-thin, h5 .m-thin, h6 .m-thin { + font-weight: normal; +} +ul.m-unstyled, ol.m-unstyled { + list-style-type: none; + padding-left: 0; +} +ul[class*='m-block-'], ol[class*='m-block-'] { + padding-left: 0; +} +ul[class*='m-block-'] li, ol[class*='m-block-'] li { + display: inline; +} +ul[class*='m-block-bar-'] li:not(:last-child)::after, ol[class*='m-block-bar-'] li:not(:last-child)::after { + content: " | "; +} +ul[class*='m-block-dot-'] li:not(:last-child)::after, ol[class*='m-block-dot-'] li:not(:last-child)::after { + content: " • "; +} +@media screen and (min-width: 576px) { + ul.m-block-bar-s, ol.m-block-bar-s, + ul.m-block-dot-s, ol.m-block-dot-s { padding-left: 2rem; } + ul.m-block-bar-s li, ol.m-block-bar-s li, + ul.m-block-dot-s li, ol.m-block-dot-s li { display: list-item; } + ul.m-block-bar-s li:not(:last-child)::after, ol.m-block-bar-s li:not(:last-child)::after, + ul.m-block-dot-s li:not(:last-child)::after, ol.m-block-dot-s li:not(:last-child)::after { content: ""; } +} +@media screen and (min-width: 768px) { + ul.m-block-bar-m, ol.m-block-bar-m, + ul.m-block-dot-m, ol.m-block-dot-m { padding-left: 2rem; } + ul.m-block-bar-m li, ol.m-block-bar-m li, + ul.m-block-dot-m li, ol.m-block-dot-m li { display: list-item; } + ul.m-block-bar-m li:not(:last-child)::after, ol.m-block-bar-m li:not(:last-child)::after, + ul.m-block-dot-m li:not(:last-child)::after, ol.m-block-dot-m li:not(:last-child)::after { content: ""; } +} +@media screen and (min-width: 992px) { + ul.m-block-bar-l, ol.m-block-bar-l, + ul.m-block-dot-l, ol.m-block-dot-l { padding-left: 2rem; } + ul.m-block-bar-l li, ol.m-block-bar-l li, + ul.m-block-dot-l li, ol.m-block-dot-l li { display: list-item; } + ul.m-block-bar-l li:not(:last-child)::after, ol.m-block-bar-l li:not(:last-child)::after, + ul.m-block-dot-l li:not(:last-child)::after, ol.m-block-dot-l li:not(:last-child)::after { content: ""; } +} +p.m-poem { + text-indent: 0; + text-align: left; + margin-left: 1.5rem; +} +p.m-transition { + color: #405363; + text-indent: 0; + text-align: center; + font-size: 2rem; +} +dl.m-diary { + margin-bottom: 1.25rem; +} +dl.m-diary:last-child { + margin-bottom: 0.25rem; +} +dl.m-diary dt { + font-weight: bold; + width: 6rem; + float: left; + clear: both; + padding-top: 0.25rem; +} +dl.m-diary dd { + padding-top: 0.25rem; + padding-left: 6rem; + margin-left: 0; +} +a.m-footnote, dl.m-footnote dd span.m-footnote { + top: -0.35rem; + font-size: 0.75rem; + line-height: 0; + position: relative; + vertical-align: baseline; +} +a.m-footnote, dl.m-footnote dd span.m-footnote a { + text-decoration: none; +} +a.m-footnote::before { content: '['; } +a.m-footnote::after { content: ']'; } +dl.m-footnote dt { + width: 1.5rem; + float: left; + clear: both; +} +dl.m-footnote dd { + margin-left: 1.5rem; +} +dl.m-footnote { + font-size: 85.4%; +} +dl.m-footnote dd span.m-footnote a { + font-weight: bold; + font-style: italic; +} +.m-note { + border-radius: 0.2rem; + padding: 1rem; +} +.m-frame { + background-color: #2f363f; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #405363; + padding: 0.875rem; +} +.m-block { + border-style: solid; + border-width: 0.0625rem; + border-left-width: 0.25rem; + border-radius: 0.2rem; + border-color: #405363; + padding: 0.9375rem 0.9375rem 0.9375rem 0.75rem; +} +.m-block.m-badge::after { + content: ' '; + display: block; + clear: both; +} +.m-block.m-badge h3 { + margin-left: 5rem; +} +.m-block.m-badge p { + margin-left: 5rem; + text-indent: 0; +} +.m-block.m-badge img { + width: 4rem; + height: 4rem; + border-radius: 2rem; + float: left; +} +div.m-button { + text-align: center; +} +div.m-button a { + display: inline-block; + border-radius: 0.2rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + text-decoration: none; + font-size: 1.17rem; +} +div.m-button.m-fullwidth a { + display: block; + padding-left: 0.5rem; + padding-right: 0.5rem; +} +div.m-button a .m-big:first-child { + font-size: 1.37rem; + font-weight: bold; +} +div.m-button a .m-small:last-child { + font-size: 0.854rem; +} +.m-label { + border-radius: 0.2rem; + font-size: 75%; + font-weight: normal; + padding: 0.125rem 0.25rem; + vertical-align: 7.5%; +} +.m-label.m-flat { + border-width: 0.0625rem; + border-style: solid; + border-color: #747474; + padding: 0.0625rem 0.1875rem; +} +table.m-table { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; +} +table.m-table.m-big { + margin-top: 1.75rem; +} +div.m-scroll > table.m-table:last-child { + margin-bottom: 0.0625rem; +} +table.m-table:not(.m-flat) tbody tr:hover { + background-color: #405363; +} +table.m-table th, table.m-table td { + vertical-align: top; + border-style: solid; + border-top-width: 0.0625rem; + border-left-width: 0; + border-right-width: 0; + border-bottom-width: 0; + border-color: #405363; +} +table.m-table caption { + padding-bottom: 0.5rem; +} +table.m-table thead tr:first-child th, table.m-table thead tr:first-child td { + border-top-width: 0.125rem; +} +table.m-table thead th, table.m-table thead td { + border-bottom-width: 0.125rem; + vertical-align: bottom; +} +table.m-table tfoot th, table.m-table tfoot td { + border-top-width: 0.125rem; +} +table.m-table th, table.m-table td { + padding: 0.5rem; +} +table.m-table.m-big th, table.m-table.m-big td { + padding: 0.75rem 1rem; +} +table.m-table th { + text-align: left; +} +table.m-table th.m-thin { + font-weight: normal; +} +table.m-table td.m-default, table.m-table th.m-default, +table.m-table td.m-primary, table.m-table th.m-primary, +table.m-table td.m-success, table.m-table th.m-success, +table.m-table td.m-warning, table.m-table th.m-warning, +table.m-table td.m-danger, table.m-table th.m-danger, +table.m-table td.m-info, table.m-table th.m-info, +table.m-table td.m-dim, table.m-table th.m-dim { + padding-left: 0.4375rem; + padding-right: 0.4375rem; + border-left-width: 0.0625rem; +} +table.m-table.m-big td.m-default, table.m-table.m-big th.m-default, +table.m-table.m-big td.m-primary, table.m-table.m-big th.m-primary, +table.m-table.m-big td.m-success, table.m-table.m-big th.m-success, +table.m-table.m-big td.m-warning, table.m-table.m-big th.m-warning, +table.m-table.m-big td.m-danger, table.m-table.m-big th.m-danger, +table.m-table.m-big td.m-info, table.m-table.m-big th.m-info, +table.m-table.m-big td.m-dim, table.m-table.m-big th.m-dim { + padding-left: 0.9375rem; + padding-right: 0.9375rem; + border-left-width: 0.0625rem; +} +table.m-table tr.m-default td, table.m-table td.m-default, +table.m-table tr.m-default th, table.m-table th.m-default, +table.m-table tr.m-primary td, table.m-table td.m-primary, +table.m-table tr.m-primary th, table.m-table th.m-primary, +table.m-table tr.m-success td, table.m-table td.m-success, +table.m-table tr.m-success th, table.m-table th.m-success, +table.m-table tr.m-warning td, table.m-table td.m-warning, +table.m-table tr.m-warning th, table.m-table th.m-warning, +table.m-table tr.m-danger td, table.m-table td.m-danger, +table.m-table tr.m-danger th, table.m-table th.m-danger, +table.m-table tr.m-info td, table.m-table td.m-info, +table.m-table tr.m-info th, table.m-table th.m-info, +table.m-table tr.m-dim td, table.m-table td.m-dim, +table.m-table tr.m-dim th, table.m-table th.m-dim { + border-color: #2f363f; +} +.m-note pre, .m-note code, +table.m-table tr.m-default pre, table.m-table tr.m-default code, +table.m-table td.m-default pre, table.m-table td.m-default code, +table.m-table th.m-default pre, table.m-table th.m-default code, +table.m-table tr.m-primary pre, table.m-table tr.m-primary code, +table.m-table td.m-primary pre, table.m-table td.m-primary code, +table.m-table th.m-primary pre, table.m-table th.m-primary code, +table.m-table tr.m-success pre, table.m-table tr.m-success code, +table.m-table td.m-success pre, table.m-table td.m-success code, +table.m-table th.m-success pre, table.m-table th.m-success code, +table.m-table tr.m-warning pre, table.m-table tr.m-warning code, +table.m-table td.m-warning pre, table.m-table td.m-warning code, +table.m-table th.m-warning pre, table.m-table th.m-warning code, +table.m-table tr.m-danger pre, table.m-table tr.m-danger code, +table.m-table td.m-danger pre, table.m-table td.m-danger code, +table.m-table th.m-danger pre, table.m-table th.m-danger code, +table.m-table tr.m-info pre, table.m-table tr.m-info code, +table.m-table td.m-info pre, table.m-table td.m-info code, +table.m-table th.m-info pre, table.m-table th.m-info code, +table.m-table tr.m-dim pre, table.m-table tr.m-dim code, +table.m-table td.m-dim pre, table.m-table td.m-dim code, +table.m-table th.m-dim pre, table.m-table th.m-dim code { + background-color: rgba(34, 39, 46, 0.5); +} +img.m-image, svg.m-image { + display: block; + margin-left: auto; + margin-right: auto; +} +div.m-image { + text-align: center; +} +img.m-image, svg.m-image, div.m-image img, div.m-image svg { + max-width: 100%; + border-radius: 0.2rem; +} +div.m-image.m-fullwidth img, div.m-image.m-fullwidth svg { + width: 100%; +} +img.m-image.m-badge, div.m-image.m-badge img { + border-radius: 50%; +} +figure.m-figure { + max-width: 100%; + margin-top: 0; + margin-left: auto; + margin-right: auto; + position: relative; + display: table; +} +figure.m-figure::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #405363; +} +figure.m-figure.m-flat::before { + border-color: transparent; +} +figure.m-figure > * { + margin-left: 1rem; + margin-right: 1rem; + display: table-caption; + caption-side: bottom; +} +figure.m-figure > *:first-child { + display: inline; +} +figure.m-figure > *:last-child { + margin-bottom: 1rem !important; +} +figure.m-figure img, figure.m-figure svg { + position: relative; + margin-left: 0; + margin-right: 0; + margin-bottom: 0; + border-top-left-radius: 0.2rem; + border-top-right-radius: 0.2rem; + max-width: 100%; +} +figure.m-figure.m-flat img, figure.m-figure.m-flat svg { + border-bottom-left-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} +figure.m-figure a img, figure.m-figure a svg { + margin-left: -1rem; + margin-right: -1rem; +} +figure.m-figure.m-fullwidth, figure.m-figure.m-fullwidth > * { + display: block; +} +figure.m-figure.m-fullwidth > *:first-child { + display: inline; +} +figure.m-figure.m-fullwidth img, figure.m-figure.m-fullwidth svg { + width: 100%; +} +figure.m-figure.m-fullwidth::after { + content: ' '; + display: block; + margin-top: 1rem; + height: 1px; +} +.m-code-figure, .m-console-figure { + margin-top: 0; + margin-left: 0; + margin-right: 0; + position: relative; + padding: 1rem; +} +.m-code-figure::before, .m-console-figure::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; +} +.m-code-figure::before { + border-color: #282e36; +} +.m-console-figure::before { + border-color: #1a1c1d; +} +.m-code-figure.m-flat::before, .m-console-figure.m-flat::before { + border-color: transparent; +} +.m-code-figure > pre:first-child, .m-console-figure > pre:first-child { + position: relative; + margin: -1rem -1rem 1rem -1rem; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.m-code-figure > pre.m-nopad, .m-console-figure > pre.m-nopad { + margin-left: -0.875rem; + margin-right: -0.875rem; + margin-top: -1rem; + margin-bottom: -0.875rem; + padding-left: 0.875rem; +} +figure.m-figure figcaption, .m-code-figure figcaption, .m-console-figure figcaption { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + font-weight: 600; + font-size: 1.17rem; +} +figure.m-figure figcaption a, .m-code-figure figcaption a, .m-console-figure figcaption a { + text-decoration: none; +} +figure.m-figure figcaption .m-figure-description { + margin-top: 0.5rem; + font-weight: normal; + font-size: 1rem; +} +figure.m-figure figcaption .m-figure-description a { + text-decoration: underline; +} +.m-imagegrid > div { + background-color: #2f363f; +} +.m-imagegrid > div > figure { + display: block; + float: left; + position: relative; + margin: 0; +} +.m-imagegrid > div > figure > div, +.m-imagegrid > div > figure > figcaption, +.m-imagegrid > div > figure > a > div, +.m-imagegrid > div > figure > a > figcaption { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-color: #2f363f; + border-style: solid; + border-width: 0.25rem; + padding: 0.5rem; +} +.m-imagegrid > div > figure:first-child > div, +.m-imagegrid > div > figure:first-child > figcaption, +.m-imagegrid > div > figure:first-child > a > div, +.m-imagegrid > div > figure:first-child > a > figcaption { + border-left-width: 0; +} +.m-imagegrid > div > figure:last-child > div, +.m-imagegrid > div > figure:last-child > figcaption, +.m-imagegrid > div > figure:last-child > a > div, +.m-imagegrid > div > figure:last-child > a > figcaption { + border-right-width: 0; +} +.m-imagegrid > div > figure > figcaption, +.m-imagegrid > div > figure > a > figcaption { + color: transparent; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.75rem; +} +.m-imagegrid > div > figure > div::before, +.m-imagegrid > div > figure > figcaption::before, +.m-imagegrid > div > figure > a > div::before, +.m-imagegrid > div > figure > a > figcaption::before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: bottom; + width: 0; +} +.m-imagegrid > div > figure:hover > figcaption, +.m-imagegrid > div > figure:hover > a > figcaption { + background: linear-gradient(transparent 0%, transparent 75%, rgba(0, 0, 0, 0.85) 100%); + color: #ffffff; +} +.m-imagegrid > div > figure > img, +.m-imagegrid > div > figure > a > img { + width: 100%; + height: 100%; +} +.m-imagegrid > div::after { + display: block; + content: ' '; + clear: both; +} +@media screen and (max-width: 767px) { + .m-imagegrid > div > figure { + float: none; + width: 100% !important; + } + .m-imagegrid > div > figure > div, + .m-imagegrid > div > figure > figcaption, + .m-imagegrid > div > figure > a > div, + .m-imagegrid > div > figure > a > figcaption { + border-left-width: 0; + border-right-width: 0; + } +} +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-note, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-frame, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-block, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-imagegrid, +.m-container-inflatable > .m-row > [class*='m-col-'] > pre, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-code-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] > .m-console-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-note, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-frame, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-block, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-imagegrid, +.m-container-inflatable > .m-row > [class*='m-col-'] section > pre, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-code-figure, +.m-container-inflatable > .m-row > [class*='m-col-'] section > .m-console-figure, +.m-container-inflatable [class*='m-center-'] > .m-note, +.m-container-inflatable [class*='m-center-'] > .m-frame, +.m-container-inflatable [class*='m-center-'] > .m-block, +.m-container-inflatable [class*='m-center-'] > .m-imagegrid, +.m-container-inflatable [class*='m-center-'] > pre, +.m-container-inflatable [class*='m-center-'] > .m-code-figure, +.m-container-inflatable [class*='m-center-'] > .m-console-figure, +.m-container-inflatable [class*='m-left-'] > .m-note, +.m-container-inflatable [class*='m-left-'] > .m-frame, +.m-container-inflatable [class*='m-left-'] > .m-block, +.m-container-inflatable [class*='m-left-'] > .m-imagegrid, +.m-container-inflatable [class*='m-left-'] > pre, +.m-container-inflatable [class*='m-left-'] > .m-code-figure, +.m-container-inflatable [class*='m-left-'] > .m-console-figure, +.m-container-inflatable [class*='m-right-'] > .m-note, +.m-container-inflatable [class*='m-right-'] > .m-frame, +.m-container-inflatable [class*='m-right-'] > .m-block, +.m-container-inflatable [class*='m-right-'] > .m-imagegrid, +.m-container-inflatable [class*='m-right-'] > pre, +.m-container-inflatable [class*='m-right-'] > .m-code-figure, +.m-container-inflatable [class*='m-right-'] > .m-console-figure, +.m-container-inflatable .m-container-inflate > .m-note, +.m-container-inflatable .m-container-inflate > .m-frame, +.m-container-inflatable .m-container-inflate > .m-block, +.m-container-inflatable .m-container-inflate > .m-imagegrid, +.m-container-inflatable .m-container-inflate > pre, +.m-container-inflatable .m-container-inflate > .m-code-figure, +.m-container-inflatable .m-container-inflate > .m-console-figure +{ + margin-left: -1rem; + margin-right: -1rem; +} +@media screen and (min-width: 576px) { + .m-container-inflatable .m-center-s > .m-note, + .m-container-inflatable .m-center-s > .m-frame, + .m-container-inflatable .m-center-s > .m-block, + .m-container-inflatable .m-center-s > .m-imagegrid, + .m-container-inflatable .m-center-s > pre, + .m-container-inflatable .m-center-s > .m-code-figure, + .m-container-inflatable .m-center-s > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-s > .m-note, + .m-container-inflatable .m-left-s > .m-frame, + .m-container-inflatable .m-left-s > .m-block, + .m-container-inflatable .m-left-s > .m-imagegrid, + .m-container-inflatable .m-left-s > pre, + .m-container-inflatable .m-left-s > .m-code-figure, + .m-container-inflatable .m-left-s > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-s > .m-note, + .m-container-inflatable .m-right-s > .m-frame, + .m-container-inflatable .m-right-s > .m-block, + .m-container-inflatable .m-right-s > .m-imagegrid, + .m-container-inflatable .m-right-s > pre, + .m-container-inflatable .m-right-s > .m-code-figure, + .m-container-inflatable .m-right-s > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-s-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-s-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable .m-center-m > .m-note, + .m-container-inflatable .m-center-m > .m-frame, + .m-container-inflatable .m-center-m > .m-block, + .m-container-inflatable .m-center-m > .m-imagegrid, + .m-container-inflatable .m-center-m > pre, + .m-container-inflatable .m-center-m > .m-code-figure, + .m-container-inflatable .m-center-m > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-m > .m-note, + .m-container-inflatable .m-left-m > .m-frame, + .m-container-inflatable .m-left-m > .m-block, + .m-container-inflatable .m-left-m > .m-imagegrid, + .m-container-inflatable .m-left-m > pre, + .m-container-inflatable .m-left-m > .m-code-figure, + .m-container-inflatable .m-left-m > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-m > .m-note, + .m-container-inflatable .m-right-m > .m-frame, + .m-container-inflatable .m-right-m > .m-block, + .m-container-inflatable .m-right-m > .m-imagegrid, + .m-container-inflatable .m-right-m > pre, + .m-container-inflatable .m-right-m > .m-code-figure, + .m-container-inflatable .m-right-m > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-m-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-m-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable .m-center-l > .m-note, + .m-container-inflatable .m-center-l > .m-frame, + .m-container-inflatable .m-center-l > .m-block, + .m-container-inflatable .m-center-l > .m-imagegrid, + .m-container-inflatable .m-center-l > pre, + .m-container-inflatable .m-center-l > .m-code-figure, + .m-container-inflatable .m-center-l > .m-console-figure { + margin-left: -1rem; + margin-right: -1rem; + } + .m-container-inflatable .m-left-l > .m-note, + .m-container-inflatable .m-left-l > .m-frame, + .m-container-inflatable .m-left-l > .m-block, + .m-container-inflatable .m-left-l > .m-imagegrid, + .m-container-inflatable .m-left-l > pre, + .m-container-inflatable .m-left-l > .m-code-figure, + .m-container-inflatable .m-left-l > .m-console-figure { + margin-left: -1rem; + margin-right: 0; + } + .m-container-inflatable .m-right-l > .m-note, + .m-container-inflatable .m-right-l > .m-frame, + .m-container-inflatable .m-right-l > .m-block, + .m-container-inflatable .m-right-l > .m-imagegrid, + .m-container-inflatable .m-right-l > pre, + .m-container-inflatable .m-right-l > .m-code-figure, + .m-container-inflatable .m-right-l > .m-console-figure { + margin-left: 0; + margin-right: -1rem; + } + .m-container-inflatable > .m-row > .m-col-l-10 > .m-imagegrid.m-container-inflate, + .m-container-inflatable > .m-row > .m-col-l-10 section > .m-imagegrid.m-container-inflate { + margin-left: -10%; + margin-right: -10%; + } +} +pre.m-code span.hll { + margin-left: -1.0rem; + margin-right: -1.0rem; + padding-left: 1.0rem; +} +.m-code.m-inverted > span, .m-console.m-inverted > span { + opacity: 0.3333; +} +.m-code.m-inverted > span.hll, .m-console.m-inverted > span.hll { + opacity: 1; + background-color: transparent; + border-color: transparent; +} +.m-code.m-inverted { color: rgba(230, 230, 230, 0.33); } +.m-console.m-inverted { color: rgba(230, 230, 230, 0.33); } +.m-code.m-inverted > span.hll { color: #e6e6e6; } +.m-cosole.m-inverted > span.hll { color: #e6e6e6; } +.m-code-color { + display: inline-block; + width: 0.75rem; + height: 0.75rem; + vertical-align: -0.05rem; + margin-left: 0.2rem; + margin-right: 0.1rem; + border-radius: 0.1rem; +} +div.m-math { + overflow-x: auto; + overflow-y: hidden; +} +div.m-math svg { + margin-left: auto; + margin-right: auto; + display: block; +} +div.m-button a svg.m-math { fill: #22272e; } +div.m-button.m-flat a svg.m-math { fill: #dcdcdc; } +div.m-button.m-flat a:hover svg.m-math, div.m-button.m-default a:focus svg.m-math, +div.m-button.m-default a:active svg.m-math { + fill: #a5c9ea; +} +.m-graph { font-size: 16px; } +div.m-plot svg, div.m-graph svg { + max-width: 100%; + margin-left: auto; + margin-right: auto; + display: block; +} +div.m-plot .m-background { fill: #34424d; } +div.m-plot svg .m-label { font-size: 11px; } +div.m-plot svg .m-title { font-size: 13px; } +div.m-plot svg .m-label, div.m-plot svg .m-title { fill: #dcdcdc; } +div.m-plot svg .m-line { + stroke: #dcdcdc; + stroke-width: 0.8; +} +div.m-plot svg .m-error { + stroke: #ffffff; + stroke-width: 1.5; +} +div.m-plot svg .m-label.m-dim { fill: #747474; } +.m-graph g.m-edge path, .m-graph g.m-cluster polygon, +.m-graph g.m-node.m-flat ellipse, +.m-graph g.m-node.m-flat polygon { + fill: none; +} +.m-graph g.m-node:not(.m-flat) text { + fill: #22272e; +} +figure.m-figure > svg.m-math:first-child, +figure.m-figure > svg.m-graph:first-child { + padding: 1rem; + box-sizing: content-box; +} +figure.m-figure:not(.m-flat) > svg.m-math:first-child, +figure.m-figure:not(.m-flat) > svg.m-graph:first-child { + background-color: #405363; +} +.m-block.m-default { border-left-color: #405363; } +.m-block.m-default h3, .m-block.m-default h4, .m-block.m-default h5, .m-block.m-default h6, +.m-text.m-default, .m-label.m-flat.m-default { + color: #dcdcdc; +} +.m-block.m-default h3 a, .m-block.m-default h4 a, .m-block.m-default h5 a, .m-block.m-default h6 a { + color: #5b9dd9; +} +.m-block.m-primary { border-left-color: #a5c9ea; } +.m-block.m-primary h3, .m-block.m-primary h4, .m-block.m-primary h5, .m-block.m-primary h6, +.m-block.m-primary h3 a, .m-block.m-primary h4 a, .m-block.m-primary h5 a, .m-block.m-primary h6 a, +.m-text.m-primary, .m-label.m-flat.m-primary { + color: #a5c9ea; +} +.m-block.m-success { border-left-color: #3bd267; } +.m-block.m-success h3, .m-block.m-success h4, .m-block.m-success h5, .m-block.m-success h6, +.m-block.m-success h3 a, .m-block.m-success h4 a, .m-block.m-success h5 a, .m-block.m-success h6 a, +.m-text.m-success, .m-label.m-flat.m-success { + color: #3bd267; +} +.m-block.m-warning { border-left-color: #c7cf2f; } +.m-block.m-warning h3, .m-block.m-warning h4, .m-block.m-warning h5, .m-block.m-warning h6, +.m-block.m-warning h3 a, .m-block.m-warning h4 a, .m-block.m-warning h5 a, .m-block.m-warning h6 a, +.m-text.m-warning, .m-label.m-flat.m-warning { + color: #c7cf2f; +} +.m-block.m-danger { border-left-color: #cd3431; } +.m-block.m-danger h3, .m-block.m-danger h4, .m-block.m-danger h5, .m-block.m-danger h6, +.m-block.m-danger h3 a, .m-block.m-danger h4 a, .m-block.m-danger h5 a, .m-block.m-danger h6 a, +.m-text.m-danger, .m-label.m-flat.m-danger { + color: #cd3431; +} +.m-block.m-info { border-left-color: #2f83cc; } +.m-block.m-info h3, .m-block.m-info h4, .m-block.m-info h5, .m-block.m-info h6, +.m-block.m-info h3 a, .m-block.m-info h4 a, .m-block.m-info h5 a, .m-block.m-info h6 a, +.m-text.m-info, .m-label.m-flat.m-info { + color: #2f83cc; +} +.m-block.m-dim { border-left-color: #747474; } +.m-block.m-dim, .m-text.m-dim, .m-label.m-flat.m-dim { + color: #747474; +} +.m-block.m-dim a, .m-text.m-dim a { color: #acacac; } +.m-block.m-dim a:hover, .m-block.m-dim a:focus, .m-block.m-dim a:active, +.m-text.m-dim a:hover, .m-text.m-dim a:focus, .m-text.m-dim a:active { + color: #747474; +} +.m-block.m-flat { border-color: transparent; } +.m-block.m-flat h3, .m-block.m-flat h4, .m-block.m-flat h5, .m-block.m-flat h6 { + color: #dcdcdc; +} +.m-block.m-default h3 a:hover, .m-block.m-default h3 a:focus, .m-block.m-default h3 a:active, +.m-block.m-default h4 a:hover, .m-block.m-default h4 a:focus, .m-block.m-default h4 a:active, +.m-block.m-default h5 a:hover, .m-block.m-default h5 a:focus, .m-block.m-default h5 a:active, +.m-block.m-default h6 a:hover, .m-block.m-default h6 a:focus, .m-block.m-default h6 a:active { + color: #a5c9ea; +} +.m-block.m-primary h3 a:hover, .m-block.m-primary h3 a:focus, .m-block.m-primary h3 a:active, +.m-block.m-primary h4 a:hover, .m-block.m-primary h4 a:focus, .m-block.m-primary h4 a:active, +.m-block.m-primary h5 a:hover, .m-block.m-primary h5 a:focus, .m-block.m-primary h5 a:active, +.m-block.m-primary h6 a:hover, .m-block.m-primary h6 a:focus, .m-block.m-primary h6 a:active { + color: #dcdcdc; +} +.m-block.m-success h3 a:hover, .m-block.m-success h3 a:focus, .m-block.m-success h3 a:active, +.m-block.m-success h4 a:hover, .m-block.m-success h4 a:focus, .m-block.m-success h4 a:active, +.m-block.m-success h5 a:hover, .m-block.m-success h5 a:focus, .m-block.m-success h5 a:active, +.m-block.m-success h6 a:hover, .m-block.m-success h6 a:focus, .m-block.m-success h6 a:active { + color: #acecbe; +} +.m-block.m-warning h3 a:hover, .m-block.m-warning h3 a:focus, .m-block.m-warning h3 a:active, +.m-block.m-warning h4 a:hover, .m-block.m-warning h4 a:focus, .m-block.m-warning h4 a:active, +.m-block.m-warning h5 a:hover, .m-block.m-warning h5 a:focus, .m-block.m-warning h5 a:active, +.m-block.m-warning h6 a:hover, .m-block.m-warning h6 a:focus, .m-block.m-warning h6 a:active { + color: #e9ecae; +} +.m-block.m-danger h3 a:hover, .m-block.m-danger h3 a:focus, .m-block.m-danger h3 a:active, +.m-block.m-danger h4 a:hover, .m-block.m-danger h4 a:focus, .m-block.m-danger h4 a:active, +.m-block.m-danger h5 a:hover, .m-block.m-danger h5 a:focus, .m-block.m-danger h5 a:active, +.m-block.m-danger h6 a:hover, .m-block.m-danger h6 a:focus, .m-block.m-danger h6 a:active { + color: #ff9391; +} +.m-block.m-info h3 a:hover, .m-block.m-info h3 a:focus, .m-block.m-info h3 a:active, +.m-block.m-info h4 a:hover, .m-block.m-info h4 a:focus, .m-block.m-info h4 a:active, +.m-block.m-info h5 a:hover, .m-block.m-info h5 a:focus, .m-block.m-info h5 a:active, +.m-block.m-info h6 a:hover, .m-block.m-info h6 a:focus, .m-block.m-info h6 a:active { + color: #5297d7; +} +div.m-button a, .m-label { color: #22272e; } +div.m-button.m-flat a { color: #dcdcdc; } +div.m-button.m-flat a:hover, div.m-button.m-default a:focus, div.m-button.m-default a:active { + color: #a5c9ea; +} +div.m-button.m-default a, .m-label:not(.m-flat).m-default { background-color: #dcdcdc; } +div.m-button.m-primary a, .m-label:not(.m-flat).m-primary { background-color: #a5c9ea; } +div.m-button.m-success a, .m-label:not(.m-flat).m-success { background-color: #3bd267; } +div.m-button.m-warning a, .m-label:not(.m-flat).m-warning { background-color: #c7cf2f; } +div.m-button.m-danger a, .m-label:not(.m-flat).m-danger { background-color: #cd3431; } +div.m-button.m-info a, .m-label:not(.m-flat).m-info { background-color: #2f83cc; } +div.m-button.m-dim a, .m-label:not(.m-flat).m-dim { background-color: #747474; } +div.m-button.m-default a:hover, div.m-button.m-default a:focus, div.m-button.m-default a:active { + background-color: #a5c9ea; +} +div.m-button.m-primary a:hover, div.m-button.m-primary a:focus, div.m-button.m-primary a:active { + background-color: #dcdcdc; +} +div.m-button.m-success a:hover, div.m-button.m-success a:focus, div.m-button.m-success a:active { + background-color: #acecbe; +} +div.m-button.m-warning a:hover, div.m-button.m-warning a:focus, div.m-button.m-warning a:active { + background-color: #e9ecae; +} +div.m-button.m-danger a:hover, div.m-button.m-danger a:focus, div.m-button.m-danger a:active { + background-color: #ff9391; +} +div.m-button.m-info a:hover, div.m-button.m-info a:focus, div.m-button.m-info a:active { + background-color: #5297d7; +} +div.m-button.m-dim a:hover, div.m-button.m-dim a:focus, div.m-button.m-dim a:active { + background-color: #acacac; +} +.m-note.m-default { background-color: #34424d; } +.m-note.m-default, +table.m-table tr.m-default td, table.m-table td.m-default, +table.m-table tr.m-default th, table.m-table th.m-default { + color: #dcdcdc; +} +.m-note.m-default a:hover, +table.m-table tr.m-default td a:hover, table.m-table td.m-default a:hover, +table.m-table tr.m-default th a:hover, table.m-table th.m-default a:hover, +.m-note.m-default a:focus, +table.m-table tr.m-default td a:focus, table.m-table td.m-default a:focus, +table.m-table tr.m-default th a:focus, table.m-table th.m-default a:focus, +.m-note.m-default a:active, +table.m-table tr.m-default td a:active, table.m-table td.m-default a:active, +table.m-table tr.m-default th a:active, table.m-table th.m-default a:active { + color: #a5c9ea; +} +.m-note.m-primary a, +table.m-table tr.m-primary td a, table.m-table td.m-primary a, +table.m-table tr.m-primary th a, table.m-table th.m-primary a { + color: #5b9dd9; +} +.m-note.m-primary, +table.m-table tr.m-primary td, table.m-table td.m-primary, +table.m-table tr.m-primary th, table.m-table th.m-primary { + background-color: #a5c2db; + color: #2f363f; +} +.m-note.m-primary a, +table.m-table tr.m-primary td a, table.m-table td.m-primary a, +table.m-table tr.m-primary th a, table.m-table th.m-primary a { + color: #2a75b6; +} +.m-note.m-primary a:hover, +table.m-table tr.m-primary td a:hover, table.m-table td.m-primary a:hover, +table.m-table tr.m-primary th a:hover, table.m-table th.m-primary a:hover, +.m-note.m-primary a:focus, +table.m-table tr.m-primary td a:focus, table.m-table td.m-primary a:focus, +table.m-table tr.m-primary th a:focus, table.m-table th.m-primary a:focus, +.m-note.m-primary a:active, +table.m-table tr.m-primary td a:active, table.m-table td.m-primary a:active, +table.m-table tr.m-primary th a:active, table.m-table th.m-primary a:active { + color: #2f363f; +} +.m-note.m-success, +table.m-table tr.m-success td, table.m-table td.m-success, +table.m-table tr.m-success th, table.m-table th.m-success { + background-color: #2a703f; + color: #acecbe; +} +.m-note.m-success a, +table.m-table tr.m-success td a, table.m-table td.m-success a, +table.m-table tr.m-success th a, table.m-table th.m-success a { + color: #3bd267; +} +.m-note.m-success a:hover, +table.m-table tr.m-success td a:hover, table.m-table td.m-success a:hover, +table.m-table tr.m-success th a:hover, table.m-table th.m-success a:hover, +.m-note.m-success a:focus, +table.m-table tr.m-success td a:focus, table.m-table td.m-success a:focus, +table.m-table tr.m-success th a:focus, table.m-table th.m-success a:focus, +.m-note.m-success a:active, +table.m-table tr.m-success td a:active, table.m-table td.m-success a:active, +table.m-table tr.m-success th a:active, table.m-table th.m-success a:active { + color: #acecbe; +} +.m-note.m-warning, table.m-table tr.m-warning td, table.m-table td.m-warning, + table.m-table tr.m-warning th, table.m-table th.m-warning { + background-color: #6d702a; + color: #e9ecae; +} +.m-note.m-warning a, table.m-table tr.m-warning td a, table.m-table td.m-warning a, + table.m-table tr.m-warning th a, table.m-table th.m-warning a { + color: #b8bf2b; +} +.m-note.m-warning a:hover, +table.m-table tr.m-warning td a:hover, table.m-table td.m-warning a:hover, +table.m-table tr.m-warning th a:hover, table.m-table th.m-warning a:hover, +.m-note.m-warning a:focus, +table.m-table tr.m-warning td a:focus, table.m-table td.m-warning a:focus, +table.m-table tr.m-warning th a:focus, table.m-table th.m-warning a:focus, +.m-note.m-warning a:active, +table.m-table tr.m-warning td a:active, table.m-table td.m-warning a:active, +table.m-table tr.m-warning th a:active, table.m-table th.m-warning a:active { + color: #e9ecae; +} +.m-note.m-danger, +table.m-table tr.m-danger td, table.m-table td.m-danger, +table.m-table tr.m-danger th, table.m-table th.m-danger { + background-color: #702b2a; + color: #ff9391; +} +.m-note.m-danger a, +table.m-table tr.m-danger td a, table.m-table td.m-danger a, +table.m-table tr.m-danger th a, table.m-table th.m-danger a { + color: #d85c59; +} +.m-note.m-danger a:hover, +table.m-table tr.m-danger td a:hover, table.m-table td.m-danger a:hover, +table.m-table tr.m-danger th a:hover, table.m-table th.m-danger a:hover, +.m-note.m-danger a:focus, +table.m-table tr.m-danger td a:focus, table.m-table td.m-danger a:focus, +table.m-table tr.m-danger th a:focus, table.m-table th.m-danger a:focus, +.m-note.m-danger a:active, +table.m-table tr.m-danger td a:active, table.m-table td.m-danger a:active, +table.m-table tr.m-danger th a:active, table.m-table th.m-danger a:active { + color: #ff9391; +} +.m-note.m-info, +table.m-table tr.m-info td, table.m-table td.m-info, +table.m-table tr.m-info th, table.m-table th.m-info { + background-color: #2a4f70; + color: #a5caeb; +} +.m-note.m-info a, +table.m-table tr.m-info td a, table.m-table td.m-info a, +table.m-table tr.m-info th a, table.m-table th.m-info a { + color: #5297d7; +} +.m-note.m-info a:hover, +table.m-table tr.m-info td a:hover, table.m-table td.m-info a:hover, +table.m-table tr.m-info th a:hover, table.m-table th.m-info a:hover, +.m-note.m-info a:focus, +table.m-table tr.m-info td a:focus, table.m-table td.m-info a:focus, +table.m-table tr.m-info th a:focus, table.m-table th.m-info a:focus, +.m-note.m-info a:active, +table.m-table tr.m-info td a:active, table.m-table td.m-info a:active, +table.m-table tr.m-info th a:active, table.m-table th.m-info a:active { + color: #a5caeb; +} +.m-note.m-dim, +table.m-table tr.m-dim td, table.m-table td.m-dim, +table.m-table tr.m-dim th, table.m-table th.m-dim { + background-color: #2d3236; + color: #747474; +} +.m-note.m-dim a, +table.m-table tr.m-dim td a, table.m-table td.m-dim a, +table.m-table tr.m-dim th a, table.m-table th.m-dim a { + color: #acacac; +} +.m-note.m-dim a:hover, +table.m-table tr.m-dim td a:hover, table.m-table td.m-dim a:hover, +table.m-table tr.m-dim th a:hover, table.m-table th.m-dim a:hover, +.m-note.m-dim a:focus, +table.m-table tr.m-dim td a:focus, table.m-table td.m-dim a:focus, +table.m-table tr.m-dim th a:focus, table.m-table th.m-dim a:focus, +.m-note.m-dim a:active, +table.m-table tr.m-dim td a:active, table.m-table td.m-dim a:active, +table.m-table tr.m-dim th a:active, table.m-table th.m-dim a:active { + color: #747474; +} +figure.m-figure.m-default::before { border-color: #34424d; } +figure.m-figure.m-default figcaption { color: #dcdcdc; } +figure.m-figure.m-primary::before { border-color: #a5c2db; } +figure.m-figure.m-primary figcaption { color: #a5c9ea; } +figure.m-figure.m-primary figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-success::before { border-color: #2a703f; } +figure.m-figure.m-success figcaption { color: #3bd267; } +figure.m-figure.m-success figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-warning::before { border-color: #6d702a; } +figure.m-figure.m-warning figcaption { color: #c7cf2f; } +figure.m-figure.m-warning figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-danger::before { border-color: #702b2a; } +figure.m-figure.m-danger figcaption { color: #cd3431; } +figure.m-figure.m-danger figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-info::before { border-color: #2a4f70; } +figure.m-figure.m-info figcaption { color: #2f83cc; } +figure.m-figure.m-info figcaption .m-figure-description { color: #dcdcdc; } +figure.m-figure.m-dim::before { border-color: #2d3236; } +figure.m-figure.m-dim { color: #747474; } +figure.m-figure.m-dim a { color: #acacac; } +figure.m-figure.m-dim a:hover, figure.m-figure.m-dim a:focus, figure.m-figure.m-dim a:active { + color: #747474; +} +.m-math { fill: #dcdcdc; } +.m-math.m-default, .m-math g.m-default, .m-math rect.m-default, +div.m-plot svg .m-bar.m-default, +.m-graph g.m-edge polygon, +.m-graph g.m-node:not(.m-flat) ellipse, +.m-graph g.m-node:not(.m-flat) polygon, +.m-graph g.m-edge text, +.m-graph g.m-node.m-flat text, +.m-graph g.m-cluster text, +.m-graph.m-default g.m-edge polygon, +.m-graph.m-default g.m-node:not(.m-flat) ellipse, +.m-graph.m-default g.m-node:not(.m-flat) polygon, +.m-graph.m-default g.m-edge text, +.m-graph.m-default g.m-node.m-flat text, +.m-graph.m-default g.m-cluster text { + fill: #dcdcdc; +} +.m-graph g.m-edge polygon, +.m-graph g.m-edge path, +.m-graph g.m-node ellipse, +.m-graph g.m-node polygon, +.m-graph g.m-node polyline, +.m-graph g.m-cluster polygon, +.m-graph.m-default g.m-edge polygon, +.m-graph.m-default g.m-edge path, +.m-graph.m-default g.m-node ellipse, +.m-graph.m-default g.m-node polygon, +.m-graph.m-default g.m-node polyline, +.m-graph.m-default g.m-cluster polygon { + stroke: #dcdcdc; +} +.m-math.m-primary, .m-math g.m-primary, .m-math rect.m-primary, +div.m-plot svg .m-bar.m-primary, +.m-graph.m-primary g.m-edge polygon, +.m-graph.m-primary g.m-node:not(.m-flat) ellipse, +.m-graph.m-primary g.m-node:not(.m-flat) polygon, +.m-graph.m-primary g.m-edge text, +.m-graph.m-primary g.m-node.m-flat text, +.m-graph.m-primary g.m-cluster text { + fill: #a5c9ea; +} +.m-graph.m-primary g.m-edge polygon, +.m-graph.m-primary g.m-edge path, +.m-graph.m-primary g.m-node ellipse, +.m-graph.m-primary g.m-node polygon, +.m-graph.m-primary g.m-node polyline, +.m-graph.m-primary g.m-cluster polygon { + stroke: #a5c9ea; +} +.m-math.m-success, .m-math g.m-success, .m-math rect.m-success, +div.m-plot svg .m-bar.m-success, +.m-graph.m-success g.m-edge polygon, +.m-graph.m-success g.m-node:not(.m-flat) ellipse, +.m-graph.m-success g.m-node:not(.m-flat) polygon, +.m-graph.m-success g.m-edge text, +.m-graph.m-success g.m-node.m-flat text, +.m-graph.m-success g.m-cluster text { + fill: #3bd267; +} +.m-graph.m-success g.m-edge polygon, +.m-graph.m-success g.m-edge path, +.m-graph.m-success g.m-node ellipse, +.m-graph.m-success g.m-node polygon, +.m-graph.m-success g.m-node polyline, +.m-graph.m-success g.m-cluster polygon { + stroke: #3bd267; +} +.m-math.m-warning, .m-math g.m-warning, .m-math rect.m-warning, +div.m-plot svg .m-bar.m-warning, +.m-graph.m-warning g.m-edge polygon, +.m-graph.m-warning g.m-node:not(.m-flat) ellipse, +.m-graph.m-warning g.m-node:not(.m-flat) polygon, +.m-graph.m-warning g.m-edge text, +.m-graph.m-warning g.m-node.m-flat text, +.m-graph.m-warning g.m-cluster text { + fill: #c7cf2f; +} +.m-graph.m-warning g.m-edge polygon, +.m-graph.m-warning g.m-edge path, +.m-graph.m-warning g.m-node ellipse, +.m-graph.m-warning g.m-node polygon, +.m-graph.m-warning g.m-node polyline, +.m-graph.m-warning g.m-cluster polygon { + stroke: #c7cf2f; +} +.m-math.m-danger, .m-math g.m-danger, .m-math rect.m-danger, +div.m-plot svg .m-bar.m-danger, +.m-graph.m-danger g.m-edge polygon, +.m-graph.m-danger g.m-node:not(.m-flat) ellipse, +.m-graph.m-danger g.m-node:not(.m-flat) polygon, +.m-graph.m-danger g.m-edge text, +.m-graph.m-danger g.m-node.m-flat text, +.m-graph.m-danger g.m-cluster text { + fill: #cd3431; +} +.m-graph.m-danger g.m-edge polygon, +.m-graph.m-danger g.m-edge path, +.m-graph.m-danger g.m-node ellipse, +.m-graph.m-danger g.m-node polygon, +.m-graph.m-danger g.m-node polyline, +.m-graph.m-danger g.m-cluster polygon { + stroke: #cd3431; +} +.m-math.m-info, .m-math g.m-info, .m-math rect.m-info, +div.m-plot svg .m-bar.m-info, +.m-graph.m-info g.m-edge polygon, +.m-graph.m-info g.m-node:not(.m-flat) ellipse, +.m-graph.m-info g.m-node:not(.m-flat) polygon, +.m-graph.m-info g.m-edge text, +.m-graph.m-info g.m-node.m-flat text, +.m-graph.m-info g.m-cluster text { + fill: #2f83cc; +} +.m-graph.m-info g.m-edge polygon, +.m-graph.m-info g.m-edge path, +.m-graph.m-info g.m-node ellipse, +.m-graph.m-info g.m-node polygon, +.m-graph.m-info g.m-node polyline, +.m-graph.m-info g.m-cluster polygon { + stroke: #2f83cc; +} +.m-math.m-dim, .m-math g.m-dim, .m-math rect.m-dim, +div.m-plot svg .m-bar.m-dim, +.m-graph.m-dim g.m-edge polygon, +.m-graph.m-dim g.m-node:not(.m-flat) ellipse, +.m-graph.m-dim g.m-node:not(.m-flat) polygon, +.m-graph.m-dim g.m-edge text, +.m-graph.m-dim g.m-node.m-flat text, +.m-graph.m-dim g.m-cluster text { + fill: #747474; +} +.m-graph.m-dim g.m-edge polygon, +.m-graph.m-dim g.m-edge path, +.m-graph.m-dim g.m-node ellipse, +.m-graph.m-dim g.m-node polygon, +.m-graph.m-dim g.m-node polyline, +.m-graph.m-dim g.m-cluster polygon { + stroke: #747474; +} +.m-graph g.m-edge.m-default polygon, +.m-graph g.m-node.m-default:not(.m-flat) ellipse, +.m-graph g.m-node.m-default:not(.m-flat) polygon, +.m-graph g.m-edge.m-default text, +.m-graph g.m-node.m-default.m-flat text, +.m-graph g.m-cluster.m-default text { + fill: #dcdcdc; +} +.m-graph g.m-edge.m-default polygon, +.m-graph g.m-edge.m-default path, +.m-graph g.m-node.m-default ellipse, +.m-graph g.m-node.m-default polygon, +.m-graph g.m-node.m-default polyline, +.m-graph g.m-cluster.m-default polygon { + stroke: #dcdcdc; +} +.m-graph g.m-edge.m-primary polygon, +.m-graph g.m-node.m-primary:not(.m-flat) ellipse, +.m-graph g.m-node.m-primary:not(.m-flat) polygon, +.m-graph g.m-edge.m-primary text, +.m-graph g.m-node.m-primary.m-flat text, +.m-graph g.m-cluster.m-primary text { + fill: #a5c9ea; +} +.m-graph g.m-edge.m-primary polygon, +.m-graph g.m-edge.m-primary path, +.m-graph g.m-node.m-primary ellipse, +.m-graph g.m-node.m-primary polygon, +.m-graph g.m-node.m-primary polyline, +.m-graph g.m-cluster.m-primary polygon { + stroke: #a5c9ea; +} +.m-graph g.m-edge.m-success polygon, +.m-graph g.m-node.m-success:not(.m-flat) ellipse, +.m-graph g.m-node.m-success:not(.m-flat) polygon, +.m-graph g.m-edge.m-success text, +.m-graph g.m-node.m-success.m-flat text, +.m-graph g.m-cluster.m-success text { + fill: #3bd267; +} +.m-graph g.m-edge.m-success polygon, +.m-graph g.m-edge.m-success path, +.m-graph g.m-node.m-success ellipse, +.m-graph g.m-node.m-success polygon, +.m-graph g.m-node.m-success polyline, +.m-graph g.m-cluster.m-success polygon { + stroke: #3bd267; +} +.m-graph g.m-edge.m-warning polygon, +.m-graph g.m-node.m-warning:not(.m-flat) ellipse, +.m-graph g.m-node.m-warning:not(.m-flat) polygon, +.m-graph g.m-edge.m-warning text, +.m-graph g.m-node.m-warning.m-flat text, +.m-graph g.m-cluster.m-warning text { + fill: #c7cf2f; +} +.m-graph g.m-edge.m-warning polygon, +.m-graph g.m-edge.m-warning path, +.m-graph g.m-node.m-warning ellipse, +.m-graph g.m-node.m-warning polygon, +.m-graph g.m-node.m-warning polyline, +.m-graph g.m-cluster.m-warning polygon { + stroke: #c7cf2f; +} +.m-graph g.m-edge.m-danger polygon, +.m-graph g.m-node.m-danger:not(.m-flat) ellipse, +.m-graph g.m-node.m-danger:not(.m-flat) polygon, +.m-graph g.m-edge.m-danger text, +.m-graph g.m-node.m-danger.m-flat text, +.m-graph g.m-cluster.m-danger text { + fill: #cd3431; +} +.m-graph g.m-edge.m-danger polygon, +.m-graph g.m-edge.m-danger path, +.m-graph g.m-node.m-danger ellipse, +.m-graph g.m-node.m-danger polygon, +.m-graph g.m-node.m-danger polyline, +.m-graph g.m-cluster.m-danger polygon { + stroke: #cd3431; +} +.m-graph g.m-edge.m-info polygon, +.m-graph g.m-node.m-info:not(.m-flat) ellipse, +.m-graph g.m-node.m-info:not(.m-flat) polygon, +.m-graph g.m-edge.m-info text, +.m-graph g.m-node.m-info.m-flat text, +.m-graph g.m-cluster.m-info text { + fill: #2f83cc; +} +.m-graph g.m-edge.m-info polygon, +.m-graph g.m-edge.m-info path, +.m-graph g.m-node.m-info ellipse, +.m-graph g.m-node.m-info polygon, +.m-graph g.m-node.m-info polyline, +.m-graph g.m-cluster.m-info polygon { + stroke: #2f83cc; +} +.m-graph g.m-edge.m-dim polygon, +.m-graph g.m-node.m-dim:not(.m-flat) ellipse, +.m-graph g.m-node.m-dim:not(.m-flat) polygon, +.m-graph g.m-edge.m-dim text, +.m-graph g.m-node.m-dim.m-flat text, +.m-graph g.m-cluster.m-dim text { + fill: #747474; +} +.m-graph g.m-edge.m-dim polygon, +.m-graph g.m-edge.m-dim path, +.m-graph g.m-node.m-dim ellipse, +.m-graph g.m-node.m-dim polygon, +.m-graph g.m-node.m-dim polyline, +.m-graph g.m-cluster.m-dim polygon { + stroke: #747474; +} +p, ul, ol, dl, blockquote, pre, .m-code-figure, .m-console-figure, hr, .m-note, +.m-frame, .m-block, div.m-button, div.m-scroll, table.m-table, div.m-image, +img.m-image, svg.m-image, figure.m-figure, .m-imagegrid, div.m-math, +div.m-graph, div.m-plot { + margin-bottom: 1rem; +} +p:last-child, p.m-nopadb, ul:last-child, ul.m-nopadb, +ol:last-child, ol.m-nopadb, dl:last-child, dl.m-nopadb, +blockquote:last-child, blockquote.m-nopadb, pre:last-child, pre.m-nopadb, +.m-code-figure:last-child, .m-code-figure.m-nopadb, +.m-console-figure:last-child, .m-console-figure.m-nopadb, +hr:last-child, hr.m-nopadb, .m-note:last-child, .m-note.m-nopadb, +.m-frame:last-child, .m-frame.m-nopadb, .m-block:last-child, .m-block.m-nopadb, +div.m-button:last-child, div.m-button.m-nopadb, +div.m-scroll:last-child, div.m-scroll.m-nopadb, +table.m-table:last-child, table.m-table.m-nopadb, +img.m-image:last-child, img.m-image.m-nopadb, +svg.m-image:last-child, svg.m-image.m-nopadb, +div.m-image:last-child, div.m-image.m-nopadb, +figure.m-figure:last-child, figure.m-figure.m-nopadb, +.m-imagegrid:last-child, .m-imagegrid.m-nopadb, +div.m-math:last-child, div.m-math.m-nopadb, +div.m-graph:last-child, div.m-graph.m-nopadb, +div.m-plot:last-child, div.m-plot.m-nopadb { + margin-bottom: 0; +} +li > p:last-child, li > blockquote:last-child, li > pre:last-child, +li > .m-code-figure:last-child, li > .m-console-figure:last-child, +li > .m-note:last-child, li > .m-frame:last-child, li > .m-block:last-child, +li > div.m-button:last-child, li > div.m-scroll:last-child, li > table.m-table:last-child, +li > img.m-image:last-child, li > svg.m-image:last-child, li > div.m-image:last-child, +li > figure.m-figure:last-child, li > div.m-math:last-child, +li > div.m-graph:last-child, li > div.m-plot:last-child { + margin-bottom: 1rem; +} +li:last-child > p:last-child, li:last-child > p.m-nopadb, +li:last-child > blockquote:last-child, li:last-child > blockquote.m-nopadb, +li:last-child > pre:last-child, li:last-child > pre.m-nopadb, +li:last-child > .m-code-figure:last-child, li:last-child > .m-code-figure.m-nopadb, +li:last-child > .m-console-figure:last-child, li:last-child > .m-console-figure.m-nopadb, +li:last-child > .m-note:last-child, li:last-child > .m-note.m-nopadb, +li:last-child > .m-frame:last-child, li:last-child > .m-frame.m-nopadb, +li:last-child > .m-block:last-child, li:last-child > .m-block.m-nopadb, +li:last-child > div.m-button:last-child, li:last-child > div.m-button.m-nopadb, +li:last-child > div.m-scroll:last-child, li:last-child > div.m-scroll.m-nopadb, +li:last-child > table.m-table:last-child, li:last-child > table.m-table.m-nopadb, +li:last-child > img.m-image:last-child, li:last-child > img.m-image.m-nopadb, +li:last-child > svg.m-image:last-child, li:last-child > svg.m-image.m-nopadb, +li:last-child > div.m-image:last-child, li:last-child > div.m-image.m-nopadb, +li:last-child > figure.m-figure:last-child, li:last-child > figure.m-figure.m-nopadb, +li:last-child > div.m-math:last-child, li:last-child > div.m-math.m-nopadb, +li:last-child > div.m-graph:last-child, li:last-child > div.m-graph.m-nopadb, +li:last-child > div.m-plot:last-child, li:last-child > div.m-plot.m-nopadb { + margin-bottom: 0; +} + +body > header > nav { + width: 100%; + background-color: #22272e; + min-height: 3rem; +} +body > header > nav.m-navbar-landing, +body > header > nav.m-navbar-cover { + background-color: transparent; + position: relative; +} +body > header > nav.m-navbar-landing { + opacity: 0.8; +} +body > header > nav.m-navbar-cover { + background-color: rgba(34, 39, 46, 0.25); + opacity: 1; +} +body > header > nav.m-navbar-landing:hover, +body > header > nav.m-navbar-cover:hover { + background-color: rgba(34, 39, 46, 0.75); + opacity: 1; +} +body> header > nav.m-navbar-landing:target, +body> header > nav.m-navbar-cover:target { + background-color: #22272e; + opacity: 1; +} +body > header > nav.m-navbar-landing #m-navbar-brand.m-navbar-brand-hidden { + visibility: hidden; +} +body > header > nav.m-navbar-landing:target #m-navbar-brand.m-navbar-brand-hidden { + visibility: visible; +} +body > header > nav { + margin-left: auto; + margin-right: auto; + color: #ffffff; +} +body > header > nav a { + text-decoration: none; + text-transform: none; + display: inline-block; + vertical-align: middle; + line-height: 2.75rem; + color: #ffffff; +} +body > header > nav #m-navbar-brand, body > header > nav a#m-navbar-show, body > header > nav a#m-navbar-hide { + font-weight: 600; + font-size: 1.125rem; + padding-left: 1rem; + padding-right: 1rem; +} +body > header > nav a#m-navbar-brand, body > header > nav #m-navbar-brand a { + text-transform: uppercase; +} +body > header > nav a#m-navbar-brand img, body > header > nav #m-navbar-brand a img { + width: 1.75rem; + height: 1.75rem; + vertical-align: -22.5%; + margin-right: 0.5rem; +} +body > header > nav #m-navbar-brand a { + padding-left: 0; + padding-right: 0; +} +body > header > nav #m-navbar-brand .m-thin { + font-weight: normal; +} +body > header > nav #m-navbar-brand .m-breadcrumb { + color: #747474; +} +body > header > nav a#m-navbar-show::before, body > header > nav a#m-navbar-hide::before { + content:'\2630'; +} +body > header > nav #m-navbar-collapse { + padding-bottom: 1rem; +} +body > header > nav #m-navbar-collapse li { + border-style: solid; + border-color: transparent; + border-width: 0 0 0 0.25rem; + margin-left: -1rem; +} +body > header > nav #m-navbar-collapse li a { + border-style: solid; + border-color: transparent; + line-height: 1.5rem; + margin-left: -0.25rem; + padding-left: 0.75rem; + border-width: 0 0 0 0.25rem; + width: 100%; +} +body > header > nav #m-navbar-collapse li a#m-navbar-current { + color: #5b9dd9; + border-color: #5b9dd9; +} +body > header > nav ol { + list-style-type: none; + margin: 0; +} +body > header > nav ol ol { + padding-left: 1.5rem; +} +body > header > nav .m-row > [class*='m-col-'] { + padding-top: 0; + padding-bottom: 0; +} +body > header > nav a:hover, body > header > nav a:focus, body > header > nav a:active { + color: #a5c9ea; +} +body > header > nav #m-navbar-collapse li:hover { + border-color: #a5c9ea; +} +body > header > nav #m-navbar-collapse li a:hover, +body > header > nav #m-navbar-collapse li a:focus, +body > header > nav #m-navbar-collapse li a:active { + border-color: #a5c9ea; + background-color: #292f37; +} +body > header > nav.m-navbar-landing #m-navbar-collapse li a:hover, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:hover, +body > header > nav.m-navbar-landing #m-navbar-collapse li a:focus, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:focus, +body > header > nav.m-navbar-landing #m-navbar-collapse li a:active, +body > header > nav.m-navbar-cover #m-navbar-collapse li a:active { + background-color: rgba(41, 47, 55, 0.5); +} +body > header > nav #m-navbar-hide { + display: none; +} +body > header > nav:target #m-navbar-collapse { + display: block; +} +body > header > nav:target #m-navbar-show { + display: none; +} +body > header > nav:target #m-navbar-hide { + display: inline-block; +} +@media screen and (min-width: 768px) { + body > header > nav #m-navbar-show, body > header > nav #m-navbar-hide, + body > header > nav:target #m-navbar-show, body > header > nav:target #m-navbar-hide { + display: none; + } + body > header > nav #m-navbar-collapse li a { + line-height: 2.75rem; + } + body > header > nav a, body > header > nav #m-navbar-collapse li a { + margin-left: 0; + padding-left: 1rem; + padding-right: 1rem; + white-space: nowrap; + } + body > header > nav #m-navbar-collapse { + padding-bottom: 0; + } + body > header > nav #m-navbar-collapse li ol { + background-color: #22272e; + } + body > header > nav #m-navbar-collapse ol ol li { + margin-left: 0; + padding-left: 0; + border-left-width: 0; + } + body > header > nav #m-navbar-collapse ol ol li a { + padding-left: 0.75rem; + } + body > header > nav #m-navbar-collapse > .m-row > ol > li { + margin-left: 0; + border-left-width: 0; + } + body > header > nav #m-navbar-collapse > .m-row > ol > li > a { + border-width: 0 0 0.25rem 0; + } + body > header > nav #m-navbar-collapse ol { + padding-left: 0; + padding-right: 0; + } + body > header > nav #m-navbar-collapse > .m-row > ol, body > header > nav #m-navbar-collapse > .m-row > ol > li { + float: left; + } + body > header > nav #m-navbar-collapse ol ol { + z-index: 99999; + position: absolute; + visibility: hidden; + } + body > header > nav #m-navbar-collapse li:hover ol { + visibility: visible; + } +} +body > footer { + width: 100%; +} +body > footer > nav { + padding-top: 1rem; + padding-bottom: 1rem; + font-size: 0.85rem; + text-align: center; + color: #c5c5c5; + background-color: #444e5c; +} +body > footer > nav h3, body > footer > nav h3 a { + text-transform: uppercase; + font-weight: normal; +} +body > footer > nav ul { + list-style-type: none; + padding: 0; + margin: 0; +} +body > footer > nav a { + text-decoration: none; + text-transform: none; + color: #ffffff; +} +body > footer > nav a:hover, body > footer > nav a:focus, body > footer > nav a:active { + color: #a5c9ea; +} +body > main { + padding-top: 1rem; + padding-bottom: 1rem; +} +article h1 { + font-size: 1.75rem; +} +article h1 .m-breadcrumb { + color: #747474; + font-weight: normal; +} +article h1 .m-breadcrumb a { + color: #a5c9ea; +} +article h1 .m-breadcrumb a:hover, article h1 a:focus, article h1 a:active { + color: #dcdcdc; +} +article > header h1 { + font-size: 2rem; + margin-bottom: 0.5rem; +} +article h1 a, article > header h1, article > header h1 a, +article section > h2, article section > h2 a, +article section > h3, article section > h3 a, +article section > h4, article section > h4 a, +article section > h5, article section > h5 a, +article section > h6, article section > h6 a { + color: #a5c9ea; +} +article h1 a:hover, article > header h1 a:hover, article > header h1 a:focus, article > header h1 a:active, +article section > h2 a:hover, article section > h2 a:focus, article section > h2 a:active, +article section > h3 a:hover, article section > h3 a:focus, article section > h3 a:active, +article section > h4 a:hover, article section > h4 a:focus, article section > h4 a:active, +article section > h5 a:hover, article section > h5 a:focus, article section > h5 a:active, +article section > h6 a:hover, article section > h6 a:focus, article section > h6 a:active { + color: #dcdcdc; +} +article > header .m-date { + display: block; + width: 2.5rem; + float: left; + text-align: center; + line-height: 95%; + font-size: 0.75rem; + font-weight: normal; + white-space: nowrap; + border-right-style: solid; + border-right-width: 0.125rem; + border-color: #a5c9ea; + padding-right: 0.75rem; + margin-top: -0.1rem; + margin-right: 0.75rem; + margin-bottom: 0.25rem; +} +article > header .m-date-day { + display: block; + font-weight: bold; + padding-top: 0.2rem; + padding-bottom: 0.15rem; + font-size: 1.25rem; +} +article > header p { + color: #f0f0f0; + font-size: 1.125rem; +} +article > header h1::after { + content: " "; + clear: both; + display: table; +} +article > footer { + color: #c5c5c5; +} +article > footer p { + font-style: italic; + font-size: 0.85rem; + text-indent: 0; +} +article section:target { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + padding-left: 0.75rem; + border-color: #a5c9ea; +} +article h1 a, article > header h1 a, article section > h2 a, article section > h3 a, +article section > h4 a, article section > h5 a, article section > h6 a { + text-decoration: none; +} +#m-landing-image, #m-cover-image, article#m-jumbo > header #m-jumbo-image { + background-size: cover; + background-color: #0f1217; + background-position: center center; + background-repeat: no-repeat; + margin-top: -4rem; + padding-top: 5rem; +} +#m-landing-image { + color: #ffffff; +} +#m-cover-image { + height: 30rem; + margin-bottom: -26rem; +} +#m-landing-cover h1 { + font-size: 2.8rem; + margin-top: -0.5rem; + padding-left: 1.5rem; + padding-bottom: 1rem; + text-transform: lowercase; +} +#m-landing-cover { + padding-bottom: 10rem; + margin-bottom: -6rem; +} +article#m-jumbo { + margin-top: -1rem; +} +#m-landing-cover, #m-cover-image > div, article#m-jumbo > header #m-jumbo-cover { + background: linear-gradient(transparent 0%, transparent 50%, #2f363f 100%); + width: 100%; + height: 100%; +} +article#m-jumbo > header h1, article#m-jumbo > header h2 { + text-align: center; + font-weight: bold; +} +article#m-jumbo > header a { + text-decoration: none; +} +article#m-jumbo > header #m-jumbo-cover { + padding-bottom: 5rem; +} +article#m-jumbo > header #m-jumbo-image { + font-size: 2vmin; + margin-bottom: -3rem; +} +article#m-jumbo > header h1 { + font-size: 8vmin; +} +article#m-jumbo > header h2 { + font-size: 3vmin; +} +@media screen and (max-height: 640px) , screen and (max-width: 640px) { + article#m-jumbo > header h1 { + font-size: 3rem; + } + article#m-jumbo > header #m-jumbo-image, article#m-jumbo > header h2 { + font-size: 1rem; + } +} +article#m-jumbo > header, article#m-jumbo > header h1, article#m-jumbo > header a { + color: #ffffff; +} +article#m-jumbo > header a:hover, article#m-jumbo > header a:focus, article#m-jumbo > header a:active { + color: #f0f0f0; +} +article#m-jumbo.m-inverted > header, article#m-jumbo.m-inverted > header h1, article#m-jumbo.m-inverted > header a { + color: #000000; +} +article#m-jumbo.m-inverted > header a:hover, article#m-jumbo.m-inverted > header a:focus, article#m-jumbo.m-inverted > header a:active { + color: #0f0f0f; +} +.m-landing-news h3 a { + color: #dcdcdc; + text-decoration: none; + text-transform: uppercase; +} +.m-landing-news h3 a:hover, .m-landing-news h3 a:hover, .m-landing-news h3 a:focus, .m-landing-news h3 a:active { + color: #a5c9ea; +} +.m-landing-news time { + display: inline-block; + margin-left: 1rem; + float: right; +} +.m-article-pagination { + text-align: center; + padding: 1rem; +} +nav.m-navpanel { + text-align: center; +} +nav.m-navpanel h3 { + text-transform: uppercase; + font-weight: normal; +} +nav.m-navpanel ol { + text-transform: lowercase; +} +nav.m-navpanel ol, nav.m-navpanel ul { + list-style-type: none; + padding: 0; +} +nav.m-navpanel a { + color: #ffffff; + text-decoration: none; +} +nav.m-navpanel a:hover, nav.m-navpanel a:focus, nav.m-navpanel a:active { + color: #a5c9ea; +} +ul.m-tagcloud li { display: inline; } +ul.m-tagcloud li.m-tag-1 { font-size: 0.75rem; } +ul.m-tagcloud li.m-tag-2 { font-size: 0.825rem; } +ul.m-tagcloud li.m-tag-3 { font-size: 1rem; } +ul.m-tagcloud li.m-tag-4 { font-size: 1.25rem; } +ul.m-tagcloud li.m-tag-5 { font-size: 1.5rem; } +article section:target figure.m-code-figure, article section:target figure.m-console-figure { + z-index: 1; +} +article, article > header, article section { margin-bottom: 1rem; } +article:last-child, article section:last-child { margin-bottom: 0; } +.m-container-inflatable section:target > .m-note, +.m-container-inflatable section:target > .m-frame, +.m-container-inflatable section:target > .m-block, +.m-container-inflatable section:target > pre, +.m-container-inflatable section:target > .m-code-figure > pre:first-child, +.m-container-inflatable section:target > .m-console-figure > pre:first-child, +.m-container-inflatable section:target section > .m-note, +.m-container-inflatable section:target section > .m-frame, +.m-container-inflatable section:target section > .m-block, +.m-container-inflatable section:target section > pre, +.m-container-inflatable section:target section > .m-code-figure > pre:first-child, +.m-container-inflatable section:target section > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-center-'] > .m-note, +.m-container-inflatable section:target [class*='m-center-'] > .m-frame, +.m-container-inflatable section:target [class*='m-center-'] > .m-block, +.m-container-inflatable section:target [class*='m-center-'] > pre, +.m-container-inflatable section:target [class*='m-center-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-center-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-left-'] > .m-note, +.m-container-inflatable section:target [class*='m-left-'] > .m-frame, +.m-container-inflatable section:target [class*='m-left-'] > .m-block, +.m-container-inflatable section:target [class*='m-left-'] > pre, +.m-container-inflatable section:target [class*='m-left-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-left-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-right-'] > .m-note, +.m-container-inflatable section:target [class*='m-right-'] > .m-frame, +.m-container-inflatable section:target [class*='m-right-'] > .m-block, +.m-container-inflatable section:target [class*='m-right-'] > pre, +.m-container-inflatable section:target [class*='m-right-'] > .m-code-figure > pre:first-child, +.m-container-inflatable section:target [class*='m-right-'] > .m-console-figure > pre:first-child, +.m-container-inflatable section:target .m-container-inflate > .m-note, +.m-container-inflatable section:target .m-container-inflate > .m-frame, +.m-container-inflatable section:target .m-container-inflate > .m-block, +.m-container-inflatable section:target .m-container-inflate > pre, +.m-container-inflatable section:target .m-container-inflate > .m-code-figure > pre:first-child, +.m-container-inflatable section:target .m-container-inflate > .m-console-figure > pre:first-child { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + padding-left: 0.75rem; +} +.m-container-inflatable section:target > .m-code-figure::before, +.m-container-inflatable section:target > .m-console-figure::before, +.m-container-inflatable section:target section > .m-code-figure::before, +.m-container-inflatable section:target section > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > .m-console-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > .m-code-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > .m-console-figure::before, +.m-container-inflatable section:target .m-container-inflate > .m-code-figure::before, +.m-container-inflatable section:target .m-container-inflate > .m-console-figure::before { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-width: 0.25rem; +} +.m-container-inflatable section:target > .m-code-figure > pre.m-nopad, +.m-container-inflatable section:target > .m-console-figure > pre.m-nopad { + margin-left: -0.75rem; + padding-left: -0.75rem; +} +@media screen and (min-width: 576px) { + .m-container-inflatable section:target .m-center-s > .m-note, + .m-container-inflatable section:target .m-center-s > pre, + .m-container-inflatable section:target .m-center-s > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-s > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-s > .m-block, + .m-container-inflatable section:target .m-right-s > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-s > .m-frame, + .m-container-inflatable section:target .m-right-s > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-s > .m-block, + .m-container-inflatable section:target .m-right-s > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-s > .m-note, + .m-container-inflatable section:target .m-right-s > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-s > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable section:target .m-center-m > .m-note, + .m-container-inflatable section:target .m-center-m > pre, + .m-container-inflatable section:target .m-center-m > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-m > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-m > .m-block, + .m-container-inflatable section:target .m-right-m > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-m > .m-frame, + .m-container-inflatable section:target .m-right-m > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-m > .m-block, + .m-container-inflatable section:target .m-right-m > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-m > .m-note, + .m-container-inflatable section:target .m-right-m > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-m > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable section:target .m-center-l > .m-note, + .m-container-inflatable section:target .m-center-l > pre, + .m-container-inflatable section:target .m-center-l > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-center-l > figure.m-console-figure > pre:first-child, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure > pre:first-child, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure > pre:first-child { + border-left-width: 0; + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-l > .m-block, + .m-container-inflatable section:target .m-right-l > .m-block { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + } + .m-container-inflatable section:target .m-center-l > .m-frame, + .m-container-inflatable section:target .m-right-l > .m-frame { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + padding-left: 0.875rem; + } + .m-container-inflatable section:target .m-right-l > .m-block, + .m-container-inflatable section:target .m-right-l > .m-frame { + margin-left: 0; + } + .m-container-inflatable section:target .m-right-l > .m-note, + .m-container-inflatable section:target .m-right-l > pre { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + margin-left: 0; + border-left-width: 0; + padding-left: 1rem; + } + .m-container-inflatable section:target .m-center-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-center-l > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure::before { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; + border-left-width: 0.125rem; + } +} +.m-container-inflatable section:target > figure.m-code-figure::before, +.m-container-inflatable section:target > figure.m-console-figure::before, +.m-container-inflatable section:target section > figure.m-code-figure::before, +.m-container-inflatable section:target section > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-center-'] > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-left-'] > figure.m-console-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > figure.m-code-figure::before, +.m-container-inflatable section:target [class*='m-right-'] > figure.m-console-figure::before, +.m-container-inflatable section:target .m-container-inflatable > figure.m-code-figure::before, +.m-container-inflatable section:target .m-container-inflatable > figure.m-console-figure::before { + border-left-color: #405363; +} +@media screen and (min-width: 576px) { + .m-container-inflatable section:target .m-center-s > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-s > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-s > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +@media screen and (min-width: 768px) { + .m-container-inflatable section:target .m-center-m > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-m > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-m > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +@media screen and (min-width: 992px) { + .m-container-inflatable section:target .m-center-l > figure.m-code-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-code-figure::before { + border-color: #282e36; + } + .m-container-inflatable section:target .m-center-l > figure.m-console-figure::before, + .m-container-inflatable section:target .m-right-l > figure.m-console-figure::before { + border-color: #1a1c1d; + } +} +.m-container-inflatable section:target pre, +.m-container-inflatable section:target figure.m-code-figure > pre:first-child, +.m-container-inflatable section:target figure.m-console-figure > pre:first-child { + border-color: #405363; +} +.m-container-inflatable section:target .m-note.m-default { + border-color: #405363; +} +.m-container-inflatable section:target .m-note.m-primary { + border-color: #a5c9ea; +} +.m-container-inflatable section:target .m-note.m-success { + border-color: #3bd267; +} +.m-container-inflatable section:target .m-note.m-warning { + border-color: #c7cf2f; +} +.m-container-inflatable section:target .m-note.m-danger { + border-color: #cd3431; +} +.m-container-inflatable section:target .m-note.m-info { + border-color: #2f83cc; +} +.m-container-inflatable section:target .m-note.m-dim { + border-color: #747474; +} + +.m-code .hll { background-color: #34424d } +.m-code .c { color: #a5c9ea } +.m-code .k { color: #ffffff; font-weight: bold } +.m-code .n { color: #dcdcdc } +.m-code .o { color: #aaaaaa } +.m-code .p { color: #aaaaaa } +.m-code .ch { color: #a5c9ea } +.m-code .cm { color: #a5c9ea } +.m-code .cp { color: #3bd267 } +.m-code .cpf { color: #c7cf2f } +.m-code .c1 { color: #a5c9ea } +.m-code .cs { color: #a5c9ea } +.m-code .gd { color: #cd3431 } +.m-code .ge { color: #e6e6e6; font-style: italic } +.m-code .gh { color: #ffffff; font-weight: bold } +.m-code .gi { color: #3bd267 } +.m-code .gs { color: #e6e6e6; font-weight: bold } +.m-code .gu { color: #5b9dd9 } +.m-code .kc { color: #ffffff; font-weight: bold } +.m-code .kd { color: #ffffff; font-weight: bold } +.m-code .kn { color: #ffffff; font-weight: bold } +.m-code .kp { color: #ffffff; font-weight: bold } +.m-code .kr { color: #ffffff; font-weight: bold } +.m-code .kt { color: #ffffff; font-weight: bold } +.m-code .m { color: #c7cf2f } +.m-code .s { color: #e07f7c } +.m-code .na { color: #dcdcdc; font-weight: bold } +.m-code .nb { color: #ffffff; font-weight: bold } +.m-code .nc { color: #dcdcdc; font-weight: bold } +.m-code .no { color: #dcdcdc } +.m-code .nd { color: #dcdcdc } +.m-code .ni { color: #dcdcdc } +.m-code .ne { color: #dcdcdc } +.m-code .nf { color: #dcdcdc } +.m-code .nl { color: #dcdcdc } +.m-code .nn { color: #dcdcdc } +.m-code .nx { color: #dcdcdc } +.m-code .py { color: #dcdcdc } +.m-code .nt { color: #dcdcdc; font-weight: bold } +.m-code .nv { color: #c7cf2f } +.m-code .ow { color: #dcdcdc; font-weight: bold } +.m-code .mb { color: #c7cf2f } +.m-code .mf { color: #c7cf2f } +.m-code .mh { color: #c7cf2f } +.m-code .mi { color: #c7cf2f } +.m-code .mo { color: #c7cf2f } +.m-code .sa { color: #e07f7c } +.m-code .sb { color: #e07f7c } +.m-code .sc { color: #e07cdc } +.m-code .dl { color: #e07f7c } +.m-code .sd { color: #e07f7c } +.m-code .s2 { color: #e07f7c } +.m-code .se { color: #e07cdc } +.m-code .sh { color: #e07f7c } +.m-code .si { color: #a5c9ea } +.m-code .sx { color: #e07f7c } +.m-code .sr { color: #e07f7c } +.m-code .s1 { color: #e07f7c } +.m-code .ss { color: #e07f7c } +.m-code .bp { color: #ffffff; font-weight: bold } +.m-code .fm { color: #dcdcdc } +.m-code .vc { color: #c7cf2f } +.m-code .vg { color: #c7cf2f } +.m-code .vi { color: #c7cf2f } +.m-code .vm { color: #c7cf2f } +.m-code .il { color: #c7cf2f } + +.m-console .hll { background-color: #ffffcc } +.m-console .g-AnsiBackgroundBlack { background-color: #232627 } +.m-console .g-AnsiBackgroundBlue { background-color: #1d99f3 } +.m-console .g-AnsiBackgroundBrightBlack { background-color: #7f8c8d } +.m-console .g-AnsiBackgroundBrightBlue { background-color: #3daee9 } +.m-console .g-AnsiBackgroundBrightCyan { background-color: #16a085 } +.m-console .g-AnsiBackgroundBrightGreen { background-color: #1cdc9a } +.m-console .g-AnsiBackgroundBrightMagenta { background-color: #8e44ad } +.m-console .g-AnsiBackgroundBrightRed { background-color: #c0392b } +.m-console .g-AnsiBackgroundBrightWhite { background-color: #ffffff } +.m-console .g-AnsiBackgroundBrightYellow { background-color: #fdbc4b } +.m-console .g-AnsiBackgroundCyan { background-color: #1abc9c } +.m-console .g-AnsiBackgroundGreen { background-color: #11d116 } +.m-console .g-AnsiBackgroundMagenta { background-color: #9b59b6 } +.m-console .g-AnsiBackgroundRed { background-color: #ed1515 } +.m-console .g-AnsiBackgroundWhite { background-color: #fcfcfc } +.m-console .g-AnsiBackgroundYellow { background-color: #f67400 } +.m-console .g-AnsiBlack { color: #232627 } +.m-console .g-AnsiBlue { color: #1d99f3 } +.m-console .g-AnsiBrightBlack { color: #7f8c8d; font-weight: bold } +.m-console .g-AnsiBrightBlue { color: #3daee9; font-weight: bold } +.m-console .g-AnsiBrightCyan { color: #16a085; font-weight: bold } +.m-console .g-AnsiBrightDefault { color: #ffffff; font-weight: bold } +.m-console .g-AnsiBrightGreen { color: #1cdc9a; font-weight: bold } +.m-console .g-AnsiBrightInvertedDefault { color: #1a1c1d; font-weight: bold } +.m-console .g-AnsiBrightMagenta { color: #8e44ad; font-weight: bold } +.m-console .g-AnsiBrightRed { color: #c0392b; font-weight: bold } +.m-console .g-AnsiBrightWhite { color: #ffffff; font-weight: bold } +.m-console .g-AnsiBrightYellow { color: #fdbc4b; font-weight: bold } +.m-console .g-AnsiCyan { color: #1abc9c } +.m-console .g-AnsiGreen { color: #11d116 } +.m-console .g-AnsiInvertedDefault { color: #1a1c1d } +.m-console .g-AnsiMagenta { color: #9b59b6 } +.m-console .g-AnsiRed { color: #ed1515 } +.m-console .g-AnsiWhite { color: #fcfcfc } +.m-console .g-AnsiYellow { color: #f67400 } +.m-console .go { color: #fcfcfc } +.m-console .gp { color: #16a085; font-weight: bold } +.m-console .w { color: #fcfcfc } + +a.m-doc, a.m-doc-self, a.m-doc-external, +ul.m-doc li.m-doc-expansible > a:first-child, ul.m-doc li.m-doc-collapsible > a:first-child, +.m-code.m-inverted.m-doc-include > a { + text-decoration: none; +} +a.m-doc, a.m-doc-self { + font-weight: bold; +} +.m-thin a.m-doc, .m-thin a.m-doc-self { + font-weight: normal; +} +ul.m-doc li.m-doc-expansible > a:first-child, +ul.m-doc li.m-doc-collapsible > a:first-child, +ul.m-doc li.m-doc-expansible > a:first-child:hover, +ul.m-doc li.m-doc-expansible > a:first-child:focus, +ul.m-doc li.m-doc-expansible > a:first-child:active, +ul.m-doc li.m-doc-collapsible > a:first-child:hover, +ul.m-doc li.m-doc-collapsible > a:first-child:focus, +ul.m-doc li.m-doc-collapsible > a:first-child:active { + color: #dcdcdc; +} +a.m-doc-self, +ul.m-doc li.m-doc-expansible > a:first-child::before, +ul.m-doc li.m-doc-collapsible > a:first-child::before { + color: #a5c9ea; +} +a.m-doc-self:hover, a.m-doc-self:focus, a.m-doc-self:active, +ul.m-doc li.m-doc-expansible > a:first-child:hover::before, +ul.m-doc li.m-doc-expansible > a:first-child:focus::before, +ul.m-doc li.m-doc-expansible > a:first-child:active::before, +ul.m-doc li.m-doc-collapsible > a:first-child:hover::before, +ul.m-doc li.m-doc-collapsible > a:first-child:focus::before, +ul.m-doc li.m-doc-collapsible > a:first-child:active::before { + color: #dcdcdc; +} +h3 a.m-doc-external { + font-weight: normal; +} +span.m-doc-wrap-bumper { + margin-right: -1rem; +} +span.m-doc-wrap { + margin-left: 1rem; + display: inline-block; + vertical-align: text-top; + white-space: pre-line; + max-width: 100%; +} +dl.m-doc dd { + margin-bottom: 0.5rem; +} +dl.m-doc dd { + margin-left: 0; + padding-left: 2.5rem; +} +dl.m-doc dt:target, dl.m-doc dt:target + dd { + margin-left: -1.0rem; + border-left-style: solid; + border-left-width: 0.25rem; + border-color: #a5c9ea; +} +dl.m-doc dt:target { padding-left: 0.75rem; } +dl.m-doc dt:target + dd { padding-left: 3.25rem; } +ul.m-doc { + list-style: none; + margin-left: 1.0375rem; + padding-left: 0.9rem; + border-left-color: #405363; + border-left-width: 0.0625rem; + border-left-style: solid; +} +ul.m-doc li { + text-indent: -1rem; + padding-left: 1rem; +} +ul.m-doc li.m-doc-expansible > ul { + display: none; +} +ul.m-doc li.m-doc-expansible, ul.m-doc li.m-doc-collapsible { + padding-left: 0.6rem; +} +ul.m-doc li.m-doc-expansible > ul.m-doc, ul.m-doc li.m-doc-collapsible > ul.m-doc { + margin-left: 0.5rem; +} +ul.m-doc li.m-doc-expansible > a:first-child::before, ul.m-doc li.m-doc-collapsible > a:first-child::before { + background-color: #2f363f; + display: inline-block; + width: 0.4rem; + font-weight: bold; +} +ul.m-doc li.m-doc-expansible > a:first-child::before { content: '⊕'; } +ul.m-doc li.m-doc-collapsible > a:first-child::before { content: '⊖'; } +h1 .m-doc-template, h1 .m-doc-include { + font-size: 1.3rem; + font-weight: normal; +} +h1 .m-doc-include:last-child { + margin-bottom: -0.5rem; +} +h3 .m-doc-template, h3 .m-doc-include { + font-size: 1rem; + font-weight: normal; +} +.m-doc-template, dl.m-doc dd, ul.m-doc li > span.m-doc { + color: #747474; +} +dl.m-doc dd svg.m-math, ul.m-doc li > span.m-doc svg.m-math { + fill: #747474; +} +.m-doc-template a, dl.m-doc dd a, ul.m-doc li > span.m-doc a { + color: #acacac; +} +.m-doc-template a:hover, .m-doc-template a:focus, .m-doc-template a:active, +dl.m-doc dd a:hover, dl.m-doc dd a:focus, dl.m-doc dd a:active, +ul.m-doc li > span.m-doc a:hover, ul.m-doc li > span.m-doc a:focus, ul.m-doc li > span.m-doc a:active { + color: #747474; +} +.m-code.m-inverted.m-doc-include > a:link, +.m-code.m-inverted.m-doc-include > a:visited { + opacity: 0.6666; +} +.m-code.m-inverted.m-doc-include > a:hover, +.m-code.m-inverted.m-doc-include > a:focus, +.m-code.m-inverted.m-doc-include > a:active { + opacity: 1; +} +article section.m-doc-details > div { + margin-top: 0; + margin-left: 0; + margin-right: 0; + position: relative; + padding: 1rem; +} +article section.m-doc-details > div::before { + position: absolute; + content: ' '; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: -1; + border-style: solid; + border-width: 0.125rem; + border-radius: 0.2rem; + border-color: #282e36; +} +article section.m-doc-details > div > h3:first-child { + position: relative; + margin: -1rem -1rem 1rem -1rem; + padding: 0.5rem 1rem; + background-color: #282e36; + border-top-left-radius: 0.2rem; + border-top-right-radius: 0.2rem; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +article section.m-doc-details:target { + border-color: transparent; +} +article section.m-doc-details:target > div { + z-index: 1; +} +.m-container-inflatable > .m-row > [class*='m-col-'] section.m-doc-details > div { + margin-left: -1rem; + margin-right: -1rem; +} +.m-container-inflatable section.m-doc-details:target > div > h3:first-child, +.m-container-inflatable section.m-doc-details:target section > div > h3:first-child { + margin-left: -1.0rem; + border-left-style: solid; + border-left-color: #dcdcdc; + border-left-width: 0.25rem; + padding-left: 0.75rem; +} +.m-container-inflatable section.m-doc-details:target > div::before, +.m-container-inflatable section-dox-details:target section > div.m::before { + border-left-width: 0.25rem; + border-left-color: #a5c9ea; +} +a.m-doc-search-icon { + padding-left: 1rem; + padding-right: 1rem; +} +a.m-doc-search-icon svg { + fill: #ffffff; +} +body > header > nav #m-navbar-collapse a.m-doc-search-icon svg { + vertical-align: -5%; +} +a.m-doc-search-icon:focus svg, a.m-doc-search-icon:hover svg, a.m-doc-search-icon:active svg { + fill: #a5c9ea; +} +.m-doc-search { + display: none; + z-index: 10; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(34, 39, 46, 0.75); +} +.m-doc-search:target { + display: block; +} +.m-doc-search > a { + display: block; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.m-doc-search-header { + margin-top: 2.5rem; + padding: 0.5rem 1rem; + height: 2rem; +} +.m-doc-search-header > div:first-child { + float: right; +} +.m-doc-search-content { + background-color: #22272e; + border-radius: 0.2rem; + padding: 1rem; +} +.m-doc-search input { + width: 100%; + height: 3rem; + font-size: 1.2rem; + border-width: 0; + color: #dcdcdc; + background-color: #34424d; + border-radius: 0.2rem; + margin-bottom: 1rem; + padding: 0 1rem; +} +.m-doc-search #search-notfound { + display: none; +} +.m-doc-search ul#search-results { + list-style-type: none; + padding-left: 0; + max-height: calc(100vh - 12.5rem); + overflow-y: auto; + display: none; +} +.m-doc-search ul#search-results li a { + display: block; + padding-left: 1rem; + padding-right: 1rem; + text-decoration: none; + width: 100%; + line-height: 1.5rem; + color: #dcdcdc; +} +.m-doc-search ul#search-results li a > div { + white-space: nowrap; + overflow: hidden; +} +.m-doc-search ul#search-results li a > div:not(.m-doc-search-alias) { + direction: rtl; +} +.m-doc-search ul#search-results li a .m-label { + float: right; + line-height: 1rem; + margin-top: 0.1rem; + margin-left: 0.25rem; +} +.m-doc-search ul#search-results li a .m-label.m-flat { + margin-right: -0.75rem; +} +.m-doc-search ul#search-results li#search-current a { + background-color: #34424d; +} +.m-doc-search ul#search-results li#search-current.m-doc-search-copied a { + background-color: #2a703f; +} +.m-doc-search-typed { + color: #5b9dd9; +} +.m-doc-search input[type="search"] { -webkit-appearance: textfield; } +.m-doc-search input[type="search"]::-webkit-search-decoration, +.m-doc-search input[type="search"]::-webkit-search-cancel-button, +.m-doc-search input[type="search"]::-webkit-search-results-button, +.m-doc-search input[type="search"]::-webkit-search-results-decoration { + display: none; +} diff --git a/preview/pr-1379/manager_8hpp.html b/preview/pr-1379/manager_8hpp.html new file mode 100644 index 0000000000..9af32fd010 --- /dev/null +++ b/preview/pr-1379/manager_8hpp.html @@ -0,0 +1,136 @@ + + + + + tesseratos/project/manager.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/map_8hpp.html b/preview/pr-1379/map_8hpp.html new file mode 100644 index 0000000000..b7a74d4814 --- /dev/null +++ b/preview/pr-1379/map_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/map.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/mask_8hpp.html b/preview/pr-1379/mask_8hpp.html new file mode 100644 index 0000000000..875ad4b63c --- /dev/null +++ b/preview/pr-1379/mask_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/mask.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/mass_8hpp.html b/preview/pr-1379/mass_8hpp.html new file mode 100644 index 0000000000..4ae3f07df0 --- /dev/null +++ b/preview/pr-1379/mass_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/mass.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/match__height_8hpp.html b/preview/pr-1379/match__height_8hpp.html new file mode 100644 index 0000000000..d62edee241 --- /dev/null +++ b/preview/pr-1379/match__height_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/match_height.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/match__width_8hpp.html b/preview/pr-1379/match__width_8hpp.html new file mode 100644 index 0000000000..5b43190382 --- /dev/null +++ b/preview/pr-1379/match__width_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/match_width.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/material_8hpp.html b/preview/pr-1379/material_8hpp.html new file mode 100644 index 0000000000..6877ba13e3 --- /dev/null +++ b/preview/pr-1379/material_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/material.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/mesh_8hpp.html b/preview/pr-1379/mesh_8hpp.html new file mode 100644 index 0000000000..aae7f8ccb3 --- /dev/null +++ b/preview/pr-1379/mesh_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/mesh/mesh.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/meta_8hpp.html b/preview/pr-1379/meta_8hpp.html new file mode 100644 index 0000000000..c0003aa234 --- /dev/null +++ b/preview/pr-1379/meta_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/assets/meta.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/assets/meta.hpp file +

+

Class cubos::engine::AssetMeta.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::AssetMeta +
+
Stores metadata about an asset - the data stored in .meta files. Each asset has a corresponding meta object, which contains load or import parameters.
+
+ struct cubos::engine::AssetMeta::Exclude +
+
Used as context to exclude parameters from being serialized.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/metrics_8hpp.html b/preview/pr-1379/metrics_8hpp.html new file mode 100644 index 0000000000..7734238ba1 --- /dev/null +++ b/preview/pr-1379/metrics_8hpp.html @@ -0,0 +1,142 @@ + + + + + core/tel/metrics.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/model_8hpp.html b/preview/pr-1379/model_8hpp.html new file mode 100644 index 0000000000..9283a36f81 --- /dev/null +++ b/preview/pr-1379/model_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/model.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/model__bridge_8hpp.html b/preview/pr-1379/model__bridge_8hpp.html new file mode 100644 index 0000000000..2f5491fd7e --- /dev/null +++ b/preview/pr-1379/model__bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/model_bridge.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/modules.html b/preview/pr-1379/modules.html new file mode 100644 index 0000000000..2ef955c575 --- /dev/null +++ b/preview/pr-1379/modules.html @@ -0,0 +1,244 @@ + + + + + Cubos Docs + + + + + + + +
+
+
+
+
+

Modules

+
    +
  • + module Core Cubos core library. +
      +
    • module Audio Provides audio functionality.
    • +
    • + module Data Provides filesystem and serialization utilities. + +
    • +
    • + module ECS Entity Component System library. +
        +
      • module Entity Entity part of the ECS.
      • +
      • module Observer Observer part of the ECS.
      • +
      • module Query Defines the query functionality of the ECS.
      • +
      • + module System System part of the ECS. +
          +
        • module Arguments Contains types and fetcher specializations for system argument types.
        • +
        +
      • +
      • module Table Contains various table-like data structures which storage data associated to entities.
      • +
      +
    • +
    • module Geometry Provides geometry utilities.
    • +
    • module Graphics Provides a graphics API abstraction.
    • +
    • module Input and output Provides a window API abstraction.
    • +
    • module Memory Provides a stream library and memory utilities.
    • +
    • module Reflection Provides utilities useful for handling type-erased data.
    • +
    • module Threading Provides threading and asynchronous related utilities.
    • +
    +
  • +
  • + module Engine Cubos engine library. +
      +
    • module Assets Adds asset management to Cubos.
    • +
    • module Collisions Adds collision detection to Cubos.
    • +
    • module Defaults Adds a series of pre-configured essential plugins to the engine.
    • +
    • module Fixed Time Step Adds a tag which makes its systems run at a fixed frame rate.
    • +
    • module Gizmos Used to draw gizmos helpful for debugging and tools.
    • +
    • module Image Adds images to Cubos using stb_image.
    • +
    • module ImGui integration Initializes and configures ImGui for Cubos.
    • +
    • module Input Adds input handling to Cubos.
    • +
    • + module Physics Creates and handles the physics simulation. +
        +
      • module Gravity Adds gravity to particles.
      • +
      • module Solver Adds solver for constraints.
      • +
      +
    • +
    • module Defaults Adds the most frequently used rendering plugins to the engine.
    • +
    • + module Render Provides plugins for graphics rendering. + +
    • +
    • module Scene Adds scenes to Cubos.
    • +
    • module Settings Adds and manages settings.
    • +
    • + module Tools Adds various debugging tool plugins. +
        +
      • module Collider Gizmos Draws gizmos for colliders of selected entities.
      • +
      • module Console Displays the log messages in an ImGui window.
      • +
      • module Debug Camera Adds a toggleable debug camera.
      • +
      • module ECS Statistics Shows tons of statistics and information about the internal state of the ECS.
      • +
      • module Entity Inspector Allows inspecting and modifying the components of the current Selection.
      • +
      • module Metrics Panel Shows some useful performance metrics through a ImGui window.
      • +
      • module Play Pause Allows changing the current simulation speed, or even pause it.
      • +
      • module Selection Adds a resource which keeps track of what the current selection is.
      • +
      • module Settings Inspector Allows inspecting the current setting values through a ImGui window.
      • +
      • module Toolbox Allows toggling the visibility of other tools.
      • +
      • module Transform Gizmo Adds a gizmo that allows changing the selected entity's position.
      • +
      • module World Inspector Shows all of the entities in the world, and allows selecting them.
      • +
      +
    • +
    • module Transform Adds transform components which assign positions, rotations and scaling to entities.
    • +
    • + module UI Provides plugins for graphical user interfaces. +
        +
      • module Canvas Adds the core UI functionality and rendering logic.
      • +
      • module Color Rect Adds color rectangle elements.
      • +
      • module Color Rect Adds image element to UI.
      • +
      +
    • +
    • module Free Camera Adds the free camera controller component, which locks the mouse and moves an entity.
    • +
    • module Voxels Adds grid and palette assets to Cubos.
    • +
    • module Window Creates and handles the lifecycle of a window.
    • +
    +
  • +
  • + module Tesseratos Tesseratos application. +
      +
    • module Asset explorer Allows viewing and selecting assets through a ImGui window.
    • +
    • module Debugger Adds a resource used to manage a connection to a Cubos debugger.
    • +
    • module Asset explorer Allows importing files such as .qb through a ImGui window.
    • +
    • module Project Adds a resource used to manage the currently loaded project.
    • +
    • module Scene editor Adds a window to edit scenes and select entities in them.
    • +
    • module Palette editor Allows the user to open and inspect/edit a palette asset.
    • +
    +
  • +
  • module Core API C API for the Cubos core library.
  • +
  • module Engine API C API for the Cubos engine library.
  • +
  • module Core-tel
  • +
+ +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/move_8hpp.html b/preview/pr-1379/move_8hpp.html new file mode 100644 index 0000000000..2b707910be --- /dev/null +++ b/preview/pr-1379/move_8hpp.html @@ -0,0 +1,161 @@ + + + + + core/memory/move.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/move.hpp file +

+

Functions cubos::core::memory::move and cubos::core::memory::forward.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+
template<typename T>
+ struct cubos::core::memory::RemoveReference +
+
Provides a type which is the same as the given type, but without any references.
+
+
template<typename T>
+ struct cubos::core::memory::IsLValueReference +
+
Used to check if a type is an rvalue reference.
+
+
+
+

Functions

+
+
+
template<typename T>
+ auto move(T&& value) -> RemoveReference<T>::Type&& noexcept +
+
Returns an R-value reference to the given value.
+
+
template<typename T>
+ auto forward(typename RemoveReference<T>::Type& argument) -> T&& noexcept +
+
Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.
+
+
template<typename T>
+ auto forward(typename RemoveReference<T>::Type&& argument) -> T&& noexcept +
+
Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/name_8hpp.html b/preview/pr-1379/name_8hpp.html new file mode 100644 index 0000000000..bb992d13bc --- /dev/null +++ b/preview/pr-1379/name_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/name.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos.html b/preview/pr-1379/namespacecubos.html new file mode 100644 index 0000000000..3985401e9b --- /dev/null +++ b/preview/pr-1379/namespacecubos.html @@ -0,0 +1,122 @@ + + + + + cubos namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos namespace +

+

Cubos libraries namespace.

+ +
+

Namespaces

+
+
namespace core
+
Core namespace.
+
namespace engine
+
Engine module.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core.html b/preview/pr-1379/namespacecubos_1_1core.html new file mode 100644 index 0000000000..23b29ff8fc --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core.html @@ -0,0 +1,136 @@ + + + + + cubos::core namespace | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1al.html b/preview/pr-1379/namespacecubos_1_1core_1_1al.html new file mode 100644 index 0000000000..534753c7ae --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1al.html @@ -0,0 +1,156 @@ + + + + + cubos::core::al namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al namespace +

+

Audio module.

+ +
+

Namespaces

+
+
namespace impl
+
Namespace to store the abstract types implemented by the audio device implementations.
+
+
+
+

Classes

+
+
+ class AudioContext +
+
Audio context that contains audio devices;.
+
+ class MiniaudioContext +
+
Audio device implementation using miniaudio.
+
+
+
+

Typedefs

+
+
+ using Buffer = std::shared_ptr<impl::Buffer> +
+
Handle to an audio buffer.
+
+ using Source = std::shared_ptr<impl::Source> +
+
Handle to an audio source.
+
+ using Listener = std::shared_ptr<impl::Listener> +
+
Handle to an audio listener.
+
+ using AudioDevice = std::shared_ptr<impl::AudioDevice> +
+
Handle to an audio device.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1al_1_1impl.html b/preview/pr-1379/namespacecubos_1_1core_1_1al_1_1impl.html new file mode 100644 index 0000000000..01f6921a3b --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1al_1_1impl.html @@ -0,0 +1,130 @@ + + + + + cubos::core::al::impl namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::al::impl namespace +

+

Namespace to store the abstract types implemented by the audio device implementations.

+ +
+

Classes

+
+
+ class Buffer +
+
Abstract audio buffer.
+
+ class Source +
+
Abstract audio source.
+
+ class AudioDevice +
+
Audio device interface used to wrap low-level audio rendering APIs.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1data.html b/preview/pr-1379/namespacecubos_1_1core_1_1data.html new file mode 100644 index 0000000000..f397abf60e --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1data.html @@ -0,0 +1,171 @@ + + + + + cubos::core::data namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data namespace +

+

Data module.

+ +
+

Classes

+
+
+ class BinaryDeserializer +
+
Implementation of the abstract Deserializer class meant to deserialize data written by a BinarySerializer.
+
+ class Deserializer +
+
Base class for deserializers, which defines the interface for deserializing arbitrary data using its reflection metadata.
+
+ class JSONDeserializer +
+
Deserializer implementation which allows reading data from a JSON object.
+
+ class Archive +
+
Interface for a bridge between the Cubos virtual file system and the real world.
+
+ class EmbeddedArchive +
+
Archive implementation which reads data embedded in the application. Meant to be used with the quadrados embed tool.
+
+ class File +
+
Represents a file in the virtual file system of the engine.
+
+
template<typename T>
+ class FileStream +
+
Wrapper around an implementation-specific file stream which keeps the file alive and does some sanity checks.
+
+ class FileSystem +
+
Singleton which represents the virtual file system of the engine.
+
+ class StandardArchive +
+
Archive implementation which reads and writes from/into the OS file system using the standard library.
+
+ class BinarySerializer +
+
Implementation of the abstract Serializer class meant to serialize data in a non-readable but fast and compact way.
+
+ class DebugSerializer +
+
Serializer implementation which prints the given data to a stream in a human-readable format not meant to be parsed.
+
+ class JSONSerializer +
+
Implementation of the abstract Serializer class for serializing to JSON.
+
+ class Serializer +
+
Base class for serializers, which defines the interface for serializing arbitrary data using its reflection metadata.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1ecs.html b/preview/pr-1379/namespacecubos_1_1core_1_1ecs.html new file mode 100644 index 0000000000..a39f70878c --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1ecs.html @@ -0,0 +1,434 @@ + + + + + cubos::core::ecs namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs namespace +

+

ECS module.

+ +
+

Namespaces

+
+
namespace impl
+
Contains functions used internally by the implementation of the ECS.
+
+
+
+

Classes

+
+
+ class Blueprint +
+
Collection of entities and their respective components and relations.
+
+ class CommandBuffer +
+
Stores commands to execute them later.
+
+ struct DeltaTime +
+
Resource which stores the time since the last iteration of the main loop started.
+
+ struct ShouldQuit +
+
Resource used as a flag to indicate whether the main loop should stop running.
+
+ struct Arguments +
+
Resource which stores the command-line arguments.
+
+ class Cubos +
+
Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.
+
+ class DynamicPlugin +
+
Manages the loading and unloading of a plugin from a shared library.
+
+ class ArchetypeGraph +
+
Stores which column types each archetype holds and the edges which connect them.
+
+ struct ArchetypeId +
+
Identifies an archetype.
+
+ struct ArchetypeIdHash +
+
Hash functor for ArchetypeId.
+
+ struct Entity +
+
Identifies an entity.
+
+ struct EntityHash +
+
Used to hash Entity objects.
+
+ class EntityPool +
+
Manages the creation and destruction of entity identifiers, as well as storing their archetype identifiers.
+
+ struct Name +
+
Component which stores the name of an entity.
+
+ struct ObserverId +
+
Identifies an observer.
+
+ class Observers +
+
Stores and manages all of the observers associated with a world.
+
+ struct PluginQueue +
+
Stores plugin operations to be executed later.
+
+
template<typename... Ts>
+ class QueryData +
+
Holds the data necessary to execute a query.
+
+
template<typename T>
+ class QueryFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the tables.
+
+ class QueryFilter +
+
Used to find matches for the given query terms. Essentially contains the non-templated part of the query logic.
+
+ class QueryArchetypeNode +
+
Node which forces a given target to belong to a set of archetypes.
+
+ class QueryNode +
+
Query filter step, which receives an iterator and advances it until it points to a valid match.
+
+ class QueryRelatedNode +
+
Node which forces two given targets to be related with a given relation.
+
+ struct QueryTerm +
+
Describes a term in a query.
+
+ struct SymmetricTrait +
+
Trait used to identify symmetric relations.
+
+ struct TreeTrait +
+
Trait used to identify tree relations.
+
+ struct EphemeralTrait +
+
Trait used to identify types which are ephemeral and should not be persisted.
+
+
template<typename T>
+ class TypeBuilder +
+
Builder for reflection::Type objects which represent ECS types.
+
+ struct SystemAccess +
+
Describes the types of data a system accesses.
+
+ class Commands +
+
System argument used to write ECS commands and execute them at a later time.
+
+
template<typename T>
+ class EventPipe +
+
Resource which stores events of type T.
+
+
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ class EventReader +
+
System arguments used to read events of type T.
+
+
template<typename T>
+ class EventWriter +
+
System argument which allows the system to send events of type T to other systems.
+
+ class Plugins +
+
System argument used to add or remove Cubos plugins at runtime.
+
+
template<typename... Ts>
+ class Query +
+
System argument which holds the result of a query over all entities in world which match the given arguments.
+
+ struct SystemContext +
+
Context passed by the system caller to the fetchers.
+
+
template<typename T>
+ class SystemFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the world.
+
+ struct SystemOptions +
+
Contains extra options for a specific system argument.
+
+ class Planner +
+
Layer on top of Schedule, used to build them with added abstractions such as tags.
+
+ struct SystemId +
+
Identifies a system.
+
+ struct ConditionId +
+
Identifies a condition.
+
+ class SystemRegistry +
+
Stores known systems and conditions.
+
+ class Schedule +
+
Stores schedule nodes and the restrictions that must be met for them to run.
+
+
template<typename T>
+ class System +
+
Holds a system with a return type T.
+
+ class Tag +
+
Represents a tag to be used with the Cubos class.
+
+ struct ColumnId +
+
Identifies a data column type.
+
+ struct ColumnIdHash +
+
Used to hash ColumnId objects.
+
+ class DenseTableRegistry +
+
Stores the dense tables of a given world.
+
+ class DenseTable +
+
Stores the dense data associated to entities of a given archetype.
+
+ struct SparseRelationTableId +
+
Identifies a sparse relation table.
+
+ struct SparseRelationTableIdHash +
+
Hash functor for SparseRelationTableId.
+
+ class SparseRelationTableRegistry +
+
Stores all of the sparse relation tables.
+
+ class SparseRelationTable +
+
A table which stores relations. Allows for quick insertion, deletion and iteration.
+
+ class Tables +
+
Stores the tables of a given world.
+
+ struct DataTypeId +
+
Identifies a data type registered in the world.
+
+ struct DataTypeIdHash +
+
Hash functor for DataTypeId.
+
+ class Types +
+
Registry of all data types used in an ECS world.
+
+ class World +
+
Holds entities, their components and resources.
+
+
+
+

Enums

+
+
+ enum class Traversal { Random, + Down, + Up } +
+
Possible traversal types for tree relation terms.
+
+
+
+

Typedefs

+
+
+ using Plugin = void(*)(Cubos&) +
+
Function pointer type representing a plugin.
+
+
+
+

Functions

+
+
+ auto convertEntities(const std::unordered_map<Entity, Entity, EntityHash>& map, + const reflection::Type& type, + void* value) -> CUBOS_CORE_API void +
+
Converts entities in a value to their respective new entities. If an entity is not found in the map, it is left unchanged.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::core::ecs::Traversal + +

+

Possible traversal types for tree relation terms.

+ + + + + + + + + + + + + + + + +
Enumerators
Random +

Default traversal order. No specific ordering is required.

+
Down +

Starts in the topmost entity and traverses down the relation.

+
Up +

Starts in the bottommost entity and traverses up the relation.

+
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1ecs_1_1impl.html b/preview/pr-1379/namespacecubos_1_1core_1_1ecs_1_1impl.html new file mode 100644 index 0000000000..de0bbfb66a --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1ecs_1_1impl.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::impl namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::impl namespace +

+

Contains functions used internally by the implementation of the ECS.

+

Used to avoid cluttering the public namespace with implementation details.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1geom.html b/preview/pr-1379/namespacecubos_1_1core_1_1geom.html new file mode 100644 index 0000000000..248b6080a2 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1geom.html @@ -0,0 +1,538 @@ + + + + + cubos::core::geom namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::geom namespace +

+

Geometry module.

+ +
+

Classes

+
+
+ struct AABB +
+
Represents an axis-aligned bounding box.
+
+ struct Box +
+
Represents a box shape.
+
+ struct Capsule +
+
Represents a capsule or sphere shape.
+
+ struct Intersection +
+
Contains info regarding an intersection between shapes.
+
+ struct Plane +
+
Represents a plane. Assumes equation: normal.x + normal.y + normal.z + d = 0.
+
+
+
+

Functions

+
+
+ auto intersects(const Box& box1, + const glm::mat4& localToWorld1, + const Box& box2, + const glm::mat4& localToWorld2, + Intersection& intersect) -> CUBOS_CORE_API bool +
+
Computes the intersection between two box shapes.
+
+ auto sutherlandHodgmanClipping(const std::vector<glm::vec3>& inputPolygon, + int numClipPlanes, + const cubos::core::geom::Plane* clipPlanes, + bool removeNotClipToPlane) -> CUBOS_CORE_API std::vector<glm::vec3> +
+
Performs the Sutherland-Hodgman Clipping algorithm.
+
+ auto planeEdgeIntersection(const cubos::core::geom::Plane& plane, + const glm::vec3& start, + const glm::vec3& end, + glm::vec3& outPoint) -> CUBOS_CORE_API bool +
+
Compute the intersection between a plane and an edge.
+
+ auto pointInPlane(const glm::vec3& point, + const cubos::core::geom::Plane& plane) -> CUBOS_CORE_API bool +
+
Computes if a point is in the area limited by the plane.
+
+ auto getMaxVertexInAxis(int numVertices, + const glm::vec3 vertices[], + const glm::vec3& localAxis) -> CUBOS_CORE_API int +
+
Computes the vertex furthest along the axis.
+
+ auto getIncidentReferencePolygon(const cubos::core::geom::Box& shape, + const glm::vec3& normal, + std::vector<glm::vec3>& outPoints, + glm::vec3& outNormal, + std::vector<cubos::core::geom::Plane>& outAdjacentPlanes, + const glm::mat4& localToWorld, + float scale) -> CUBOS_CORE_API void +
+
Computes the candidate face of the polygon to be reference, as well as it's normal and adjacent planes.
+
+ auto getClosestPointEdge(const glm::vec3& point, + glm::vec3 start, + glm::vec3 end) -> CUBOS_CORE_API glm::vec3 +
+
Computes the closest point on the line (edge) to point.
+
+ auto getClosestPointPolygon(const glm::vec3& point, + const std::vector<glm::vec3>& polygon) -> CUBOS_CORE_API glm::vec3 +
+
Iterates through all edges in polygon and computes closest position on the edges of the polygon to point.
+
+ auto getCameraFrustumCorners(const glm::mat4& view, + const glm::mat4& proj, + float zNear, + float zFar, + std::vector<glm::vec4>& corners) -> CUBOS_CORE_API void +
+
Gets a camera's frustum corners in world space.
+
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API bool cubos::core::geom::intersects(const Box& box1, + const glm::mat4& localToWorld1, + const Box& box2, + const glm::mat4& localToWorld2, + Intersection& intersect) + +

+

Computes the intersection between two box shapes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
box1Box shape of the first entity.
localToWorld1Local to world matrix of the first entity.
box2Box shape of the second entity.
localToWorld2Local to world matrix of the second entity.
intersect
+
+
+

+ CUBOS_CORE_API std::vector<glm::vec3> cubos::core::geom::sutherlandHodgmanClipping(const std::vector<glm::vec3>& inputPolygon, + int numClipPlanes, + const cubos::core::geom::Plane* clipPlanes, + bool removeNotClipToPlane) + +

+

Performs the Sutherland-Hodgman Clipping algorithm.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
inputPolygonThe polygon to perform the clipping on.
numClipPlanesNumber of cliping planes.
clipPlanesClipping planes
removeNotClipToPlaneWhether to remove the points if they're outside the plane.
ReturnsThe polygon resulting from the clipping.
+
+
+

+ CUBOS_CORE_API bool cubos::core::geom::planeEdgeIntersection(const cubos::core::geom::Plane& plane, + const glm::vec3& start, + const glm::vec3& end, + glm::vec3& outPoint) + +

+

Compute the intersection between a plane and an edge.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
planeThe plane.
startThe start point of the edge.
endThe end point of the edge.
outPointThe position of the intersection.
ReturnsTrue if there's intersection, false otherwise.
+
+
+

+ CUBOS_CORE_API bool cubos::core::geom::pointInPlane(const glm::vec3& point, + const cubos::core::geom::Plane& plane) + +

+

Computes if a point is in the area limited by the plane.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pointThe position of the point in world coordinates.
planeThe plane to use.
ReturnsTrue is the point is on the plane or closer, false otherwise.
+
+
+

+ CUBOS_CORE_API int cubos::core::geom::getMaxVertexInAxis(int numVertices, + const glm::vec3 vertices[], + const glm::vec3& localAxis) + +

+

Computes the vertex furthest along the axis.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
numVertices
verticesArray of vertices.
localAxisThe direction of the axis in local coordinates.
ReturnsThe index of the vertex.
+
+
+

+ CUBOS_CORE_API void cubos::core::geom::getIncidentReferencePolygon(const cubos::core::geom::Box& shape, + const glm::vec3& normal, + std::vector<glm::vec3>& outPoints, + glm::vec3& outNormal, + std::vector<cubos::core::geom::Plane>& outAdjacentPlanes, + const glm::mat4& localToWorld, + float scale) + +

+

Computes the candidate face of the polygon to be reference, as well as it's normal and adjacent planes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
shapeCollider shape.
normalThe reference normal in world coordinates.
outPointsThe points of the resulting face.
outNormalThe resulting normal.
outAdjacentPlanesThe resulting adjacent planes (4).
localToWorldThe localToWorld matrix of the body.
scaleThe scale of the body.
+

TODO: since this is a box shape, we know how many points and adjacent planes exist beforehand

+
+
+

+ CUBOS_CORE_API glm::vec3 cubos::core::geom::getClosestPointEdge(const glm::vec3& point, + glm::vec3 start, + glm::vec3 end) + +

+

Computes the closest point on the line (edge) to point.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
pointPosition of the point.
startStarting position of the edge.
endEnd position of the edge.
ReturnsClosest position on edge to the point.
+
+
+

+ CUBOS_CORE_API glm::vec3 cubos::core::geom::getClosestPointPolygon(const glm::vec3& point, + const std::vector<glm::vec3>& polygon) + +

+

Iterates through all edges in polygon and computes closest position on the edges of the polygon to point.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
pointPosition of the point.
polygonList of points that compose the shape (edges are defined as a line-loop list of vertices).
ReturnsClosest point that resides on any of the given edges of the polygon.
+
+
+

+ CUBOS_CORE_API void cubos::core::geom::getCameraFrustumCorners(const glm::mat4& view, + const glm::mat4& proj, + float zNear, + float zFar, + std::vector<glm::vec4>& corners) + +

+

Gets a camera's frustum corners in world space.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
viewMatrix that transforms world space to the camera's view space.
projMatrix that transforms the camera's view space to its clip space.
zNearNear clipping plane.
zFarFar clipping plane.
cornersOutput vector where the corners will be stored.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1gl.html b/preview/pr-1379/namespacecubos_1_1core_1_1gl.html new file mode 100644 index 0000000000..ab77458fcb --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1gl.html @@ -0,0 +1,504 @@ + + + + + cubos::core::gl namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl namespace +

+

Graphics module.

+ +
+

Namespaces

+
+
namespace impl
+
Namespace to store the abstract types implemented by the render device implementations.
+
+
+
+

Classes

+
+
+ struct FramebufferDesc +
+
Describes a framebuffer.
+
+ struct RasterStateDesc +
+
Decribes a rasterizer state.
+
+ struct DepthStencilStateDesc +
+
Describes a depth stencil state.
+
+ struct BlendStateDesc +
+
Describes a blend state.
+
+ struct SamplerDesc +
+
Describes a sampler.
+
+ struct Texture1DDesc +
+
Describes a 1D texture.
+
+ struct Texture2DDesc +
+
Describes a 2D texture.
+
+ struct Texture2DArrayDesc +
+
Describes a 2D texture array.
+
+ struct Texture3DDesc +
+
Describes a 3D texture.
+
+ struct CubeMapDesc +
+
Describes a cube map.
+
+ struct CubeMapArrayDesc +
+
Describes a cube map array.
+
+ struct ConstantBufferElement +
+
Describes an element in a constant buffer.
+
+ struct ConstantBufferStructure +
+
Describes the structure of a constant buffer.
+
+ struct VertexElement +
+
Describes a vertex element.
+
+ struct VertexArrayDesc +
+
Describes a vertex array.
+
+ class RenderDevice +
+
Interface used to wrap low-level rendering APIs such as OpenGL.
+
+
+
+

Enums

+
+
+ enum class Property { MaxAnisotropy, + ComputeSupported } +
+
Render device properties that can be queried at runtime.
+
+ enum class Usage { Default, + Dynamic, + Static } +
+
Usage mode for buffers and textures.
+
+ enum class Type { Byte, + Short, + Int, + UByte, + UShort, + UInt, + NByte, + NShort, + NUByte, + NUShort, + Float } +
+
Data type.
+
+ enum class IndexFormat { UShort, + UInt } +
+
Index format.
+
+ enum class TextureFormat { R8SNorm, + R16SNorm, + RG8SNorm, + RG16SNorm, + RGBA8SNorm, + RGBA16SNorm, + R8UNorm, + R16UNorm, + RG8UNorm, + RG16UNorm, + RGBA8UNorm, + RGBA16UNorm, + R8SInt, + R16SInt, + RG8SInt, + RG16SInt, + RGBA8SInt, + RGBA16SInt, + R8UInt, + R16UInt, + RG8UInt, + RG16UInt, + RGBA8UInt, + RGBA16UInt, + R16Float, + R32Float, + RG16Float, + RG32Float, + RGB16Float, + RGB32Float, + RGBA16Float, + RGBA32Float, + Depth16, + Depth32, + Depth24Stencil8, + Depth32Stencil8 } +
+
Texture format.
+
+ enum class AddressMode { Repeat, + Mirror, + Clamp, + Border } +
+
Texture address mode.
+
+ enum class TextureFilter { None, + Nearest, + Linear } +
+
Texture filter type.
+
+ enum class Winding { CW, + CCW } +
+
Triangle winding mode.
+
+ enum class Face { Front, + Back, + FrontAndBack } +
+
Specifies a face.
+
+ enum class RasterMode { Wireframe, + Fill } +
+
Rasterizer mode.
+
+ enum class Compare { Never, + Less, + LEqual, + Greater, + GEqual, + Equal, + NEqual, + Always } +
+
Comparison function.
+
+ enum class StencilAction { Zero, + Keep, + Replace, + Increment, + IncrementWrap, + Decrement, + DecrementWrap, + Invert } +
+
Stencil action.
+
+ enum class BlendFactor { Zero, + One, + SrcColor, + InvSrcColor, + DstColor, + InvDstColor, + SrcAlpha, + InvSrcAlpha, + DstAlpha, + InvDstAlpha } +
+
Blend factor.
+
+ enum class BlendOp { Add, + Substract, + RevSubstract, + Min, + Max } +
+
Blend operation.
+
+ enum class Stage { Vertex, + Geometry, + Pixel, + Compute } +
+
Shader stage type.
+
+ enum class CubeFace { PositiveX = 0, + NegativeX = 1, + PositiveY = 2, + NegativeY = 3, + PositiveZ = 4, + NegativeZ = 5 } +
+
Cube map face.
+
+ enum class MemoryBarriers { None = 0, + VertexBuffer = 1, + IndexBuffer = 2, + ConstantBuffer = 4, + ImageAccess = 8, + TextureAccess = 16, + Framebuffer = 32, + All = VertexBuffer | IndexBuffer | ConstantBuffer | ImageAccess | TextureAccess | Framebuffer } +
+
Memory barrier flags for synchronization.
+
+ enum class Access { Read, + Write, + ReadWrite } +
+
Access mode for a resource.
+
+
+
+

Typedefs

+
+
+ using Framebuffer = std::shared_ptr<impl::Framebuffer> +
+
Handle to a framebuffer.
+
+ using RasterState = std::shared_ptr<impl::RasterState> +
+
Handle to a rasterizer state.
+
+ using DepthStencilState = std::shared_ptr<impl::DepthStencilState> +
+
Handle to a depth stencil state.
+
+ using BlendState = std::shared_ptr<impl::BlendState> +
+
Handle to a blend state.
+
+ using PixelPackBuffer = std::shared_ptr<impl::PixelPackBuffer> +
+
Handle to a pixel pack buffer.
+
+ using Sampler = std::shared_ptr<impl::Sampler> +
+
Handle to a sampler.
+
+ using Texture1D = std::shared_ptr<impl::Texture1D> +
+
Handle to a 1D texture.
+
+ using Texture2D = std::shared_ptr<impl::Texture2D> +
+
Handle to a 2D texture.
+
+ using Texture2DArray = std::shared_ptr<impl::Texture2DArray> +
+
Handle to a 2D texture array.
+
+ using Texture3D = std::shared_ptr<impl::Texture3D> +
+
Handle to a 3D texture.
+
+ using CubeMap = std::shared_ptr<impl::CubeMap> +
+
Handle to a cube map.
+
+ using CubeMapArray = std::shared_ptr<impl::CubeMapArray> +
+
Handle to a cube map array.
+
+ using ConstantBuffer = std::shared_ptr<impl::ConstantBuffer> +
+
Handle to a constant buffer.
+
+ using IndexBuffer = std::shared_ptr<impl::IndexBuffer> +
+
Handle to an index buffer.
+
+ using VertexBuffer = std::shared_ptr<impl::VertexBuffer> +
+
Handle to a vertex buffer.
+
+ using VertexArray = std::shared_ptr<impl::VertexArray> +
+
Handle to a vertex array.
+
+ using ShaderStage = std::shared_ptr<impl::ShaderStage> +
+
Handle to a shader stage.
+
+ using ShaderPipeline = std::shared_ptr<impl::ShaderPipeline> +
+
Handle to a shader pipeline.
+
+ using ShaderBindingPoint = impl::ShaderBindingPoint* +
+
Handle to a shader binding point.
+
+ using Timer = std::shared_ptr<impl::Timer> +
+
Handle to a timer.
+
+ using PipelinedTimer = std::shared_ptr<impl::PipelinedTimer> +
+
Handle to a pipelined timer.
+
+
+
+

Functions

+
+
+ auto generateScreenQuad(RenderDevice& renderDevice, + const ShaderPipeline& pipeline, + VertexArray& va) -> CUBOS_CORE_API void +
+
Creates the resources required to draw a quad that fills the screen and returns its VertexArray.
+
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API void cubos::core::gl::generateScreenQuad(RenderDevice& renderDevice, + const ShaderPipeline& pipeline, + VertexArray& va) + +

+

Creates the resources required to draw a quad that fills the screen and returns its VertexArray.

+ + + + + + + + + + + + + + + + + + +
Parameters
renderDeviceRenderDevice to be used for generation of the quad.
pipelinePipeline to associate the quad's VertexArray with.
va outHandle of the quad's VertexArray.
+

The quad provided by this function consists of two one sided triangles, with vertices containing the 2D position and UV coordinates. This function assumes the shader pipeline provided takes as input attributes a vec2 position and a vec2 uv.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1gl_1_1impl.html b/preview/pr-1379/namespacecubos_1_1core_1_1gl_1_1impl.html new file mode 100644 index 0000000000..33e9607b20 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1gl_1_1impl.html @@ -0,0 +1,202 @@ + + + + + cubos::core::gl::impl namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::impl namespace +

+

Namespace to store the abstract types implemented by the render device implementations.

+ +
+

Classes

+
+
+ class Framebuffer +
+
Abstract framebuffer.
+
+ class RasterState +
+
Abstract rasterizer state.
+
+ class DepthStencilState +
+
Abstract depth stencil state.
+
+ class BlendState +
+
Abstract blend state.
+
+ class PixelPackBuffer +
+
Abstract pixel pack buffer.
+
+ class Sampler +
+
Abstract sampler.
+
+ class Texture1D +
+
Abstract 1D texture.
+
+ class Texture2D +
+
Abstract 2D texture.
+
+ class Texture2DArray +
+
Abstract 2D texture array.
+
+ class Texture3D +
+
Abstract 3D texture.
+
+ class CubeMap +
+
Abstract cube map.
+
+ class CubeMapArray +
+
Abstract cube map.
+
+ class ConstantBuffer +
+
Abstract constant buffer.
+
+ class IndexBuffer +
+
Abstract index buffer.
+
+ class VertexBuffer +
+
Abstract vertex buffer.
+
+ class VertexArray +
+
Abstract vertex array.
+
+ class ShaderStage +
+
Abstract shader stage.
+
+ class ShaderPipeline +
+
Abstract shader pipeline.
+
+ class ShaderBindingPoint +
+
Abstract shader binding point.
+
+ class Timer +
+
Abstract timer.
+
+ class PipelinedTimer +
+
Pipelined timer.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1io.html b/preview/pr-1379/namespacecubos_1_1core_1_1io.html new file mode 100644 index 0000000000..40c5ebbfe4 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1io.html @@ -0,0 +1,381 @@ + + + + + cubos::core::io namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::io namespace +

+

Input and output module.

+ +
+

Classes

+
+
+ class Cursor +
+
Handle for a custom mouse cursor.
+
+ struct GamepadState +
+
Holds the state of a gamepad.
+
+ struct KeyEvent +
+
Event sent when a key is pressed or released.
+
+ struct ModifiersEvent +
+
Event sent when the modifiers change.
+
+ struct MouseButtonEvent +
+
Event sent when a mouse button state changes.
+
+ struct MouseMoveEvent +
+
Event sent when the mouse cursor moves.
+
+ struct MouseScrollEvent +
+
Event sent when the mouse wheel is scrolled.
+
+ struct ResizeEvent +
+
Event sent when the window framebuffer is resized.
+
+ struct TextEvent +
+
Event sent when a unicode character is input.
+
+ struct GamepadConnectionEvent +
+
Event sent when a gamepad is connected or disconnected.
+
+ class BaseWindow +
+
Interface used to wrap low-level window API implementations.
+
+
+
+

Enums

+
+
+ enum class GamepadButton { Invalid = -1, + A, + B, + X, + Y, + LBumper, + RBumper, + Back, + Start, + Guide, + LThumb, + RThumb, + Up, + Right, + Down, + Left, + Count } +
+
Gamepad buttons.
+
+ enum class GamepadAxis { Invalid = -1, + LX, + LY, + RX, + RY, + LTrigger, + RTrigger, + Count } +
+
Gamepad axes.
+
+ enum class Key { Invalid = -1, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + Num0, + Num1, + Num2, + Num3, + Num4, + Num5, + Num6, + Num7, + Num8, + Num9, + Escape, + LControl, + LShift, + LAlt, + LSystem, + RControl, + RShift, + RAlt, + RSystem, + Menu, + LBracket, + RBracket, + SemiColon, + Comma, + Period, + Quote, + Slash, + BackSlash, + Tilde, + Equal, + Dash, + Space, + Return, + BackSpace, + Tab, + PageUp, + PageDown, + End, + Home, + Insert, + Delete, + Add, + Subtract, + Multiply, + Divide, + Left, + Right, + Up, + Down, + Numpad0, + Numpad1, + Numpad2, + Numpad3, + Numpad4, + Numpad5, + Numpad6, + Numpad7, + Numpad8, + Numpad9, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Pause, + Count } +
+
Keyboard key codes enum.
+
+ enum class Modifiers { None = 0, + Control = 1, + Shift = 2, + Alt = 4, + System = 8 } +
+
Keyboard modifier flags enum.
+
+ enum class MouseButton { Invalid = -1, + Left, + Right, + Middle, + Extra1, + Extra2 } +
+
Mouse buttons enum.
+
+ enum class MouseAxis { X, + Y, + Scroll } +
+
Mouse axes enums.
+
+ enum class MouseState { Default, + Locked, + Hidden } +
+
Possible mouse states.
+
+
+
+

Typedefs

+
+
+ using WindowEvent = std::variant<KeyEvent, ModifiersEvent, MouseButtonEvent, MouseMoveEvent, MouseScrollEvent, ResizeEvent, TextEvent, GamepadConnectionEvent> +
+
Variant that can hold any of the window events.
+
+ using Window = std::shared_ptr<BaseWindow> +
+
Handle to a window.
+
+
+
+

Functions

+
+
+ auto gamepadButtonToString(GamepadButton button) -> CUBOS_CORE_API std::string +
+
Converts a GamepadButton enum to a string.
+
+ auto stringToGamepadButton(const std::string& str) -> CUBOS_CORE_API GamepadButton +
+
Converts a string to a GamepadButton.
+
+ auto gamepadAxisToString(GamepadAxis axis) -> CUBOS_CORE_API std::string +
+
Convert a GamepadAxis to a string.
+
+ auto stringToGamepadAxis(const std::string& str) -> CUBOS_CORE_API GamepadAxis +
+
Convert a string to a GamepadAxis.
+
+ auto openWindow(const std::string& title = "Cubos", + const glm::ivec2& size = {800, 600}, + bool vSync = true) -> CUBOS_CORE_API Window +
+
Opens a new window.
+
+ auto mouseButtonToString(MouseButton button) -> CUBOS_CORE_API std::string +
+
Converts a MouseButton enum to a string.
+
+ auto stringToMouseButton(const std::string& str) -> CUBOS_CORE_API MouseButton +
+
Convert a string to a MouseButton enum.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1memory.html b/preview/pr-1379/namespacecubos_1_1core_1_1memory.html new file mode 100644 index 0000000000..6e72c693b5 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1memory.html @@ -0,0 +1,280 @@ + + + + + cubos::core::memory namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::memory namespace +

+

Memory module.

+ +
+

Classes

+
+
+ class AnyValue +
+
Stores a blob of a given reflected type.
+
+ class AnyVector +
+
Stores a dynamically sized array of blobs of a given reflected type.
+
+ class BufferStream +
+
Stream implementation which writes to/reads from a buffer.
+
+
template<typename>
+ class Function +
+
Generic function pointer which can also store capturing lambda functions.
+
+
template<typename T, typename Lock>
+ class ReadGuard +
+
Provides safe read-only access to an object using a lock.
+
+
template<typename T, typename Lock>
+ class WriteGuard +
+
Provides safe read-write access to an object using a lock.
+
+
template<typename T>
+ struct RemoveReference +
+
Provides a type which is the same as the given type, but without any references.
+
+
template<typename T>
+ struct IsLValueReference +
+
Used to check if a type is an rvalue reference.
+
+
template<typename T>
+ class Opt +
+
Wrapper for reference types to indicate that the given argument type is optional.
+
+ class StandardStream +
+
Stream implementation which wraps a libc file pointer.
+
+ class Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
template<typename V>
+ class TypeMap +
+
A map that stores values of type V, using reflection types as keys.
+
+
template<typename L, typename R, typename LHash = std::hash<L>, typename RHash = std::hash<R>>
+ class UnorderedBimap +
+
A bidirectional hash table.
+
+
+
+

Enums

+
+
+ enum class SeekOrigin { Begin, + Current, + End } +
+
Stream seek origin.
+
+
+
+

Functions

+
+
+
template<typename T>
+ auto swapBytes(T value) -> T +
+
Swaps the bytes of a value, changing its endianness.
+
+ auto isLittleEndian() -> bool +
+
Checks if the current platform is little endian.
+
+
template<typename T>
+ auto fromLittleEndian(T value) -> T +
+
Converts a value from little endianness to local endianness.
+
+
template<typename T>
+ auto toLittleEndian(T value) -> T +
+
Converts a value from local endianness to little endianness.
+
+
template<typename T>
+ auto fromBigEndian(T value) -> T +
+
Converts a value from big endianness to local endianness.
+
+
template<typename T>
+ auto toBigEndian(T value) -> T +
+
Converts a value from local endianness to big endianness.
+
+
template<typename T>
+ auto move(T&& value) -> RemoveReference<T>::Type&& noexcept +
+
Returns an R-value reference to the given value.
+
+
template<typename T>
+ auto forward(typename RemoveReference<T>::Type& argument) -> T&& noexcept +
+
Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.
+
+
template<typename T>
+ auto forward(typename RemoveReference<T>::Type&& argument) -> T&& noexcept +
+
Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.
+
+
+
+

Function documentation

+
+

+ +
+ template<typename T> +
+ T&& cubos::core::memory::forward(typename RemoveReference<T>::Type&& argument) noexcept +

+

Used to cast a templated function parameter to the value category the caller used to pass it, which allows rvalues to be passed as rvalues and lvalues as lvalues.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TArgument type.
Parameters
argumentArgument to forward.
ReturnsForwarded argument.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1reflection.html b/preview/pr-1379/namespacecubos_1_1core_1_1reflection.html new file mode 100644 index 0000000000..7824a4f22d --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1reflection.html @@ -0,0 +1,243 @@ + + + + + cubos::core::reflection namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::reflection namespace +

+

Reflection module.

+ +
+

Classes

+
+
+
template<typename T>
+ struct Reflect +
+
Defines the reflection function for the given type T.
+
+ class ArrayTrait +
+
Exposes array-like functionality of a type.
+
+ class ConstructibleTrait +
+
Describes how a reflected type may be constructed and destructed.
+
+ class DictionaryTrait +
+
Exposes dictionary-like functionality of a type.
+
+ class EnumTrait +
+
Provides enumeration functionality to an enumerated type.
+
+ class FieldsTrait +
+
Describes the fields of a reflected type.
+
+ class InheritsTrait +
+
Provides inheritance relationship between types.
+
+ class MaskTrait +
+
Provides mask functionality to an enum mask type.
+
+ class NullableTrait +
+
Used to manipulate values of null-representable types.
+
+ class StringConversionTrait +
+
Stores functions for converting a type to and from a string.
+
+ class Type +
+
Describes a reflected type.
+
+ class TypeClient +
+
Manages the client-side of a reflection channel on top of a stream.
+
+ class TypeRegistry +
+
Stores a set of types which can be accessed by name.
+
+ class TypeServer +
+
Used to setup a TypeChannel on top of a stream, from the server side.
+
+
+
+

Functions

+
+
+ auto compare(const Type& type, + const void* a, + const void* b) -> CUBOS_CORE_API bool +
+
Compares two instances of the same type.
+
+ auto makeAnonymousType(const char* name, + const char* file, + std::size_t size, + std::size_t alignment, + void(*)(void*) destructor) -> CUBOS_CORE_API const Type& +
+
Creates a new reflection type with a unique name created from a type name and a file path, and with a minimal ConstructibleTrait.
+
+
template<typename T>
+ auto reflect() -> const Type& +
+
Reflects the given type T.
+
+
template<typename T>
+ auto autoConstructibleTrait() -> ConstructibleTrait +
+
Returns a ConstructibleTrait with the default, copy and move constructors, set only if the type has them.
+
+
+
+

Function documentation

+
+

+ CUBOS_CORE_API bool cubos::core::reflection::compare(const Type& type, + const void* a, + const void* b) + +

+

Compares two instances of the same type.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeThe type of the data being compared
aOne of the instances.
bThe other instance.
ReturnsTrue if the values are equal, false otherwise.
+ +
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1core_1_1thread.html b/preview/pr-1379/namespacecubos_1_1core_1_1thread.html new file mode 100644 index 0000000000..e8d0b5e773 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1core_1_1thread.html @@ -0,0 +1,131 @@ + + + + + cubos::core::thread namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::thread namespace +

+

Threading module.

+ +
+

Classes

+
+
+ class ThreadPool +
+
Manages a pool of threads, to which tasks can be submitted.
+
+ class Process +
+
Provides a cross-platform way to spawn child processes.
+
+
template<typename T>
+ class Task +
+
Provides a mechanism to access the results of asynchronous operations.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacecubos_1_1engine.html b/preview/pr-1379/namespacecubos_1_1engine.html new file mode 100644 index 0000000000..953a178dc9 --- /dev/null +++ b/preview/pr-1379/namespacecubos_1_1engine.html @@ -0,0 +1,1424 @@ + + + + + cubos::engine namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine namespace +

+

Engine module.

+ +
+

Classes

+
+
+
template<typename T>
+ class Asset +
+
Handle to an asset of a specific type.
+
+ class AnyAsset +
+
Handle to an asset of any type. May either be weak or strong. Weak handles do not guarantee the asset is loaded, while strong handles do.
+
+ class Assets +
+
Resource which manages all assets. Responsible for loading and unloading assets, storing them in memory, and providing access to them.
+
+ class AssetBridge +
+
Bridges are the objects responsible for loading and saving assets from/to disk. They form the bridge between the asset manager and the virtual file system.
+
+ class FileBridge +
+
Abstract bridge type defined to reduce boilerplate code in bridge implementations which open a single file to load and save assets.
+
+
template<typename T>
+ class JSONBridge +
+
Bridge for loading and saving assets which are serialized to and from a JSON file.
+
+ class AssetMeta +
+
Stores metadata about an asset - the data stored in .meta files. Each asset has a corresponding meta object, which contains load or import parameters.
+
+ struct Audio +
+
Asset containing raw Audio data.
+
+ class AudioBridge +
+
Bridge which loads and saves Audio assets.
+
+ struct Collider +
+
Component which adds a collider to an entity.
+
+ struct CollidingWith +
+
Relation which represents a collision.
+
+ struct ContactPointData +
+
Contains info regarding a contact point of a @ContactManifold.
+
+ struct ContactManifold +
+
Represents a contact interface between two bodies.
+
+ class Raycast +
+
System argument which allows performing raycast queries among all entities with colliders.
+
+ struct BoxCollisionShape +
+
Component which adds a box collision shape to an entity, used with a Collider component.
+
+ struct CapsuleCollisionShape +
+
Component which adds a capsule collision shape to an entity, used with a Collider component.
+
+ class VoxelCollisionShape +
+
Component which adds a collision shape corresponding to a given voxel grid to an entity, used with a Collider component.
+
+ struct FixedDeltaTime +
+
Resource which holds the value of the fixed delta for the fixedStep plugin.
+
+ class Gizmos +
+
Resource which queues commands for drawing gizmos, basic primitives useful for debugging and tools.
+
+ struct GizmosTarget +
+
Component used to indicate that Gizmos should be rendered to a given RenderTarget.
+
+ class ImageBridge +
+
Bridge which loads and saves Image assets.
+
+ struct Image +
+
Asset containing raw Image data.
+
+ class DataInspector +
+
Resource which allows the user to inspect or modify any reflectable value on the UI.
+
+ struct ImGuiTarget +
+
Component used to indicate that the ImGui frame should be rendered to a given RenderTarget.
+
+ class InputAction +
+
Stores the state of a single input action, such as "jump" or "attack".
+
+ class InputAxis +
+
Stores the state of a single input axis, such as "move forward" or "move right".
+
+ class InputBindings +
+
Stores the input bindings for a single player.
+
+ class InputCombination +
+
Stores the keys, gamepad buttons, and mouse buttons of a single input combination.
+
+ class Input +
+
Resource which stores the input bindings for multiple players.
+
+ struct AccumulatedCorrection +
+
Component which holds the corrections accumulated from the constraints solving.
+
+ struct AngularImpulse +
+
Component which holds angular impulses applied on a body.
+
+ struct AngularVelocity +
+
Component which holds angular velocity of a body.
+
+ struct CenterOfMass +
+
Component which defines the center of mass of a body.
+
+ struct Force +
+
Component which holds forces applied on a particle.
+
+ struct Impulse +
+
Component which holds impulses applied on a particle.
+
+ struct Inertia +
+
Component which defines the inertia of a body.
+
+ struct Mass +
+
Component which defines the mass of a particle.
+
+ struct PhysicsMaterial +
+
Component which defines the friction and bounciness of a body.
+
+ struct Torque +
+
Component which holds torque applied on a body.
+
+ struct Velocity +
+
Component which holds velocity and forces applied on a particle.
+
+ struct PhysicsBundle +
+
Component which encapsulates the creation all components required for physics.
+
+ struct Damping +
+
Resource which holds the damping value for integration.
+
+ struct Gravity +
+
Resource which holds the global value of gravity.
+
+ struct Bloom +
+
Component which stores the Bloom state for a render target.
+
+ struct Camera +
+
Generic component to hold the projection matrix of a specific camera (either perspective or orthogonal).
+
+ struct DrawsTo +
+
Relation which indicates the 'from' entity is a camera that draws to the 'to' target.
+
+ struct OrthographicCamera +
+
Component which defines parameters of a orthographic camera used to render the world.
+
+ struct PerspectiveCamera +
+
Component which defines parameters of a perspective camera used to render the world.
+
+ struct RenderTargetDefaults +
+
Component which replaces itself by the default render target components to an entity.
+
+ struct DeferredShading +
+
Component which stores the Deferred Shading state for a render target.
+
+ struct RenderDepth +
+
Component which stores the depth texture of a render target.
+
+ struct GBuffer +
+
Component which stores the GBuffer textures of a render target.
+
+ struct GBufferRasterizer +
+
Component which stores the GBuffer rasterizer state.
+
+ struct HDR +
+
Component which stores the HDR texture of a render target.
+
+ struct DirectionalLight +
+
Component which makes an entity behave like a directional light.
+
+ struct RenderEnvironment +
+
Resource which stores the scene's ambient light and sky colors.
+
+ struct PointLight +
+
Component which makes an entity behave like a point light.
+
+ struct SpotLight +
+
Component which makes an entity emit a spot light in the direction of its local forward vector.
+
+ struct RenderMesh +
+
Component used to draw meshes stored in the vertex pool.
+
+ class RenderMeshPool +
+
Used to allocate render meshes, which can then be rendered using a single draw call.
+
+ struct RenderMeshVertex +
+
Vertex data type stored in the RenderMeshPool's vertex buffer.
+
+ struct RenderPicker +
+
Component which provides a texture to store entity/gizmo ids, for selection with a mouse.
+
+ class ShaderBridge +
+
Bridge for loading shader assets.
+
+ class Shader +
+
Contains a shader stage created from GLSL code.
+
+ class ShadowAtlas +
+
Resource which stores the shadow map atlas, a large texture that holds the shadow maps for each shadow caster in a quadtree structure, reducing texture switching.
+
+ struct ShadowAtlasRasterizer +
+
Resource which stores the ShadowAtlas rasterizer state.
+
+ struct ShadowCaster +
+
Struct which contains the settings common to all shadow casters.
+
+ struct DirectionalShadowCaster +
+
Component which enables shadow casting on a directional light.
+
+ struct PointShadowCaster +
+
Component which enables shadow casting on a point light.
+
+ struct SpotShadowCaster +
+
Component which enables shadow casting on a spot light.
+
+ struct SplitScreen +
+
Component which enables splitscreen in a render target.
+
+ struct SSAO +
+
Component which stores the SSAO textures for a render target.
+
+ struct RenderTarget +
+
Component which represents a render target.
+
+ struct ToneMapping +
+
Component which stores Tone Mapping configuration for a render target.
+
+ struct RenderVoxelGrid +
+
Component used to draw voxel grids.
+
+ struct LoadRenderVoxels +
+
Component used to indicate that a voxel grid should be sent to the GPU.
+
+ struct RenderPalette +
+
Resource which identifies the currently active palette of the scene.
+
+ class SceneBridge +
+
Bridge which loads and saves Scene assets.
+
+ struct Scene +
+
Asset equivalent to ECS blueprints - a bundle of entities and their components.
+
+ class Settings +
+
Stores settings as key-value pairs and provides methods to retrieve them.
+
+ struct Selection +
+
Resource which identifies the current selection.
+
+ class Toolbox +
+
Manages the visibility of each tool.
+
+ struct ChildOf +
+
Tree relation which indicates the 'from' entity is a child of the 'to' entity.
+
+ struct LocalToParent +
+
Component which stores the transformation matrix of an entity, from local to parent space.
+
+ struct LocalToWorld +
+
Component which stores the transformation matrix of an entity, from local to world space.
+
+ struct Position +
+
Component which assigns a position to an entity.
+
+ struct Rotation +
+
Component which assigns a rotation to an entity.
+
+ struct Scale +
+
Component which assigns a uniform scale to an entity.
+
+ struct UICanvas +
+
Component which represents a target for UI rendering.
+
+ class UIDrawList +
+
Holds a collections of draw commands and their data.
+
+ struct UIElement +
+
Component which defines the space an element of the UI occupies as a rect.
+
+ struct UIExpand +
+
Component which makes a UI canvas scale to maintain proportions, choosing the dimension which reduces the element sizes on screen.
+
+ struct UIHorizontalStretch +
+
Component which makes a UI element fit horizontally to its parent.
+
+ struct UIKeepPixelSize +
+
Component which makes a UI canvas scale to keep its elements at the same pixel size.
+
+ struct UIMatchHeight +
+
Component which makes a UI canvas scale to maintain vertical proportions.
+
+ struct UIMatchWidth +
+
Component which makes a UI canvas scale to maintain horizontal proportions.
+
+ struct UINativeAspectRatio +
+
Component which makes a UI element keep the aspect ratio of its source.
+
+ struct UIVerticalStretch +
+
Component which makes a UI element fit vertically to its parent.
+
+ struct UIColorRect +
+
Component that draws a UI element as a solid color.
+
+ struct UIImage +
+
Component used to draw images on the UI.
+
+ struct FreeCameraController +
+
Component which moves the camera.
+
+ class VoxelGrid +
+
Represents a voxel object using a 3D grid.
+
+ class VoxelGridBridge +
+
Bridge which loads and saves Grid assets.
+
+ struct VoxelMaterial +
+
Describes a voxel material.
+
+ class VoxelModel +
+
Holds the data loaded from voxel model files, such as Qubicle models.
+
+ class VoxelModelBridge +
+
Bridge which loads and saves VoxelModel assets.
+
+ class VoxelPalette +
+
Holds a palette of materials. Supports up to 65535 materials.
+
+ class VoxelPaletteBridge +
+
Bridge which loads and saves Palette assets.
+
+
+
+

Typedefs

+
+
+ using AssetMetaRead = core::memory::ReadGuard<AssetMeta, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's metadata.
+
+ using AssetMetaWrite = core::memory::WriteGuard<AssetMeta, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's metadata.
+
+
template<typename T>
+ using AssetRead = core::memory::ReadGuard<T, std::shared_lock<std::shared_mutex>> +
+
Read-only guard for an asset's data.
+
+
template<typename T>
+ using AssetWrite = core::memory::WriteGuard<T, std::unique_lock<std::shared_mutex>> +
+
Read-write guard for an asset's data.
+
+ using Tag = core::ecs::Tag +
+
Represents a tag to be used with the Cubos class.
+
+ using Plugin = core::ecs::Plugin +
+
Function pointer type representing a plugin.
+
+ using Cubos = core::ecs::Cubos +
+
Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.
+
+ using DeltaTime = core::ecs::DeltaTime +
+
Resource which stores the time since the last iteration of the main loop started.
+
+ using ShouldQuit = core::ecs::ShouldQuit +
+
Resource used as a flag to indicate whether the main loop should stop running.
+
+ using Arguments = core::ecs::Arguments +
+
Resource which stores the command-line arguments.
+
+
template<typename... ComponentTypes>
+ using Query = core::ecs::Query<ComponentTypes...> +
+
System argument which holds the result of a query over all entities in world which match the given arguments.
+
+ using Entity = core::ecs::Entity +
+
Identifies an entity.
+
+ using Commands = core::ecs::Commands +
+
System argument used to write ECS commands and execute them at a later time.
+
+
template<typename T>
+ using Opt = core::memory::Opt<T> +
+
Wrapper for reference types to indicate that the given argument type is optional.
+
+
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ using EventReader = core::ecs::EventReader<T, M> +
+
System arguments used to read events of type T.
+
+
template<typename T>
+ using EventWriter = core::ecs::EventWriter<T> +
+
System argument which allows the system to send events of type T to other systems.
+
+
+
+

Functions

+
+
+ auto assetsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto collisionsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ void defaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+ auto fixedStepPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto gizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto imagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto imguiPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto inputPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto physicsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto gravityPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto physicsSolverPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto bloomPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto cameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto cascadedShadowMapsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto cascadedShadowMapsRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ void renderDefaultsPlugin(Cubos& cubos) +
+
Plugin entry function.
+
+ auto deferredShadingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto renderDepthPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto gBufferPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto gBufferRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto hdrPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto lightsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto renderMeshPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto renderPickerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto shaderPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto shadowAtlasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto shadowAtlasRasterizerPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto shadowsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto splitScreenPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto ssaoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto renderTargetPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto toneMappingPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto renderVoxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto scenePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto settingsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto colliderGizmosPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto consolePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto debugCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto ecsStatisticsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto entityInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto metricsPanelPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto playPauseToolPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto toolsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto selectionPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto settingsInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto toolboxPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto transformGizmoPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto worldInspectorPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto transformPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto uiCanvasPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto colorRectPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto uiImagePlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto freeCameraPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto voxelsPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+ auto windowPlugin(Cubos& cubos) -> CUBOS_ENGINE_API void +
+
Plugin entry function.
+
+
+
+

Variables

+
+
+ CUBOS_ENGINE_API Tag assetsInitTag +
+
Initializes the assets manager and loads the meta files (after settingsTag).
+
+ CUBOS_ENGINE_API Tag assetsBridgeTag +
+
Systems which add bridges to the asset manager should be tagged with this.
+
+ CUBOS_ENGINE_API Tag assetsCleanupTag +
+
Frees any assets no longer in use.
+
+ CUBOS_ENGINE_API Tag assetsTag +
+
Startup systems which load assets should be tagged with this.
+
+ CUBOS_ENGINE_API Tag collisionsTag +
+
Detects collisions and updates colliders.
+
+ CUBOS_ENGINE_API Tag fixedStepTag +
+
Systems with this tag run at a fixed framerate.
+
+ CUBOS_ENGINE_API Tag gizmosInitTag +
+
Gizmos renderer is initialized, after windowInitTag.
+
+ CUBOS_ENGINE_API Tag gizmosInputTag +
+
Gizmos interaction is handled, after windowPollTag and before gizmosDrawTag.
+
+ CUBOS_ENGINE_API Tag gizmosDrawTag +
+
Gizmos are drawn to all render targets with GizmosTarget components.
+
+ CUBOS_ENGINE_API Tag imguiInitTag +
+
ImGui is initialized, after windowInitTag.
+
+ CUBOS_ENGINE_API Tag imguiBeginTag +
+
The ImGui frame begins, after windowPollTag.
+
+ CUBOS_ENGINE_API Tag imguiEndTag +
+
The ImGui frame ends and is rendered to the window's render target.
+
+ CUBOS_ENGINE_API Tag imguiTag +
+
Tag to be used by all systems which call ImGui functions. Runs between imguiBeginTag and imguiEndTag.
+
+ CUBOS_ENGINE_API Tag inputUpdateTag +
+
Updates the input state.
+
+ CUBOS_ENGINE_API Tag physicsApplyForcesTag +
+
Tag which should be used on all systems that modify velocity or apply forces or impulses.
+
+ CUBOS_ENGINE_API Tag bloomTag +
+
Tags the system which applies the Bloom effect.
+
+ CUBOS_ENGINE_API Tag createCascadedShadowMapsTag +
+
Creates the shadow maps.
+
+ CUBOS_ENGINE_API Tag drawToCascadedShadowMapsTag +
+
Systems which draw to the cascaded shadow maps should be tagged with this.
+
+ CUBOS_ENGINE_API Tag deferredShadingTag +
+
Tags the system which applies the Deferred Shading technique.
+
+ CUBOS_ENGINE_API Tag createRenderDepthTag +
+
Recreates the RenderDepth texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderDepthTag +
+
Systems which draw to RenderDepth textures should be tagged with this.
+
+ CUBOS_ENGINE_API Tag createGBufferTag +
+
Recreates the GBuffer if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToGBufferTag +
+
Systems which draw to GBuffer textures should be tagged with this.
+
+ CUBOS_ENGINE_API Tag rasterizeToGBufferTag +
+
Rasterizes RenderMesh components to the GBuffer textures.
+
+ CUBOS_ENGINE_API Tag createHDRTag +
+
Recreates the HDR texture if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToHDRTag +
+
Systems which draw to HDR textures should be tagged with this.
+
+ CUBOS_ENGINE_API Tag renderMeshPoolInitTag +
+
Render mesh pool is initialized (startup).
+
+ CUBOS_ENGINE_API Tag createRenderPickerTag +
+
Recreates the RenderPicker if necessary - for example, due to a render target resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderPickerTag +
+
Systems which draw to RenderPicker textures should be tagged with this.
+
+ CUBOS_ENGINE_API Tag createShadowAtlasTag +
+
Creates the shadow atlas.
+
+ CUBOS_ENGINE_API Tag reserveShadowCastersTag +
+
Reserves space for shadow casters.
+
+ CUBOS_ENGINE_API Tag drawToShadowAtlasTag +
+
Systems which draw to the shadow atlas texture should be tagged with this.
+
+ CUBOS_ENGINE_API Tag splitScreenTag +
+
Tags the system which adjusts the viewports.
+
+ CUBOS_ENGINE_API Tag drawToSSAOTag +
+
Tags the system which applies the Screen Space Ambient Occlusion technique.
+
+ CUBOS_ENGINE_API Tag resizeRenderTargetTag +
+
Resizes the Render Target if necessary - for example, due to a window resize.
+
+ CUBOS_ENGINE_API Tag drawToRenderTargetTag +
+
Systems which draw to Render Target framebuffers should be tagged with this.
+
+ CUBOS_ENGINE_API Tag toneMappingTag +
+
Tags the system which does the tone mapping.
+
+ CUBOS_ENGINE_API Tag settingsTag +
+
The settings are loaded, overriding values set previously.
+
+ CUBOS_ENGINE_API Tag transformMissingLocalTag +
+
The LocalToWorld components are added to entities with Position, Rotation or Scale components.
+
+ CUBOS_ENGINE_API Tag transformMissingTag +
+
The Position, Rotation, Scale and possibly LocalToParent components are added to entities with LocalToWorld components.
+
+ CUBOS_ENGINE_API Tag transformUpdateRelativeTag +
+
The LocalToWorld or LocalToParent components are updated with the information from the Position, Rotation and Scale components.
+
+ CUBOS_ENGINE_API Tag transformUpdateTag +
+
The LocalToWorld components are updated with the information from the LocalToParent component and the LocalToWorld components of the parent.
+
+ CUBOS_ENGINE_API Tag uiCanvasChildrenUpdateTag +
+
UICanvas components' information is passed to related UIElement components.
+
+ CUBOS_ENGINE_API Tag uiElementPropagateTag +
+
The UIElement components are updated with information from their parents.
+
+ CUBOS_ENGINE_API Tag uiBeginTag +
+
Readies canvas for drawing.
+
+ CUBOS_ENGINE_API Tag uiDrawTag +
+
Systems which draw to canvas should be tagged with this.
+
+ CUBOS_ENGINE_API Tag uiEndTag +
+
All queued draw commands are collected and executed to the render targets.
+
+ CUBOS_ENGINE_API Tag windowInitTag +
+
Window is opened, runs after settingsTag.
+
+ CUBOS_ENGINE_API Tag windowPollTag +
+
The window is polled for events, sending core::io::WindowEvent's.
+
+ CUBOS_ENGINE_API Tag windowRenderTag +
+
The window's back buffers are swapped.
+
+
+
+

Typedef documentation

+
+

+ using cubos::engine::Tag = core::ecs::Tag + +

+

Represents a tag to be used with the Cubos class.

+
+
+

+ using cubos::engine::Plugin = core::ecs::Plugin + +

+

Function pointer type representing a plugin.

+
+
+

+ using cubos::engine::Cubos = core::ecs::Cubos + +

+

Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.

+
+
+

+ using cubos::engine::DeltaTime = core::ecs::DeltaTime + +

+

Resource which stores the time since the last iteration of the main loop started.

+

This resource is added and updated by the Cubos class.

+
+
+

+ using cubos::engine::ShouldQuit = core::ecs::ShouldQuit + +

+

Resource used as a flag to indicate whether the main loop should stop running.

+

This resource is added by the Cubos class, initially set to true.

+
+
+

+ using cubos::engine::Arguments = core::ecs::Arguments + +

+

Resource which stores the command-line arguments.

+

This resource is added by the Cubos class.

+
+
+

+ +
+ template<typename... ComponentTypes> +
+ using cubos::engine::Query = core::ecs::Query<ComponentTypes...> +

+

System argument which holds the result of a query over all entities in world which match the given arguments.

+

An example of a valid query is:

Query<Position&, const Velocity&, Opt<Rotation&>, Opt<const Scale&>>

This query will return all entities with a Position and Velocity component. Accessors to Rotation and Scale components are also passed but may be null if the component is not present in the entity. Whenever mutability is not needed, const should be used.

+
+
+

+ using cubos::engine::Entity = core::ecs::Entity + +

+

Identifies an entity.

+

When serializing/deserializing, if there's a data::old::SerializationMap<Entity, std::string, EntityHash> in the context, it will be used to (de)serialize strings representing the entities. Otherwise, the identifiers will be (de)serialized as objects with two fields: their index and their generation.

+
+
+

+ using cubos::engine::Commands = core::ecs::Commands + +

+

System argument used to write ECS commands and execute them at a later time.

+

Internally wraps a reference to a CommandBuffer object.

+
+
+

+ +
+ template<typename T> +
+ using cubos::engine::Opt = core::memory::Opt<T> +

+

Wrapper for reference types to indicate that the given argument type is optional.

+ + + + + + + + + + +
Template parameters
TArgument type.
+
+
+

+ +
+ template<typename T, unsigned int M = DEFAULT_FILTER_MASK> +
+ using cubos::engine::EventReader = core::ecs::EventReader<T, M> +

+

System arguments used to read events of type T.

+ + + + + + + + + + + + + + +
Template parameters
TEvent.
MFilter mask.
+

Filtering the received events by their mask is also possible via the parameter M. By default, the reader will read all events sent.

+
+
+

+ +
+ template<typename T> +
+ using cubos::engine::EventWriter = core::ecs::EventWriter<T> +

+

System argument which allows the system to send events of type T to other systems.

+ + + + + + + + + + +
Template parameters
T
+ +
+
+
+

Variable documentation

+
+

+ CUBOS_ENGINE_API Tag cubos::engine::assetsInitTag + +

+

Initializes the assets manager and loads the meta files (after settingsTag).

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::assetsBridgeTag + +

+

Systems which add bridges to the asset manager should be tagged with this.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::assetsCleanupTag + +

+

Frees any assets no longer in use.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::assetsTag + +

+

Startup systems which load assets should be tagged with this.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::collisionsTag + +

+

Detects collisions and updates colliders.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::fixedStepTag + +

+

Systems with this tag run at a fixed framerate.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::gizmosInitTag + +

+

Gizmos renderer is initialized, after windowInitTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::gizmosInputTag + +

+

Gizmos interaction is handled, after windowPollTag and before gizmosDrawTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::gizmosDrawTag + +

+

Gizmos are drawn to all render targets with GizmosTarget components.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::imguiInitTag + +

+

ImGui is initialized, after windowInitTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::imguiBeginTag + +

+

The ImGui frame begins, after windowPollTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::imguiEndTag + +

+

The ImGui frame ends and is rendered to the window's render target.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::imguiTag + +

+

Tag to be used by all systems which call ImGui functions. Runs between imguiBeginTag and imguiEndTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::inputUpdateTag + +

+

Updates the input state.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::physicsApplyForcesTag + +

+

Tag which should be used on all systems that modify velocity or apply forces or impulses.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::renderMeshPoolInitTag + +

+

Render mesh pool is initialized (startup).

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::createRenderPickerTag + +

+

Recreates the RenderPicker if necessary - for example, due to a render target resize.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::drawToRenderPickerTag + +

+

Systems which draw to RenderPicker textures should be tagged with this.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::settingsTag + +

+

The settings are loaded, overriding values set previously.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::transformMissingLocalTag + +

+

The LocalToWorld components are added to entities with Position, Rotation or Scale components.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::transformMissingTag + +

+

The Position, Rotation, Scale and possibly LocalToParent components are added to entities with LocalToWorld components.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::transformUpdateRelativeTag + +

+

The LocalToWorld or LocalToParent components are updated with the information from the Position, Rotation and Scale components.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::transformUpdateTag + +

+

The LocalToWorld components are updated with the information from the LocalToParent component and the LocalToWorld components of the parent.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::uiCanvasChildrenUpdateTag + +

+

UICanvas components' information is passed to related UIElement components.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::uiElementPropagateTag + +

+

The UIElement components are updated with information from their parents.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::uiBeginTag + +

+

Readies canvas for drawing.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::uiDrawTag + +

+

Systems which draw to canvas should be tagged with this.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::uiEndTag + +

+

All queued draw commands are collected and executed to the render targets.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::windowInitTag + +

+

Window is opened, runs after settingsTag.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::windowPollTag + +

+

The window is polled for events, sending core::io::WindowEvent's.

+
+
+

+ CUBOS_ENGINE_API Tag cubos::engine::windowRenderTag + +

+

The window's back buffers are swapped.

+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespaces.html b/preview/pr-1379/namespaces.html new file mode 100644 index 0000000000..1ca873d1c5 --- /dev/null +++ b/preview/pr-1379/namespaces.html @@ -0,0 +1,153 @@ + + + + + Cubos Docs + + + + + + + +
+
+
+
+
+

Namespaces

+ + +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/namespacetesseratos.html b/preview/pr-1379/namespacetesseratos.html new file mode 100644 index 0000000000..675ec9c6ae --- /dev/null +++ b/preview/pr-1379/namespacetesseratos.html @@ -0,0 +1,258 @@ + + + + + tesseratos namespace | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos namespace +

+

Tesseratos namespace.

+ +
+

Classes

+
+
+ struct AssetSelectedEvent +
+
Event sent when an asset is selected.
+
+ class ProjectManager +
+
System argument which can be used to manage the currently loaded project.
+
+
+
+

Functions

+
+
+ void assetExplorerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+ auto assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::core::reflection::Type& type, + const cubos::engine::Assets& assets) -> bool +
+
Displays a modal popup to select an asset of a specified type.
+
+
template<typename T>
+ auto assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::engine::Assets& assets) -> bool +
+
Displays a modal popup to select an asset of a specified type.
+
+ void debuggerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+ void importerPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+ void projectPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+ void sceneEditorPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+ void voxelPaletteEditorPlugin(cubos::engine::Cubos& cubos) +
+
Plugin entry function.
+
+
+
+

Function documentation

+
+

+ bool tesseratos::assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::core::reflection::Type& type, + const cubos::engine::Assets& assets) + +

+

Displays a modal popup to select an asset of a specified type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
titlePopup title.
selectedAsset outOutput asset.
typeAsset type to filter by.
assetsAssets database to query.
ReturnsWhether an asset is selected.
+
+
+

+ +
+ template<typename T> +
+ bool tesseratos::assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::engine::Assets& assets) +

+

Displays a modal popup to select an asset of a specified type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TAsset type to filter by.
Parameters
titlePopup title.
selectedAsset outOutput asset.
assetsAssets database to query.
ReturnsWhether an asset is selected.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/native__aspect__ratio_8hpp.html b/preview/pr-1379/native__aspect__ratio_8hpp.html new file mode 100644 index 0000000000..38d87cbb9b --- /dev/null +++ b/preview/pr-1379/native__aspect__ratio_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/native_aspect_ratio.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/net_2utils_8hpp.html b/preview/pr-1379/net_2utils_8hpp.html new file mode 100644 index 0000000000..f929056d31 --- /dev/null +++ b/preview/pr-1379/net_2utils_8hpp.html @@ -0,0 +1,152 @@ + + + + + core/net/utils.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/net/utils.hpp file +

+

Network utilities.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
+
+
+

Typedefs

+
+
+ using InnerSocket = decltype(socket(0, 0, 0)) +
+
Socket type. Differs from Windows (SOCKET) and POSIX (int).
+
+
+
+

Functions

+
+
+ auto logSystemError() -> std::string +
+
Cross-platform utility to get last networking error message.
+
+
+
+

Variables

+
+
+ InnerSocket InnerInvalidSocket constexpr +
+
Represents an invalid socket.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/node_8hpp.html b/preview/pr-1379/node_8hpp.html new file mode 100644 index 0000000000..07883fed58 --- /dev/null +++ b/preview/pr-1379/node_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/query/node/node.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/nullable_8hpp.html b/preview/pr-1379/nullable_8hpp.html new file mode 100644 index 0000000000..067516bb23 --- /dev/null +++ b/preview/pr-1379/nullable_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/nullable.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/observer_2id_8hpp.html b/preview/pr-1379/observer_2id_8hpp.html new file mode 100644 index 0000000000..615d9033b8 --- /dev/null +++ b/preview/pr-1379/observer_2id_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/observer/id.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/observers_8hpp.html b/preview/pr-1379/observers_8hpp.html new file mode 100644 index 0000000000..5e1b762786 --- /dev/null +++ b/preview/pr-1379/observers_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/observer/observers.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/opt_8hpp.html b/preview/pr-1379/opt_8hpp.html new file mode 100644 index 0000000000..0a50b2b1b0 --- /dev/null +++ b/preview/pr-1379/opt_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/memory/opt.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/options_8hpp.html b/preview/pr-1379/options_8hpp.html new file mode 100644 index 0000000000..90df6e69bf --- /dev/null +++ b/preview/pr-1379/options_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/system/options.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/orthographic_8hpp.html b/preview/pr-1379/orthographic_8hpp.html new file mode 100644 index 0000000000..80085b3b62 --- /dev/null +++ b/preview/pr-1379/orthographic_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/camera/orthographic.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/pages.html b/preview/pr-1379/pages.html new file mode 100644 index 0000000000..29e50e9089 --- /dev/null +++ b/preview/pr-1379/pages.html @@ -0,0 +1,209 @@ + + + + + Cubos Docs + + + + + + + +
+
+
+
+
+

Pages

+ + +
+
+
+
+ + + + + + diff --git a/preview/pr-1379/palette__bridge_8hpp.html b/preview/pr-1379/palette__bridge_8hpp.html new file mode 100644 index 0000000000..3c473a3066 --- /dev/null +++ b/preview/pr-1379/palette__bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/voxels/palette_bridge.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/perspective_8hpp.html b/preview/pr-1379/perspective_8hpp.html new file mode 100644 index 0000000000..4d0a918e1b --- /dev/null +++ b/preview/pr-1379/perspective_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/camera/perspective.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/physics__bundle_8hpp.html b/preview/pr-1379/physics__bundle_8hpp.html new file mode 100644 index 0000000000..0cc748ded6 --- /dev/null +++ b/preview/pr-1379/physics__bundle_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/physics_bundle.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/physics__material_8hpp.html b/preview/pr-1379/physics__material_8hpp.html new file mode 100644 index 0000000000..0db3df109d --- /dev/null +++ b/preview/pr-1379/physics__material_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/physics_material.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/picker_8hpp.html b/preview/pr-1379/picker_8hpp.html new file mode 100644 index 0000000000..ceb0096e9c --- /dev/null +++ b/preview/pr-1379/picker_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/picker/picker.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/pipe_8hpp.html b/preview/pr-1379/pipe_8hpp.html new file mode 100644 index 0000000000..3faebbadc5 --- /dev/null +++ b/preview/pr-1379/pipe_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/system/arguments/event/pipe.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/plane_8hpp.html b/preview/pr-1379/plane_8hpp.html new file mode 100644 index 0000000000..357b558387 --- /dev/null +++ b/preview/pr-1379/plane_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/geom/plane.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/planner_8hpp.html b/preview/pr-1379/planner_8hpp.html new file mode 100644 index 0000000000..13f7a09e70 --- /dev/null +++ b/preview/pr-1379/planner_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/system/planner.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/planner.hpp file +

+

Class cubos::core::ecs::Planner.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Planner +
+
Layer on top of Schedule, used to build them with added abstractions such as tags.
+
+ struct cubos::core::ecs::Planner::TagId +
+
Local identifier for tags.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/plugin__queue_8hpp.html b/preview/pr-1379/plugin__queue_8hpp.html new file mode 100644 index 0000000000..ccf12e67e8 --- /dev/null +++ b/preview/pr-1379/plugin__queue_8hpp.html @@ -0,0 +1,144 @@ + + + + + core/ecs/plugin_queue.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/plugin_queue.hpp file +

+

Class cubos::core::ecs::PluginQueue.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::PluginQueue +
+
Stores plugin operations to be executed later.
+
+
+
+

Typedefs

+
+
+ using Plugin = void(*)(Cubos&) +
+
Function pointer type representing a plugin.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/plugins_2gravity_8hpp.html b/preview/pr-1379/plugins_2gravity_8hpp.html new file mode 100644 index 0000000000..e206a777e0 --- /dev/null +++ b/preview/pr-1379/plugins_2gravity_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/plugins/gravity.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/plugins_8hpp.html b/preview/pr-1379/plugins_8hpp.html new file mode 100644 index 0000000000..a07e71ee5e --- /dev/null +++ b/preview/pr-1379/plugins_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/system/arguments/plugins.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/point_8hpp.html b/preview/pr-1379/point_8hpp.html new file mode 100644 index 0000000000..f7b281b45b --- /dev/null +++ b/preview/pr-1379/point_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/lights/point.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/point__caster_8hpp.html b/preview/pr-1379/point__caster_8hpp.html new file mode 100644 index 0000000000..5527a1a29f --- /dev/null +++ b/preview/pr-1379/point__caster_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadows/point_caster.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/popup_8hpp.html b/preview/pr-1379/popup_8hpp.html new file mode 100644 index 0000000000..f5c0df4835 --- /dev/null +++ b/preview/pr-1379/popup_8hpp.html @@ -0,0 +1,140 @@ + + + + + tesseratos/asset_explorer/popup.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ tesseratos/asset_explorer/popup.hpp file +

+

Utility function to show up a popup containing assets with given type.

+ +
+

Namespaces

+
+
namespace tesseratos
+
Tesseratos namespace.
+
+
+
+

Functions

+
+
+ auto assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::core::reflection::Type& type, + const cubos::engine::Assets& assets) -> bool +
+
Displays a modal popup to select an asset of a specified type.
+
+
template<typename T>
+ auto assetSelectionPopup(const std::string& title, + cubos::engine::AnyAsset& selectedAsset, + const cubos::engine::Assets& assets) -> bool +
+
Displays a modal popup to select an asset of a specified type.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/position_8hpp.html b/preview/pr-1379/position_8hpp.html new file mode 100644 index 0000000000..b6ff096ecb --- /dev/null +++ b/preview/pr-1379/position_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/position.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/prelude_8hpp.html b/preview/pr-1379/prelude_8hpp.html new file mode 100644 index 0000000000..a7c09958f5 --- /dev/null +++ b/preview/pr-1379/prelude_8hpp.html @@ -0,0 +1,180 @@ + + + + + engine/prelude.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/prelude.hpp file +

+

Includes commonly used headers and defines aliases for commonly used types.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Typedefs

+
+
+ using Tag = core::ecs::Tag +
+
Represents a tag to be used with the Cubos class.
+
+ using Plugin = core::ecs::Plugin +
+
Function pointer type representing a plugin.
+
+ using Cubos = core::ecs::Cubos +
+
Represents the engine itself, and exposes the interface with which the game developer interacts with. Ties up all the different parts of the engine together.
+
+ using DeltaTime = core::ecs::DeltaTime +
+
Resource which stores the time since the last iteration of the main loop started.
+
+ using ShouldQuit = core::ecs::ShouldQuit +
+
Resource used as a flag to indicate whether the main loop should stop running.
+
+ using Arguments = core::ecs::Arguments +
+
Resource which stores the command-line arguments.
+
+
template<typename... ComponentTypes>
+ using Query = core::ecs::Query<ComponentTypes...> +
+
System argument which holds the result of a query over all entities in world which match the given arguments.
+
+ using Entity = core::ecs::Entity +
+
Identifies an entity.
+
+ using Commands = core::ecs::Commands +
+
System argument used to write ECS commands and execute them at a later time.
+
+
template<typename T>
+ using Opt = core::memory::Opt<T> +
+
Wrapper for reference types to indicate that the given argument type is optional.
+
+
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ using EventReader = core::ecs::EventReader<T, M> +
+
System arguments used to read events of type T.
+
+
template<typename T>
+ using EventWriter = core::ecs::EventWriter<T> +
+
System argument which allows the system to send events of type T to other systems.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/primitives_8hpp.html b/preview/pr-1379/primitives_8hpp.html new file mode 100644 index 0000000000..d51fc46cfc --- /dev/null +++ b/preview/pr-1379/primitives_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/primitives.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/primitives.hpp file +

+

Reflection declarations for primitive types.

+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/process_8hpp.html b/preview/pr-1379/process_8hpp.html new file mode 100644 index 0000000000..6df52745f2 --- /dev/null +++ b/preview/pr-1379/process_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/thread/process.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/query_2fetcher_8hpp.html b/preview/pr-1379/query_2fetcher_8hpp.html new file mode 100644 index 0000000000..6e00b4ec60 --- /dev/null +++ b/preview/pr-1379/query_2fetcher_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/query/fetcher.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/fetcher.hpp file +

+

Class cubos::core::ecs::QueryFetcher.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+
template<typename T>
+ class cubos::core::ecs::QueryFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the tables.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/query_8hpp.html b/preview/pr-1379/query_8hpp.html new file mode 100644 index 0000000000..6ff2e4a5dc --- /dev/null +++ b/preview/pr-1379/query_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/system/arguments/query.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/arguments/query.hpp file +

+

Class cubos::core::ecs::Query.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+
template<typename... Ts>
+ class cubos::core::ecs::Query +
+
System argument which holds the result of a query over all entities in world which match the given arguments.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/raycast_8hpp.html b/preview/pr-1379/raycast_8hpp.html new file mode 100644 index 0000000000..e8b18eaccf --- /dev/null +++ b/preview/pr-1379/raycast_8hpp.html @@ -0,0 +1,144 @@ + + + + + engine/collisions/raycast.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/raycast.hpp file +

+

System argument cubos::engine::Raycast.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::engine::Raycast +
+
System argument which allows performing raycast queries among all entities with colliders.
+
+ struct cubos::engine::Raycast::Hit +
+
Holds the result of a raycast query.
+
+ struct cubos::engine::Raycast::Ray +
+
Describes the ray used in a raycast query.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/reader_8hpp.html b/preview/pr-1379/reader_8hpp.html new file mode 100644 index 0000000000..d2857fa0ea --- /dev/null +++ b/preview/pr-1379/reader_8hpp.html @@ -0,0 +1,139 @@ + + + + + core/ecs/system/arguments/event/reader.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/arguments/event/reader.hpp file +

+

Class cubos::core::ecs::EventReader.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+
template<typename T, unsigned int M = DEFAULT_FILTER_MASK>
+ class cubos::core::ecs::EventReader +
+
System arguments used to read events of type T.
+
+ class cubos::core::ecs::EventReader::Iterator +
+
Used to iterate over events received by a reader.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/reflect_8hpp.html b/preview/pr-1379/reflect_8hpp.html new file mode 100644 index 0000000000..aa26bf1e96 --- /dev/null +++ b/preview/pr-1379/reflect_8hpp.html @@ -0,0 +1,205 @@ + + + + + core/reflection/reflect.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/reflect.hpp file +

+

Function cubos::core::reflection::reflect and related macros.

+ +

Meant to be as minimal as possible in order to keep compile times low.

+
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
+
+
+

Classes

+
+
+
template<typename T>
+ struct cubos::core::reflection::Reflect +
+
Defines the reflection function for the given type T.
+
+
+
+

Functions

+
+
+ auto makeAnonymousType(const char* name, + const char* file, + std::size_t size, + std::size_t alignment, + void(*)(void*) destructor) -> CUBOS_CORE_API const Type& +
+
Creates a new reflection type with a unique name created from a type name and a file path, and with a minimal ConstructibleTrait.
+
+
template<typename T>
+ auto reflect() -> const Type& +
+
Reflects the given type T.
+
+
+
+

Defines

+
+
+ #define CUBOS_PACK(...) +
+
Helper macro used to pass arguments with commas to other macros, wrapped in parentheses.
+
+ #define CUBOS_EMPTY +
+
Helper macro with no effect.
+
+ #define CUBOS_REFLECT +
+
Declares the static reflection methods.
+
+ #define CUBOS_REFLECT_IMPL(T) +
+
Defines a reflection method for a non-templated type.
+
+ #define CUBOS_REFLECT_TEMPLATE_IMPL(args, + T) +
+
Similar to CUBOS_REFLECT_IMPL but tailored to templated types.
+
+ #define CUBOS_REFLECT_EXTERNAL_DECL_TEMPLATE(api, + T) +
+
Declares a specialization of cubos::core::reflection::Reflect for a templated type.
+
+ #define CUBOS_REFLECT_EXTERNAL_DECL(api, + T) +
+
Declares a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_REFLECT_EXTERNAL_IMPL(T) +
+
Implements a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_REFLECT_EXTERNAL_TEMPLATE(args, + T) +
+
Both declares and implements a specialization of cubos::core::reflection::Reflect for a type.
+
+ #define CUBOS_ANONYMOUS_REFLECT(...) +
+
Defines minimal reflection for a type private to a compilation unit.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/reflection_8hpp.html b/preview/pr-1379/reflection_8hpp.html new file mode 100644 index 0000000000..8b8ebd8ee9 --- /dev/null +++ b/preview/pr-1379/reflection_8hpp.html @@ -0,0 +1,147 @@ + + + + + core/ecs/reflection.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/reflection.hpp file +

+

Class cubos::core::ecs::TypeBuilder.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SymmetricTrait +
+
Trait used to identify symmetric relations.
+
+ struct cubos::core::ecs::TreeTrait +
+
Trait used to identify tree relations.
+
+ struct cubos::core::ecs::EphemeralTrait +
+
Trait used to identify types which are ephemeral and should not be persisted.
+
+
template<typename T>
+ class cubos::core::ecs::TypeBuilder +
+
Builder for reflection::Type objects which represent ECS types.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/related_8hpp.html b/preview/pr-1379/related_8hpp.html new file mode 100644 index 0000000000..63adfc6056 --- /dev/null +++ b/preview/pr-1379/related_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/query/node/related.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/render_2defaults_2target_8hpp.html b/preview/pr-1379/render_2defaults_2target_8hpp.html new file mode 100644 index 0000000000..c605507d1c --- /dev/null +++ b/preview/pr-1379/render_2defaults_2target_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/render/defaults/target.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/defaults/target.hpp file +

+

Component cubos::engine::RenderTargetDefaults.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ struct cubos::engine::RenderTargetDefaults +
+
Component which replaces itself by the default render target components to an entity.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/render_2shader_2bridge_8hpp.html b/preview/pr-1379/render_2shader_2bridge_8hpp.html new file mode 100644 index 0000000000..527aa72cde --- /dev/null +++ b/preview/pr-1379/render_2shader_2bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shader/bridge.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/render_2target_2target_8hpp.html b/preview/pr-1379/render_2target_2target_8hpp.html new file mode 100644 index 0000000000..18747a834f --- /dev/null +++ b/preview/pr-1379/render_2target_2target_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/target/target.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/render_2voxels_2grid_8hpp.html b/preview/pr-1379/render_2voxels_2grid_8hpp.html new file mode 100644 index 0000000000..ee5b5721f3 --- /dev/null +++ b/preview/pr-1379/render_2voxels_2grid_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/voxels/grid.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/render_2voxels_2palette_8hpp.html b/preview/pr-1379/render_2voxels_2palette_8hpp.html new file mode 100644 index 0000000000..58ab49c5a8 --- /dev/null +++ b/preview/pr-1379/render_2voxels_2palette_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/voxels/palette.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/render__device_8hpp.html b/preview/pr-1379/render__device_8hpp.html new file mode 100644 index 0000000000..39352ea2d6 --- /dev/null +++ b/preview/pr-1379/render__device_8hpp.html @@ -0,0 +1,620 @@ + + + + + core/gl/render_device.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/gl/render_device.hpp file +

+

Class cubos::core::gl::RenderDevice and related types.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::gl
+
Graphics module.
+
namespace cubos::core::gl::impl
+
Namespace to store the abstract types implemented by the render device implementations.
+
+
+
+

Classes

+
+
+ struct cubos::core::gl::FramebufferDesc +
+
Describes a framebuffer.
+
+ struct cubos::core::gl::FramebufferDesc::CubeMapTarget +
+
Describes a cube map target.
+
+ struct cubos::core::gl::FramebufferDesc::Texture2DTarget +
+
Describes a 2D texture target.
+
+ struct cubos::core::gl::FramebufferDesc::CubeMapArrayTarget +
+
Describes a cube map array target.
+
+ struct cubos::core::gl::FramebufferDesc::Texture2DArrayTarget +
+
Describes a 2D texture array target.
+
+ struct cubos::core::gl::FramebufferDesc::FramebufferTarget +
+
Describes a framebuffer target.
+
+ struct cubos::core::gl::RasterStateDesc +
+
Decribes a rasterizer state.
+
+ struct cubos::core::gl::DepthStencilStateDesc +
+
Describes a depth stencil state.
+
+ struct cubos::core::gl::DepthStencilStateDesc::Depth +
+
Decribes a depth state.
+
+ struct cubos::core::gl::DepthStencilStateDesc::Stencil +
+
Describes a stencil state.
+
+ struct cubos::core::gl::DepthStencilStateDesc::Stencil::Face +
+
Decribes a stencil face.
+
+ struct cubos::core::gl::BlendStateDesc +
+
Describes a blend state.
+
+ struct cubos::core::gl::SamplerDesc +
+
Describes a sampler.
+
+ struct cubos::core::gl::Texture1DDesc +
+
Describes a 1D texture.
+
+ struct cubos::core::gl::Texture2DDesc +
+
Describes a 2D texture.
+
+ struct cubos::core::gl::Texture2DArrayDesc +
+
Describes a 2D texture array.
+
+ struct cubos::core::gl::Texture3DDesc +
+
Describes a 3D texture.
+
+ struct cubos::core::gl::CubeMapDesc +
+
Describes a cube map.
+
+ struct cubos::core::gl::CubeMapArrayDesc +
+
Describes a cube map array.
+
+ struct cubos::core::gl::ConstantBufferElement +
+
Describes an element in a constant buffer.
+
+ struct cubos::core::gl::ConstantBufferStructure +
+
Describes the structure of a constant buffer.
+
+ struct cubos::core::gl::VertexElement +
+
Describes a vertex element.
+
+ struct cubos::core::gl::VertexArrayDesc +
+
Describes a vertex array.
+
+ class cubos::core::gl::RenderDevice +
+
Interface used to wrap low-level rendering APIs such as OpenGL.
+
+ class cubos::core::gl::impl::Framebuffer +
+
Abstract framebuffer.
+
+ class cubos::core::gl::impl::RasterState +
+
Abstract rasterizer state.
+
+ class cubos::core::gl::impl::DepthStencilState +
+
Abstract depth stencil state.
+
+ class cubos::core::gl::impl::BlendState +
+
Abstract blend state.
+
+ class cubos::core::gl::impl::PixelPackBuffer +
+
Abstract pixel pack buffer.
+
+ class cubos::core::gl::impl::Sampler +
+
Abstract sampler.
+
+ class cubos::core::gl::impl::Texture1D +
+
Abstract 1D texture.
+
+ class cubos::core::gl::impl::Texture2D +
+
Abstract 2D texture.
+
+ class cubos::core::gl::impl::Texture2DArray +
+
Abstract 2D texture array.
+
+ class cubos::core::gl::impl::Texture3D +
+
Abstract 3D texture.
+
+ class cubos::core::gl::impl::CubeMap +
+
Abstract cube map.
+
+ class cubos::core::gl::impl::CubeMapArray +
+
Abstract cube map.
+
+ class cubos::core::gl::impl::ConstantBuffer +
+
Abstract constant buffer.
+
+ class cubos::core::gl::impl::IndexBuffer +
+
Abstract index buffer.
+
+ class cubos::core::gl::impl::VertexBuffer +
+
Abstract vertex buffer.
+
+ class cubos::core::gl::impl::VertexArray +
+
Abstract vertex array.
+
+ class cubos::core::gl::impl::ShaderStage +
+
Abstract shader stage.
+
+ class cubos::core::gl::impl::ShaderPipeline +
+
Abstract shader pipeline.
+
+ class cubos::core::gl::impl::ShaderBindingPoint +
+
Abstract shader binding point.
+
+ class cubos::core::gl::impl::Timer +
+
Abstract timer.
+
+ class cubos::core::gl::impl::PipelinedTimer +
+
Pipelined timer.
+
+
+
+

Enums

+
+
+ enum class Property { MaxAnisotropy, + ComputeSupported } +
+
Render device properties that can be queried at runtime.
+
+ enum class Usage { Default, + Dynamic, + Static } +
+
Usage mode for buffers and textures.
+
+ enum class Type { Byte, + Short, + Int, + UByte, + UShort, + UInt, + NByte, + NShort, + NUByte, + NUShort, + Float } +
+
Data type.
+
+ enum class IndexFormat { UShort, + UInt } +
+
Index format.
+
+ enum class TextureFormat { R8SNorm, + R16SNorm, + RG8SNorm, + RG16SNorm, + RGBA8SNorm, + RGBA16SNorm, + R8UNorm, + R16UNorm, + RG8UNorm, + RG16UNorm, + RGBA8UNorm, + RGBA16UNorm, + R8SInt, + R16SInt, + RG8SInt, + RG16SInt, + RGBA8SInt, + RGBA16SInt, + R8UInt, + R16UInt, + RG8UInt, + RG16UInt, + RGBA8UInt, + RGBA16UInt, + R16Float, + R32Float, + RG16Float, + RG32Float, + RGB16Float, + RGB32Float, + RGBA16Float, + RGBA32Float, + Depth16, + Depth32, + Depth24Stencil8, + Depth32Stencil8 } +
+
Texture format.
+
+ enum class AddressMode { Repeat, + Mirror, + Clamp, + Border } +
+
Texture address mode.
+
+ enum class TextureFilter { None, + Nearest, + Linear } +
+
Texture filter type.
+
+ enum class Winding { CW, + CCW } +
+
Triangle winding mode.
+
+ enum class Face { Front, + Back, + FrontAndBack } +
+
Specifies a face.
+
+ enum class RasterMode { Wireframe, + Fill } +
+
Rasterizer mode.
+
+ enum class Compare { Never, + Less, + LEqual, + Greater, + GEqual, + Equal, + NEqual, + Always } +
+
Comparison function.
+
+ enum class StencilAction { Zero, + Keep, + Replace, + Increment, + IncrementWrap, + Decrement, + DecrementWrap, + Invert } +
+
Stencil action.
+
+ enum class BlendFactor { Zero, + One, + SrcColor, + InvSrcColor, + DstColor, + InvDstColor, + SrcAlpha, + InvSrcAlpha, + DstAlpha, + InvDstAlpha } +
+
Blend factor.
+
+ enum class BlendOp { Add, + Substract, + RevSubstract, + Min, + Max } +
+
Blend operation.
+
+ enum class Stage { Vertex, + Geometry, + Pixel, + Compute } +
+
Shader stage type.
+
+ enum class CubeFace { PositiveX = 0, + NegativeX = 1, + PositiveY = 2, + NegativeY = 3, + PositiveZ = 4, + NegativeZ = 5 } +
+
Cube map face.
+
+ enum class MemoryBarriers { None = 0, + VertexBuffer = 1, + IndexBuffer = 2, + ConstantBuffer = 4, + ImageAccess = 8, + TextureAccess = 16, + Framebuffer = 32, + All = VertexBuffer | IndexBuffer | ConstantBuffer | ImageAccess | TextureAccess | Framebuffer } +
+
Memory barrier flags for synchronization.
+
+ enum class Access { Read, + Write, + ReadWrite } +
+
Access mode for a resource.
+
+
+
+

Typedefs

+
+
+ using Framebuffer = std::shared_ptr<impl::Framebuffer> +
+
Handle to a framebuffer.
+
+ using RasterState = std::shared_ptr<impl::RasterState> +
+
Handle to a rasterizer state.
+
+ using DepthStencilState = std::shared_ptr<impl::DepthStencilState> +
+
Handle to a depth stencil state.
+
+ using BlendState = std::shared_ptr<impl::BlendState> +
+
Handle to a blend state.
+
+ using PixelPackBuffer = std::shared_ptr<impl::PixelPackBuffer> +
+
Handle to a pixel pack buffer.
+
+ using Sampler = std::shared_ptr<impl::Sampler> +
+
Handle to a sampler.
+
+ using Texture1D = std::shared_ptr<impl::Texture1D> +
+
Handle to a 1D texture.
+
+ using Texture2D = std::shared_ptr<impl::Texture2D> +
+
Handle to a 2D texture.
+
+ using Texture2DArray = std::shared_ptr<impl::Texture2DArray> +
+
Handle to a 2D texture array.
+
+ using Texture3D = std::shared_ptr<impl::Texture3D> +
+
Handle to a 3D texture.
+
+ using CubeMap = std::shared_ptr<impl::CubeMap> +
+
Handle to a cube map.
+
+ using CubeMapArray = std::shared_ptr<impl::CubeMapArray> +
+
Handle to a cube map array.
+
+ using ConstantBuffer = std::shared_ptr<impl::ConstantBuffer> +
+
Handle to a constant buffer.
+
+ using IndexBuffer = std::shared_ptr<impl::IndexBuffer> +
+
Handle to an index buffer.
+
+ using VertexBuffer = std::shared_ptr<impl::VertexBuffer> +
+
Handle to a vertex buffer.
+
+ using VertexArray = std::shared_ptr<impl::VertexArray> +
+
Handle to a vertex array.
+
+ using ShaderStage = std::shared_ptr<impl::ShaderStage> +
+
Handle to a shader stage.
+
+ using ShaderPipeline = std::shared_ptr<impl::ShaderPipeline> +
+
Handle to a shader pipeline.
+
+ using ShaderBindingPoint = impl::ShaderBindingPoint* +
+
Handle to a shader binding point.
+
+ using Timer = std::shared_ptr<impl::Timer> +
+
Handle to a timer.
+
+ using PipelinedTimer = std::shared_ptr<impl::PipelinedTimer> +
+
Handle to a pipelined timer.
+
+
+
+

Defines

+
+
+ #define CUBOS_CORE_GL_MAX_FRAMEBUFFER_RENDER_TARGET_COUNT +
+
Maximum number of render targets that can be set on a framebuffer.
+
+ #define CUBOS_CORE_GL_MAX_TEXTURE_2D_ARRAY_SIZE +
+
Maximum number of textures on a 2D texture array.
+
+ #define CUBOS_CORE_GL_MAX_CUBEMAP_ARRAY_SIZE +
+
Maximum number of cube maps on a cubemap array.
+
+ #define CUBOS_CORE_GL_MAX_MIP_LEVEL_COUNT +
+
Maximum mip level count.
+
+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_NAME_SIZE +
+
Maximum constant buffer element name size.
+
+ #define CUBOS_CORE_GL_MAX_CONSTANT_BUFFER_ELEMENT_COUNT +
+
Maximum constant buffer element count.
+
+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_ELEMENT_COUNT +
+
Maximum number of vertex array elements.
+
+ #define CUBOS_CORE_GL_MAX_VERTEX_ARRAY_BUFFER_COUNT +
+
Maximum number of buffers on a vertex array.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/resources_2gravity_8hpp.html b/preview/pr-1379/resources_2gravity_8hpp.html new file mode 100644 index 0000000000..3bcb04c75f --- /dev/null +++ b/preview/pr-1379/resources_2gravity_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/resources/gravity.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/resources_8hpp.html b/preview/pr-1379/resources_8hpp.html new file mode 100644 index 0000000000..78162a2669 --- /dev/null +++ b/preview/pr-1379/resources_8hpp.html @@ -0,0 +1,124 @@ + + + + + core/ecs/system/arguments/resources.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/rotation_8hpp.html b/preview/pr-1379/rotation_8hpp.html new file mode 100644 index 0000000000..0445748925 --- /dev/null +++ b/preview/pr-1379/rotation_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/rotation.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/scale_8hpp.html b/preview/pr-1379/scale_8hpp.html new file mode 100644 index 0000000000..e38cedf864 --- /dev/null +++ b/preview/pr-1379/scale_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/transform/scale.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/scene_2bridge_8hpp.html b/preview/pr-1379/scene_2bridge_8hpp.html new file mode 100644 index 0000000000..9f1096b3db --- /dev/null +++ b/preview/pr-1379/scene_2bridge_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/scene/bridge.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/scene_8hpp.html b/preview/pr-1379/scene_8hpp.html new file mode 100644 index 0000000000..ce3dfd9058 --- /dev/null +++ b/preview/pr-1379/scene_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/scene/scene.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + + diff --git a/preview/pr-1379/schedule_8hpp.html b/preview/pr-1379/schedule_8hpp.html new file mode 100644 index 0000000000..c3a57c6803 --- /dev/null +++ b/preview/pr-1379/schedule_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/system/schedule.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/schedule.hpp file +

+

Class cubos::core::ecs::Schedule.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Schedule +
+
Stores schedule nodes and the restrictions that must be met for them to run.
+
+ struct cubos::core::ecs::Schedule::NodeId +
+
Identifies a node in the schedule.
+
+
+
+
+
+
+ + + + + + diff --git a/preview/pr-1379/search-v2.js b/preview/pr-1379/search-v2.js new file mode 100644 index 0000000000..1fb71e1f8b --- /dev/null +++ b/preview/pr-1379/search-v2.js @@ -0,0 +1,897 @@ +/* + This file is part of m.css. + + Copyright © 2017, 2018, 2019, 2020, 2021, 2022, 2023 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +"use strict"; /* it summons the Cthulhu in a proper way, they say */ + +var Search = { + formatVersion: 2, /* the data filename contains this number too */ + + dataSize: 0, /* used mainly by tests, not here */ + symbolCount: '…', + trie: null, + map: null, + mapFlagsOffset: null, + typeMap: null, + maxResults: 0, + + /* Type sizes and masks. The data is always fetched as 16/32bit number and + then masked to 1, 2, 3 or 4 bytes. Fortunately on LE a mask is enough, + on BE we'd have to read N bytes before and then mask. */ + nameSizeBytes: null, + nameSizeMask: null, + resultIdBytes: null, + resultIdMask: null, + fileOffsetBytes: null, + fileOffsetMask: null, + lookaheadBarrierMask: null, + + /* Always contains at least the root node offset and then one node offset + per entered character */ + searchString: '', + searchStack: [], + + /* So items don't get selected right away when a cursor is over results but + only after mouse moves */ + mouseMovedSinceLastRender: false, + + /* Whether we can go back in history in order to hide the search box or + not. We can't do that if we arrived directly on #search from outside. */ + canGoBackToHideSearch: false, + + /* Autocompletion in the input field is whitelisted only for character + input (so not deletion, cut, or anything else). This is flipped in the + onkeypress event and reset after each oninput event. */ + autocompleteNextInputEvent: false, + + init: function(buffer, maxResults) { + let view = new DataView(buffer); + + /* The file is too short to contain at least the headers and empty + sections */ + if(view.byteLength < 31) { + console.error("Search data too short"); + return false; + } + + if(view.getUint8(0) != 'M'.charCodeAt(0) || + view.getUint8(1) != 'C'.charCodeAt(0) || + view.getUint8(2) != 'S'.charCodeAt(0)) { + console.error("Invalid search data signature"); + return false; + } + + if(view.getUint8(3) != this.formatVersion) { + console.error("Invalid search data version"); + return false; + } + + /* Fetch type sizes. The only value that can fail is result ID byte + count, where value of 3 has no assigned meaning. */ + let typeSizes = view.getUint8(4, true); + if((typeSizes & 0x01) >> 0 == 0) { + this.fileOffsetBytes = 3; + this.fileOffsetMask = 0x00ffffff; + this.lookaheadBarrierMask = 0x00800000; + } else /* (typeSizes & 0x01) >> 0 == 1 */ { + this.fileOffsetBytes = 4; + this.fileOffsetMask = 0xffffffff; + this.lookaheadBarrierMask = 0x80000000; + } + if((typeSizes & 0x06) >> 1 == 0) { + this.resultIdBytes = 2; + this.resultIdMask = 0x0000ffff; + } else if((typeSizes & 0x06) >> 1 == 1) { + this.resultIdBytes = 3; + this.resultIdMask = 0x00ffffff; + } else if((typeSizes & 0x06) >> 1 == 2) { + this.resultIdBytes = 4; + this.resultIdMask = 0xffffffff; + } else /* (typeSizes & 0x06) >> 1 == 3 */ { + console.error("Invalid search data result ID byte value"); + return false; + } + if((typeSizes & 0x08) >> 3 == 0) { + this.nameSizeBytes = 1; + this.nameSizeMask = 0x00ff; + } else /* (typeSizes & 0x08) >> 3 == 1 */ { + this.nameSizeBytes = 2; + this.nameSizeMask = 0xffff; + } + + /* Separate the data into the trie and the result / type map. Because + we're reading larger values than there might be and then masking out + the high bytes, keep extra 1/2 byte padding at the end to avoid + OOB errors. */ + let mapOffset = view.getUint32(12, true); + let typeMapOffset = view.getUint32(16, true); + /* There may be a 3-byte file offset at the end of the trie which we'll + read as 32-bit, add one safety byte in that case */ + this.trie = new DataView(buffer, 20, mapOffset - 20 + (4 - this.fileOffsetBytes)); + /* There may be a 3-byte file size (for zero results) which we'll read + as 32-bit, add one safety byte in that case */ + this.map = new DataView(buffer, mapOffset, typeMapOffset - mapOffset + (4 - this.fileOffsetBytes)); + /* No variable-size types in the type map at the moment */ + this.typeMap = new DataView(buffer, typeMapOffset); + + /* Offset of the first result map item is after N + 1 offsets and N + flags, calculate flag offset from that */ + this.mapFlagsOffset = this.fileOffsetBytes*(((this.map.getUint32(0, true) & this.fileOffsetMask) - this.fileOffsetBytes)/(this.fileOffsetBytes + 1) + 1); + + /* Set initial properties */ + this.dataSize = buffer.byteLength; + this.symbolCount = view.getUint32(8, true) + " symbols (" + Math.round(this.dataSize/102.4)/10 + " kB)"; + this.maxResults = maxResults ? maxResults : 100; + this.searchString = ''; + this.searchStack = [this.trie.getUint32(0, true)]; + + /* istanbul ignore if */ + if(typeof document !== 'undefined') { + document.getElementById('search-symbolcount').innerHTML = this.symbolCount; + document.getElementById('search-input').disabled = false; + document.getElementById('search-input').placeholder = "Type something here …"; + document.getElementById('search-input').focus(); + + /* Search for the input value (there might be something already, + for example when going back in the browser) */ + let value = document.getElementById('search-input').value; + + /* Otherwise check the GET parameters for `q` and fill the input + with that */ + if(!value.length) { + var args = decodeURIComponent(window.location.search.substr(1)).trim().split('&'); + for(var i = 0; i != args.length; ++i) { + if(args[i].substring(0, 2) != 'q=') continue; + + value = document.getElementById('search-input').value = args[i].substring(2); + break; + } + } + + if(value.length) Search.searchAndRender(value); + } + + return true; + }, + + download: /* istanbul ignore next */ function(url) { + var req = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest(); + if(!req) return; + + req.open("GET", url, true); + req.responseType = 'arraybuffer'; + req.onreadystatechange = function() { + if(req.readyState != 4) return; + + Search.init(req.response); + } + req.send(); + }, + + base85decode: function(base85string) { + function charValue(char) { + if(char >= 48 && char < 58) /* 0-9 -> 0-9 */ + return char - 48 + 0; + if(char >= 65 && char < 91) /* A-Z -> 10-35 */ + return char - 65 + 10; + if(char >= 97 && char < 123) /* a-z -> 36-61 */ + return char - 97 + 36; + if(char == 33) /* ! -> 62 */ + return 62; + /* skipping 34 (') */ + if(char >= 35 && char < 39) /* #-& -> 63-66 */ + return char - 35 + 63; + /* skipping 39 (") */ + if(char >= 40 && char < 44) /* (-+ -> 67-70 */ + return char - 40 + 67; + /* skipping 44 (,) */ + if(char == 45) /* - -> 71 */ + return 71; + if(char >= 59 && char < 65) /* ;-@ -> 72-77 */ + return char - 59 + 72; + if(char >= 94 && char < 97) /* ^-` -> 78-80 */ + return char - 94 + 78; + if(char >= 123 && char < 127) /* {-~ -> 81-84 */ + return char - 123 + 81; + + return 0; /* Interpret padding values as zeros */ + } + + /* Pad the string for easier decode later. We don't read past the file + end, so it doesn't matter what garbage is there. */ + if(base85string.length % 5) { + console.log("Expected properly padded base85 data"); + return; + } + + let buffer = new ArrayBuffer(base85string.length*4/5); + let data8 = new DataView(buffer); + for(let i = 0; i < base85string.length; i += 5) { + let char1 = charValue(base85string.charCodeAt(i + 0)); + let char2 = charValue(base85string.charCodeAt(i + 1)); + let char3 = charValue(base85string.charCodeAt(i + 2)); + let char4 = charValue(base85string.charCodeAt(i + 3)); + let char5 = charValue(base85string.charCodeAt(i + 4)); + + data8.setUint32(i*4/5, char5 + + char4*85 + + char3*85*85 + + char2*85*85*85 + + char1*85*85*85*85, false); /* BE, yes */ + } + + return buffer; + }, + + load: function(base85string) { + return this.init(this.base85decode(base85string)); + }, + + /* http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html */ + toUtf8: function(string) { return unescape(encodeURIComponent(string)); }, + fromUtf8: function(string) { return decodeURIComponent(escape(string)); }, + + autocompletedCharsToUtf8: function(chars) { + /* Strip incomplete UTF-8 chars from the autocompletion end */ + for(let i = chars.length - 1; i >= 0; --i) { + let c = chars[i]; + + /* We're safe, finish */ + if( + /* ASCII value at the end */ + (c < 128 && i + 1 == chars.length) || + + /* Full two-byte character at the end */ + ((c & 0xe0) == 0xc0 && i + 2 == chars.length) || + + /* Full three-byte character at the end */ + ((c & 0xf0) == 0xe0 && i + 3 == chars.length) || + + /* Full four-byte character at the end */ + ((c & 0xf8) == 0xf0 && i + 4 == chars.length) + ) break; + + /* Continuing UTF-8 character, go further back */ + if((c & 0xc0) == 0x80) continue; + + /* Otherwise the character is not complete, drop it from the end */ + chars.length = i; + break; + } + + /* Convert the autocompleted UTF-8 sequence to a string */ + let suggestedTabAutocompletionString = ''; + for(let i = 0; i != chars.length; ++i) + suggestedTabAutocompletionString += String.fromCharCode(chars[i]); + return suggestedTabAutocompletionString; + }, + + /* Returns the values in UTF-8, but input is in whatever shitty 16bit + encoding JS has */ + search: function(searchString) { + /* Normalize the search string first, convert to UTF-8 and trim spaces + from the left. From the right they're trimmed only if nothing is + found, see below. */ + searchString = this.toUtf8(searchString.toLowerCase().replace(/^\s+/,'')); + + /* TODO: maybe i could make use of InputEvent.data and others here */ + + /* Find longest common prefix of previous and current value so we don't + need to needlessly search again */ + let max = Math.min(searchString.length, this.searchString.length); + let commonPrefix = 0; + for(; commonPrefix != max; ++commonPrefix) + if(searchString[commonPrefix] != this.searchString[commonPrefix]) break; + + /* Drop items off the stack if it has has more than is needed for the + common prefix (it needs to have at least one item, though) */ + if(commonPrefix + 1 < this.searchStack.length) + this.searchStack.splice(commonPrefix + 1, this.searchStack.length - commonPrefix - 1); + + /* Add new characters from the search string */ + let foundPrefix = commonPrefix; + for(; foundPrefix != searchString.length; ++foundPrefix) { + /* Calculate offset and count of children */ + let offset = this.searchStack[this.searchStack.length - 1]; + + /* If there's a lot of results, the result count is a 16bit BE value + instead */ + let resultCount = this.trie.getUint8(offset); + let resultCountSize = 1; + if(resultCount & 0x80) { + resultCount = this.trie.getUint16(offset, false) & ~0x8000; + ++resultCountSize; + } + + let childCount = this.trie.getUint8(offset + resultCountSize); + + /* Go through all children and find the next offset */ + let childOffset = offset + resultCountSize + 1 + resultCount*this.resultIdBytes; + let found = false; + for(let j = 0; j != childCount; ++j) { + if(String.fromCharCode(this.trie.getUint8(childOffset + j)) != searchString[foundPrefix]) + continue; + + this.searchStack.push(this.trie.getUint32(childOffset + childCount + j*this.fileOffsetBytes, true) & this.fileOffsetMask & ~this.lookaheadBarrierMask); + found = true; + break; + } + + /* Character not found */ + if(!found) { + /* If we found everything except spaces at the end, pretend the + spaces aren't there. On the other hand, we *do* want to + try searching with the spaces first -- it can narrow down + the result list for page names or show subpages (which are + after a lookahead barrier that's a space). */ + if(!searchString.substr(foundPrefix).trim().length) + searchString = searchString.substr(0, foundPrefix); + + break; + } + } + + /* Save the whole found prefix for next time */ + this.searchString = searchString.substr(0, foundPrefix); + + /* If the whole thing was not found, return an empty result and offer + external search */ + if(foundPrefix != searchString.length) { + /* istanbul ignore if */ + if(typeof document !== 'undefined') { + let link = document.getElementById('search-external'); + if(link) + link.href = link.dataset.searchEngine.replace('{query}', encodeURIComponent(searchString)); + } + return [[], '']; + } + + /* Otherwise gather the results */ + let suggestedTabAutocompletionChars = []; + let results = []; + let leaves = [[this.searchStack[this.searchStack.length - 1], 0]]; + while(leaves.length) { + /* Pop offset from the queue */ + let current = leaves.shift(); + let offset = current[0]; + let suffixLength = current[1]; + + /* Calculate child count. If there's a lot of results, the count + "leaks over" to the child count storage. */ + /* TODO: hmmm. this is helluvalot duplicated code. hmm. */ + let resultCount = this.trie.getUint8(offset); + let resultCountSize = 1; + if(resultCount & 0x80) { + resultCount = this.trie.getUint16(offset, false) & ~0x8000; + ++resultCountSize; + } + + let childCount = this.trie.getUint8(offset + resultCountSize); + + /* Populate the results with all values associated with this node */ + for(let i = 0; i != resultCount; ++i) { + let index = this.trie.getUint32(offset + resultCountSize + 1 + i*this.resultIdBytes, true) & this.resultIdMask; + results.push(this.gatherResult(index, suffixLength, 0xffffff)); /* should be enough haha */ + + /* 'nuff said. */ + if(results.length >= this.maxResults) + return [results, this.autocompletedCharsToUtf8(suggestedTabAutocompletionChars)]; + } + + /* Dig deeper */ + let childOffset = offset + resultCountSize + 1 + resultCount*this.resultIdBytes; + for(let j = 0; j != childCount; ++j) { + let offsetBarrier = this.trie.getUint32(childOffset + childCount + j*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* Lookahead barrier, don't dig deeper */ + if(offsetBarrier & this.lookaheadBarrierMask) continue; + + /* Append to the queue */ + leaves.push([offsetBarrier & ~this.lookaheadBarrierMask, suffixLength + 1]); + + /* We don't have anything yet and this is the only path + forward, add the char to suggested Tab autocompletion. Can't + extract it from the leftmost 8 bits of offsetBarrier because + that would make it negative, have to load as Uint8 instead. + Also can't use String.fromCharCode(), because later doing + str.charCodeAt() would give me back UTF-16 values, which is + absolutely unwanted when all I want is check for truncated + UTF-8. */ + if(!results.length && leaves.length == 1 && childCount == 1) + suggestedTabAutocompletionChars.push(this.trie.getUint8(childOffset + j)); + } + } + + return [results, this.autocompletedCharsToUtf8(suggestedTabAutocompletionChars)]; + }, + + gatherResult: function(index, suffixLength, maxUrlPrefix) { + let flags = this.map.getUint8(this.mapFlagsOffset + index); + let resultOffset = this.map.getUint32(index*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* The result is an alias, parse the aliased prefix */ + let aliasedIndex = null; + if((flags & 0xf0) == 0x00) { + aliasedIndex = this.map.getUint32(resultOffset, true) & this.resultIdMask; + resultOffset += this.resultIdBytes; + } + + /* The result has a prefix, parse that first, recursively */ + let name = ''; + let url = ''; + if(flags & (1 << 3)) { + let prefixIndex = this.map.getUint32(resultOffset, true) & this.resultIdMask; + let prefixUrlPrefixLength = Math.min(this.map.getUint16(resultOffset + this.resultIdBytes, true) & this.nameSizeMask, maxUrlPrefix); + + let prefix = this.gatherResult(prefixIndex, 0 /*ignored*/, prefixUrlPrefixLength); + name = prefix.name; + url = prefix.url; + + resultOffset += this.resultIdBytes + this.nameSizeBytes; + } + + /* The result has a suffix, extract its length */ + let resultSuffixLength = 0; + if(flags & (1 << 0)) { + resultSuffixLength = this.map.getUint16(resultOffset, true) & this.nameSizeMask; + resultOffset += this.nameSizeBytes; + } + + let nextResultOffset = this.map.getUint32((index + 1)*this.fileOffsetBytes, true) & this.fileOffsetMask; + + /* Extract name */ + let j = resultOffset; + for(; j != nextResultOffset; ++j) { + let c = this.map.getUint8(j); + + /* End of null-delimited name */ + if(!c) { + ++j; + break; /* null-delimited */ + } + + name += String.fromCharCode(c); /* eheh. IS THIS FAST?! */ + } + + /* The result is an alias and we're not deep inside resolving a prefix, + extract the aliased name and URL */ + /* TODO: this abuses 0xffffff to guess how the call stack is deep and + that's just wrong, fix! */ + if(aliasedIndex != null && maxUrlPrefix == 0xffffff) { + let alias = this.gatherResult(aliasedIndex, 0 /* ignored */, 0xffffff); /* should be enough haha */ + + /* Keeping in UTF-8, as we need that for proper slicing (and concatenating) */ + return {name: name, + alias: alias.name, + url: alias.url, + flags: alias.flags, + cssClass: alias.cssClass, + typeName: alias.typeName, + suffixLength: suffixLength + resultSuffixLength}; + } + + /* Otherwise extract URL from here */ + let max = Math.min(j + maxUrlPrefix - url.length, nextResultOffset); + for(; j != max; ++j) { + url += String.fromCharCode(this.map.getUint8(j)); + } + + /* This is an alias, return what we have, without parsed CSS class and + type name as those are retrieved from the final target type */ + if(!(flags >> 4)) + return {name: name, + url: url, + flags: flags & 0x0f, + suffixLength: suffixLength + resultSuffixLength}; + + /* Otherwise, get CSS class and type name for the result label */ + let typeMapIndex = (flags >> 4) - 1; + let cssClass = [ + /* Keep in sync with _search.py */ + 'm-default', + 'm-primary', + 'm-success', + 'm-warning', + 'm-danger', + 'm-info', + 'm-dim' + ][this.typeMap.getUint8(typeMapIndex*2)]; + let typeNameOffset = this.typeMap.getUint8(typeMapIndex*2 + 1); + let nextTypeNameOffset = this.typeMap.getUint8((typeMapIndex + 1)*2 + 1); + let typeName = ''; + for(let j = typeNameOffset; j != nextTypeNameOffset; ++j) + typeName += String.fromCharCode(this.typeMap.getUint8(j)); + + /* Keeping in UTF-8, as we need that for proper slicing (and + concatenating). Strip the type from the flags, as it's now expressed + directly. */ + return {name: name, + url: url, + flags: flags & 0x0f, + cssClass: cssClass, + typeName: typeName, + suffixLength: suffixLength + resultSuffixLength}; + }, + + escape: function(name) { + return name.replace(/[\"&<>]/g, function (a) { + return { '"': '"', '&': '&', '<': '<', '>': '>' }[a]; + }); + }, + escapeForRtl: function(name) { + /* Besides the obvious escaping of HTML entities we also need + to escape punctuation, because due to the RTL hack to cut + text off on left side the punctuation characters get + reordered (of course). Prepending ‎ works for most + characters, parentheses we need to *soak* in it. But only + the right ones. And that for some reason needs to be also for &. + Huh. https://en.wikipedia.org/wiki/Right-to-left_mark */ + return this.escape(name).replace(/[:=]/g, '‎$&').replace(/(\)|>|&|\/)/g, '‎$&‎'); + }, + + renderResults: /* istanbul ignore next */ function(resultsSuggestedTabAutocompletion) { + if(!this.searchString.length) { + document.getElementById('search-help').style.display = 'block'; + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'none'; + return; + } + + document.getElementById('search-help').style.display = 'none'; + + /* Results found */ + if(resultsSuggestedTabAutocompletion[0].length) { + let results = resultsSuggestedTabAutocompletion[0]; + + document.getElementById('search-results').style.display = 'block'; + document.getElementById('search-notfound').style.display = 'none'; + + let list = ''; + for(let i = 0; i != results.length; ++i) { + /* Labels + */ + list += '
' + results[i].typeName + '
' + (results[i].flags & 2 ? '
deprecated
' : '') + (results[i].flags & 4 ? '
deleted
' : ''); + + /* Render the alias (cut off from the right) */ + if(results[i].alias) { + list += '
' + this.escape(results[i].name.substr(0, results[i].name.length - this.searchString.length - results[i].suffixLength)) + '' + this.escape(results[i].name.substr(results[i].name.length - this.searchString.length - results[i].suffixLength, this.searchString.length)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)) + ': ' + this.escape(results[i].alias) + ''; + + /* Render the normal thing (cut off from the left, have to + escape for RTL) */ + } else { + list += '
' + this.escapeForRtl(results[i].name.substr(0, results[i].name.length - this.searchString.length - results[i].suffixLength)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - this.searchString.length - results[i].suffixLength, this.searchString.length)) + '' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)); + } + + /* The closing */ + list += '
'; + } + document.getElementById('search-results').innerHTML = this.fromUtf8(list); + document.getElementById('search-current').scrollIntoView(true); + + /* Append the suggested tab autocompletion, if any, and if the user + didn't just delete it */ + let searchInput = document.getElementById('search-input'); + if(this.autocompleteNextInputEvent && resultsSuggestedTabAutocompletion[1].length && searchInput.selectionEnd == searchInput.value.length) { + let suggestedTabAutocompletion = this.fromUtf8(resultsSuggestedTabAutocompletion[1]); + + let lengthBefore = searchInput.value.length; + searchInput.value += suggestedTabAutocompletion; + searchInput.setSelectionRange(lengthBefore, searchInput.value.length); + } + + /* Nothing found */ + } else { + document.getElementById('search-results').innerHTML = ''; + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'block'; + } + + /* Don't allow things to be selected just by motionless mouse cursor + suddenly appearing over a search result */ + this.mouseMovedSinceLastRender = false; + + /* Reset autocompletion, if it was allowed. It'll get whitelisted next + time a character gets inserted. */ + this.autocompleteNextInputEvent = false; + }, + + searchAndRender: /* istanbul ignore next */ function(value) { + let prev = performance.now(); + let results = this.search(value); + let after = performance.now(); + this.renderResults(results); + if(this.searchString.length) { + document.getElementById('search-symbolcount').innerHTML = + results[0].length + (results[0].length >= this.maxResults ? '+' : '') + " results (" + Math.round((after - prev)*10)/10 + " ms)"; + } else + document.getElementById('search-symbolcount').innerHTML = this.symbolCount; + }, +}; + +/* istanbul ignore next */ +function selectResult(event) { + if(!Search.mouseMovedSinceLastRender) return; + + if(event.currentTarget.parentNode.id == 'search-current') return; + + let current = document.getElementById('search-current'); + current.removeAttribute('id'); + event.currentTarget.parentNode.id = 'search-current'; +} + +/* This is separated from showSearch() because we need non-destructive behavior + when appearing directly on a URL with #search */ /* istanbul ignore next */ +function updateForSearchVisible() { + /* Prevent accidental scrolling of the body, prevent page layout jumps */ + let scrolledBodyWidth = document.body.offsetWidth; + document.body.style.overflow = 'hidden'; + document.body.style.paddingRight = (document.body.offsetWidth - scrolledBodyWidth) + 'px'; + + document.getElementById('search-input').value = ''; + document.getElementById('search-input').focus(); + document.getElementById('search-results').style.display = 'none'; + document.getElementById('search-notfound').style.display = 'none'; + document.getElementById('search-help').style.display = 'block'; +} + +/* istanbul ignore next */ +function showSearch() { + window.location.hash = '#search'; + Search.canGoBackToHideSearch = true; + + updateForSearchVisible(); + document.getElementById('search-symbolcount').innerHTML = Search.symbolCount; + return false; +} + +/* istanbul ignore next */ +function hideSearch() { + /* If the search box was opened using showSearch(), we can go back in the + history. Otherwise (for example when we landed to #search from a + bookmark or another server), going back would not do the right thing and + in that case we simply replace the current history state. */ + if(Search.canGoBackToHideSearch) { + Search.canGoBackToHideSearch = false; + window.history.back(); + } else { + window.location.hash = '#!'; + window.history.replaceState('', '', window.location.pathname); + } + + /* Restore scrollbar, prevent page layout jumps */ + document.body.style.overflow = 'auto'; + document.body.style.paddingRight = '0'; + + return false; +} + +/* istanbul ignore next */ +function copyToKeyboard(text) { + /* Append to the popup, appending to document.body would cause it to + scroll when focused */ + let searchPopup = document.getElementsByClassName('m-doc-search')[0]; + let textarea = document.createElement("textarea"); + textarea.value = text; + searchPopup.appendChild(textarea); + textarea.focus(); + textarea.select(); + + document.execCommand('copy'); + + searchPopup.removeChild(textarea); + document.getElementById('search-input').focus(); +} + +/* Only in case we're running in a browser. Why a simple if(document) doesn't + work is beyond me. */ /* istanbul ignore if */ +if(typeof document !== 'undefined') { + document.getElementById('search-input').oninput = function(event) { + Search.searchAndRender(document.getElementById('search-input').value); + }; + + document.onkeydown = function(event) { + /* Search shown */ + if(window.location.hash == '#search') { + /* Close the search */ + if(event.key == 'Escape') { + hideSearch(); + + /* Focus the search input, if not already, using T or Tab */ + } else if((!document.activeElement || document.activeElement.id != 'search-input') && (event.key.toLowerCase() == 't' || event.key == 'Tab') && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + document.getElementById('search-input').focus(); + return false; /* so T doesn't get entered into the box */ + + /* Fill in the autocompleted selection */ + } else if(event.key == 'Tab' && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + /* But only if the input has selection at the end */ + let input = document.getElementById('search-input'); + if(input.selectionEnd == input.value.length && input.selectionStart != input.selectionEnd) { + input.setSelectionRange(input.value.length, input.value.length); + return false; /* so input won't lose focus */ + } + + /* Select next item */ + } else if(event.key == 'ArrowDown') { + let current = document.getElementById('search-current'); + if(current) { + let next = current.nextSibling; + if(next) { + current.id = ''; + next.id = 'search-current'; + next.scrollIntoView(false); + } + } + return false; /* so the keypress doesn't affect input cursor */ + + /* Select prev item */ + } else if(event.key == 'ArrowUp') { + let current = document.getElementById('search-current'); + if(current) { + let prev = current.previousSibling; + if(prev) { + current.id = ''; + prev.id = 'search-current'; + prev.scrollIntoView(false); + } + } + return false; /* so the keypress doesn't affect input cursor */ + + /* Go to result (if any) */ + } else if(event.key == 'Enter') { + let result = document.getElementById('search-current'); + if(result) { + result.firstElementChild.click(); + + /* We might be staying on the same page, so restore scrollbar, + and prevent page layout jumps */ + document.body.style.overflow = 'auto'; + document.body.style.paddingRight = '0'; + } + return false; /* so the form doesn't get sent */ + + /* Copy (Markdown) link to keyboard */ + } else if((event.key.toLowerCase() == 'l' || event.key.toLowerCase() == 'm') && event.metaKey) { + let result = document.getElementById('search-current'); + if(result) { + let plain = event.key.toLowerCase() == 'l'; + let link = plain ? result.firstElementChild.href : + '[' + result.firstElementChild.dataset.mdLinkTitle + '](' + result.firstElementChild.href + ')'; + + copyToKeyboard(link); + + /* Add CSS class to the element for visual feedback (this + will get removed on keyup), but only if it's not already + there (in case of key repeat, e.g.) */ + if(result.className.indexOf('m-doc-search-copied') == -1) + result.className += ' m-doc-search-copied'; + console.log("Copied " + (plain ? "link" : "Markdown link") + " to " + result.firstElementChild.dataset.mdLinkTitle); + } + + return false; /* so L doesn't get entered into the box */ + + /* Looks like the user is inserting some text (and not cutting, + copying or whatever), allow autocompletion for the new + character. The oninput event resets this back to false, so this + basically whitelists only keyboard input, including Shift-key + and special chars using right Alt (or equivalent on Mac), but + excluding Ctrl-key, which is usually not for text input. In the + worst case the autocompletion won't be allowed ever, which is + much more acceptable behavior than having no ability to disable + it and annoying the users. */ + } else if(event.key != 'Backspace' && event.key != 'Delete' && !event.metaKey && (!event.ctrlKey || event.altKey) + /* Don't ever attempt autocompletion with Android virtual + keyboards, as those report all `event.key`s as + `Unidentified` (on Chrome) or `Process` (on Firefox) with + `event.code` 229 and thus we have no way to tell if a text + is entered or deleted. See this WONTFIX bug for details: + https://bugs.chromium.org/p/chromium/issues/detail?id=118639 + Couldn't find any similar bugreport for Firefox, but I + assume the virtual keyboard is to blame. + + An alternative is to hook into inputEvent, which has the + data, but ... there's more cursed issues right after that: + + - setSelectionRange() in Chrome on Android only renders + stuff, but doesn't actually act as such. Pressing + Backspace will only remove the highlight, but the text + stays here. Only delay-calling it through a timeout will + work as intended. Possibly related SO suggestion (back + then not even the rendering worked properly): + https://stackoverflow.com/a/13235951 + Possibly related Chrome bug: + https://bugs.chromium.org/p/chromium/issues/detail?id=32865 + + - On Firefox Mobile, programmatically changing an input + value (for the autocompletion highlight) will trigger an + input event, leading to search *and* autocompletion being + triggered again. Ultimately that results in newly typed + characters not replacing the autocompletion but rather + inserting before it, corrupting the searched string. This + event has to be explicitly ignored. + + - On Firefox Mobile, deleting a highlight with the + backspace key will result in *three* input events instead + of one: + 1. `deleteContentBackward` removing the selection (same + as Chrome or desktop Firefox) + 2. `deleteContentBackward` removing *the whole word* + that contained the selection (or the whole text if + it's just one word) + 3. `insertCompositionText`, adding the word back in, + resulting in the same state as (1). + I have no idea WHY it has to do this (possibly some + REALLY NASTY workaround to trigger correct font shaping?) + but ultimately it results in the autocompletion being + added again right after it got deleted, making this whole + thing VERY annoying to use. + + I attempted to work around the above, but it resulted in a + huge amount of browser-specific code that achieves only 90% + of the goal, with certain corner cases still being rather + broken (such as autocompletion randomly triggering when + erasing the text, even though it shouldn't). So disabling + autocompletion on this HELLISH BROKEN PLATFORM is the best + option at the moment. */ + && event.key != 'Unidentified' && event.key != 'Process' + ) { + Search.autocompleteNextInputEvent = true; + /* Otherwise reset the flag, because when the user would press e.g. + the 'a' key and then e.g. ArrowRight (which doesn't trigger + oninput), a Backspace after would still result in + autocompleteNextInputEvent, because nothing reset it back. */ + } else { + Search.autocompleteNextInputEvent = false; + } + + /* Search hidden */ + } else { + /* Open the search on the T or Tab key */ + if((event.key.toLowerCase() == 't' || event.key == 'Tab') && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) { + showSearch(); + return false; /* so T doesn't get entered into the box */ + } + } + }; + + document.onkeyup = function(event) { + /* Remove highlight after key is released after a link copy */ + if((event.key.toLowerCase() == 'l' || event.key.toLowerCase() == 'm') && event.metaKey) { + let result = document.getElementById('search-current'); + if(result) result.className = result.className.replace(' m-doc-search-copied', ''); + } + }; + + /* Allow selecting items by mouse hover only after it moves once the + results are populated. This prevents a random item getting selected if + the cursor is left motionless over the result area. */ + document.getElementById('search-results').onmousemove = function() { + Search.mouseMovedSinceLastRender = true; + }; + + /* If #search is already present in the URL, hide the scrollbar etc. for a + consistent experience */ + if(window.location.hash == '#search') updateForSearchVisible(); +} + +/* For Node.js testing */ /* istanbul ignore else */ +if(typeof module !== 'undefined') { module.exports = { Search: Search }; } diff --git a/preview/pr-1379/searchdata-v2.js b/preview/pr-1379/searchdata-v2.js new file mode 100644 index 0000000000..9f34243bda --- /dev/null +++ b/preview/pr-1379/searchdata-v2.js @@ -0,0 +1,2 @@ +/* Generated by https://mcss.mosra.cz/documentation/doxygen/. Do not edit. */ +Search.load('O+!-x00000!wdibAQ=MyJbVTKrWgYN0RR9100DUf00001b_f6f00D0f00001W)uJb00BB0000320RTE60Du4iVI}|o00D9?00001Wi$W)00C_}00001VL$)?00Co000001WlR7700DMV00001X;=UN00DGf00001V`KmT00Cuc00001aBu(s00DD$00001a(n;)0RX=M00DA{00001Z;Su{00C^000001Zf00D9+0RR92Wh?;z00DF|0RR92b2tG200Ch>0RR92V?+S}00DPO0RR92Z%_dM00CrH0RR92VO#+K00C%X0RR93Y;z(30B8XK00DGv0RR92Zg>Fz0RZg^00Co!0RR92WrzU)00DN60RR92I+Otb0Rip`I+_8100C~G0RR92Z>RwP00C*P0RR92bhH5g00C*b0RR93X>)!70KfqN0RYAU00C~$0RR92Y19D#00C#(0RR92b>IO20RZ0t00C$00RR92VekO}00DIN0RR92bNm4S00CtJ0ssI3V+aBO00D9i0ssI3ZxjLm00Cwi0ssI3c_0D+00C?!0ssI3a4Z4<00D3^0ssL31_J;AWj+D`00C@50ssI3WJm%400C}J0ssI3byNZX0RU$Q00C`a0ssI3bz}kn00C`k0ssI3X>bAn00DS*0ssL3Xa@iRd4d7}00C@<0ssI3aEt-~00C)|0ssI3beIAF00C^C0ssL3X$JrSZK?tQ00DKb0ssI3ZL|Ua00C*b0ssI3ZomQn00UulX?y|zqyhlO0ssL3Y6k!TW!eG&00C#-0ssI3VdMe;00DC90ssI3W$*$300DOP0ssI4ZDGs;0Q>>~00BAz0{{U5YX>?E1AqVlc@hHv00DFw0{{R4av%c$00Ctt0{{R4a4Z7=00D0@0{{R4aySD300D450{{R4ctisL00C)A0{{U4ZU+DXcvb@d00C)Q0{{U5YzJ*%0{{R4Ze{}j00D1q0{{R4X>0{{R6ZDwLn0|1f(0N?`v00BDY0{{U5a0fc{1AqVlZ2AKL00ChF1ONa5X$S-W00D9i1ONa5WfTMe00DFw1ONa5VITwm00UuSZ8!n|S^@wj1ONa5b1Vb^00Cn<1ONa5X+Q)300DDG1ONa5c}xTV00d=kY-oZ20LB3T<^cdw1ONd5YXATNWNHKe0RU_O00DAz1ONa5Z+HX%00C@%1ONa5Z-fK@0RU|P00C~01ONa5VUz>_00D5C1ONa5bD#tO00CvD1ONa5W~>AN00C*T1ONa6V{D290JsDI0RV3R00Ak;1ONd6ZU89E1b_emchUp^00Cjz1ONd5aR2}TDdq$K0ReCTDCz`&00D0B1ONa5VfX|900D6R1ONa5a|8td00CtR1poj6W)KAc00C(h1poj6Y#apu00Ctp1poj6b0`G>00Chx1poj6Wi$l<00DA31poj6V?YG}00MGl-~<3h1poj8X>DX~1OUDS089k{00BBy1pom7asWDH1%LnnZ)ybq00C`s1poj6dUyo@00C)!1pom6QV#$DWQqj<00C@{1poj6a+C!C00D2B1pom6Qx51^@s7azF+E0RVLm00AjX1^@v8bPp&{27mwoWL5?M00CuQ1^@s7Yh(rh00Coa1^@s7Z*T?x00C@v1^@s7bbJN?00VGiWd;TSMg{NDz00D2x1^@v7R}TOIbJhj`00D2>1^@s7ZQup~00DaD1^@s7Y3v3700C$61^@s7clZVX00CwG1^@s7X#@uV0RUMK00CzZ2LJ#8ZWIRq00C(l2LJ#8Yaj;z00Cnr2LJ#8Z!8A@00C?=2LJ&8TMqyMDLw}P0RdVMC_)E-00DAH2LJ#8Z%_vS00C@P2LJ#8Z(Iie0RUYO00Ajz2LJ&9Tn{L02Y>(pWpW1q00C}#2LJ#8X@Ca+0svnRVGjTSDU1gI0s&qRU=Jvg2Y>(pc$fzO00D2J2LJ&8V-ElUDXs?q0RdtUD6$8D00CvV2LJ#8Zomfs00D2t2LJ#8W6TEt00DH;2LJ#8b=U_00RUwW00AlF2LJ&9WDh9l2Y>(pXYL0800D0H2LJ#8Y5WHO0RU$Y00Aio2mk>AW)CO~2!H?qcM=Ey00D0r2mk;9av%r*00D9)2mk^AX%A};00Aj72mk^BXb)-+C^!g!00DSD2mk;9Z%7CL00Cl72mk;9WmE_N00DAZ2mk;9XK*2mk;9cWej%00Ci!2mk;9a*PN70RU|e00AkO2mk>AY!4`$2!H?qWTFTF00CvH2mk;9bFc^i00DEh2mk;9WxNOg00DBs2mk>9Zw~+gDb5H00Re6gDAEXk00Cs!2mk;9W#9+^00C>}2mk;9W9$e300D3E2mk>9aSs3iDgFom0ReCiC;|z900CqO2><{AWe^Df00D9q2><{AWgH0r00DL)2><~Aa}NLkDJ}^B0ReIkC^89v00DG32><{AbwCLK00D4D2><{AZcGUP00C)I2><{AWmpLS00C@X2><{AWMl~d00C}l2><{BZ(%420B{Ka0RVRo00Ak02><~Bb`L0o34j0rWQqv@00Cu^2><{AYnTZD00Cp32><{AZ=?wT00C^O2><{AWv~eV00DEh2><{AVY~?d00Cvf2><{AY{&@!00Cvr2><{KXLEOUZDV9`Y-n<~AR{;P4at;ar00CtZ3IG5BW*73jhECIuHv00RdY9IvNXr00DF$3jhECWhe^(00Cz%3jhECax@D700Ch-3jhHC*8u00C{*3jhECdfW>D0RWo@00Cv_3jhECdh81T00C+83jhHCoCW{^Wc~{P00CtJ3;+NDatI6n00ChR3;+NDWfTkm00C?o3;+QDody5_ZYB%>00D0*3;+NDX)p``00DG13;+NDX*>)700DDC3;+NDZ%7OP0RWx`00C@N3;+NDVOR_R00C`Y3;+NDa%2nu00D1m3;+QDp9TN{Z*~j-00Crr3;+NDWq=F-00Cl#3;+NDY>W&500nbnaBgAv3jiPt08R`5a0~#F3;+NDI+zRq0RY1b00DBe3;+NDWw;Cg00Cyc3;+NDX2c8t00DK%3;+NDV$ci#00Cvz3;+NDZQKk100Cj*3;+NDa_9^I0RYJh00DCJ3;+NDW%vvL00C?M3;+NDV+0KV00C(V4FCWFW^nEd01yoT00DFs4FCWEZXgW+00D0%4FCWEax4u10RY4c00DA14FCWEWjqZ400Cw~4FCWEW=IVH00DJQ4FCWEVpI(P00CuM4FCWEZD0)m00CiU4FCWEa%>F%0RYMi00DA%4FCWEWqb_)00C=)4FCWEV~7m^00C)^4FCWFW^i&10F(^?00C>74FCWEW26lL00CjD4FCZE#R~udZng~o00D2h4FCWEX}}Et00DHy4FCWEY0M1(00DE-4FCWEZ`ch00RYAe00C^|4FCWEVdxD200C|84FCWEa`X)V00D3M4FCZE#|r=fZw3wk00CqQ4gdfFWe^Sk00Cka4gdfFY#a^%0RYGg00C$y4gdfFbSw@400D3^4gdfFWjGE100w4aaBg8_G7SK*4FKK^000gEA`SpP4gdfFIz$ct0RhVkI$jQd00DAj4gdfFWo!-r00DY(4gdfFX?P9*00DA-4gdfFWrPj@00DH04gdfFbC3=I00Ci^4gdiHpawc}t_*;j4gdfFa-t3Z00CvL4gdfFX0#3f00CyY4gdfFb-)e)0RW~D00DW-4gdfFbkGg}00C*%4gdfFcH9mC00Cj*4gdfHX<~BX3joFr0O$??0|0aYb^v$)00Ald4gdoIa{zS!cK|2^4}bsxbP5ju00DCr4*&oGX&es#00C?w4*&oGcPI}400Chx4*&oGax@PB00Cq=4*&oGX+RGE0swjdd;kCeDNGLl0s(mddjKd>4}bsxXjl&b00DDi4*&oGb!ZO&0RVmg00Aj<4*&rHeE=wU4}bsxa()j000Ci!4*&oGWsDC10RXxI00DWJ4*&oGVVn;D00DBM4*&oGa;Ogg0RX!J00DHg4*&oGWw;Lj00DEp4*&oGX2cHw00Cyo4*&rGya50Kbk+|500C~=4*&oGb>I&G00D324*&oIVQ*uu4*<{)0PGI{00DUN4*&oGWdINW00DFc5C8xHatsgv00CtZ5C8!Hy#W9La~==?00D9$5C8xHWhf8;00C?+5C8xHa5NAA00C_}5C8xHVL%W70RX-M00DDM5C8xHWl#_R00DAV5C8xHbzBet00DGj5C8xHcxVs+00Cug5C8xJc5`$X5CBFH0CW%l00BCB5C8!IzX3Xk5P$#yWR4I300C~65C8xHVVn>E00C{H5C8xHZKx0c00L}pk`Dl`5C8!HfB*miDZUT@0ReviD8dkc00Cvl5C8xHde9I600C*%5C8!Hf&c&kDdG?S0RWr;00Cv}5C8xHaPSZS00DXS5C8!Hod5sDUuNY0RfW>D3%d`00DBG5dZ)IWuy@R00CsG5dZ)IY_Jgk00C*X5dZ)Ib-WP(00Cmc5dZ)IdB_m}00DB&5dZ)Ibkq?500C~=5dZ-ImJ0v@DdrIX0Rfc@DC!Y_00Cw25dZ)Ia`+Jd00DLW5dZ)IbOaIr00DRk5&!@JWe^eo00DFs5&!@JXdDs%00DF&5&!@JX($o^00L!q;1K{W5&!@JIy4dh0Rfi_IzAGB00DAD5&!@JWlRzP00CrD5&!@JY*-Qi00C)U5&!@Jbz~9%0t2G}fdD8vV&)Klj1hop5&!@Jd2kW{00DA>5&!@JbchlF00C}}5&!`Jga7~mDVh=h0Re*mD4r6400Cj75&!@JbgU8p00CjL5&!`Ja1a0iWxf&s00C~o5&!@JX~+@)00C^y5&!@JWz-S?00D5?5&!`Ja}WRlW#$q900DaH5&!@JY48#N00DFM5&!@Jbo>$k00C|S6951KWe5`h00C_d6951KWfT(t00C?o6951KWgrs(00D9)6951LX=UIN04x�RVCk00DG76951KZa@;Q00D0L6951KX#f-e00CqM6aWALZVVIv00C(d6aWALVi*(v00DR&6aWDLb`SsoDJm2I0ReRoC@vI$00Ct*6aWALa6A+M00L!sBoqKb6aWANaAR~b69Cc^07w)700BBu6aWDMcMv*Y6o3E$Wo8rr00D4r6aWALd2|#200(t&V{>I>bVd&VZVv#o5CGf|0F)8{xDo(*6aWALI)D@a0Re>oI-V4O00DHQ6aWALbF35q00C*T6aWDL>j3}(XTB5w00Cjb6aWAMY;?F30LT;o00DQ-6aWALVb~M^00DB|6aWDL=m7u$XX+FH00Cj{6aWALbo3Me00CwC6aWALbO03q00ChJ6#xJMWDFGm00D3k6#xJMbr=-@00C|u6#xJMWh4~<00D9;6#xJMWH1!~00C?^6#xJMX*?AG00C%16#xMMLk|D}Wlj|U00DYZ6#xJMX;>8i00DDe6#xJMWn>iq00Coa6#xJMZg3R<00Cuo6#xJMa(op400Cu!6#xJMW{4F400Cu=6#xMML=OM~WttTL00DZQ6#xJMX`~eZ00DEV6#xJMY_Jso00CjP6#xJMb-Wb-00DHu6#xJMa>x|`00C*v6#xMMMGpW0blMdF00Cj%6#xJOa&~Q$6#&!~0OS<_00BDc6#xMOMh{~;NEHD16@UN%bN&?o00ChN761SNb`TZ-00C|m761VNS_A+Aav~N000D0%761SNY%CT400D0@761SNV>lK700BBa761VOTLd~p7JvW&bV?Qg00CoC761SNWmpyf00DAd761SNa%2_&00D1m761SNY;YC;00Loe92Nj}761VN=>Y%%XNDF400Ci&761SNbdVMR00Cu|761SNbet9d00Cj5761SNXQ&nc00CjH761SNaI_Wx00D2h761SNa=;b<0RRsZ00DH&761SNWzZG?00DE>761SNX51D400Cy=761VN5EB3aW$qRL00DaP761SNY4{cZ0RRyb00DFa7XSbOZwMCv00DLm7XSeO6cYdeZWSx406Z4}0RR#c00DAL7XSbOZ%`Ki00C%L7XSbOV_X*i00C}d7XSeO6B7Uda&8v@00Cuk7XSbOd3YB900Cis7XSeO6%zmfXo?pA00DH47XSbOaFiDS00Cv17XSbOWS|!S00DWX7XSbOXsj0i00CpN7XSbOa<~@&00CjX7XSbOa>N$^00Cvn7XSbOY0wt{0RR>g00DH|7XSbObKn;M00C*{7XSeO91{QmDe@Np0RbBmDE1eC00CtD7XSbOWds-i00D3c7ytkPc@P)?00DFs7ytkPZX6f@0RSEo00Ai|7ytnS9TRMIDC`#iA{YQH7=Qo)cQP0N00Ch_7ytkPa!42e0RR{i00Ajf7ytnQ7ZWI07=Qo)a$Xn!00CuY7ytkPZfqC;00DAx7ytkPZ+I9000Cou7ytkPbc7fH00Cx-7ytkPWsn#E00C^47ytkPZJZbY00D2J7ytkPbf_2r00DHa7ytkPZ?qTy0RS2k00Ak$7ytnQ851bP7=Qo)a>^J000Cvv7ytkPZrB(A00DB|7ytkPZ{!#N00Cp_7ytkPbnqAe00C(B7ytkPXZ#od00C(N82|tQatIj!00D3g82|tQZxk5-010n%aA9m{WMXva76ASh074f4Xcqv47Xa2508SVHx)=Z&82|tQIv^PU0RkTra5}~o07e;r00DGN82|tQZde%r00CuQ82|tQZDbh$00Cuc82|wQ>;V7)XLcC?00Cio82|tQbbuKE00Cr%82|wQA`1WkWRe*G00C~682|tQVVoHN00D5K82|tSY;JgP832qK0H_%N0RZX&00C#b82|tQVZa#x00DHy82|tQZp;|~00C*z82|tQXV@7400Cv*82|wQg988oZ|WHU00C+482|tQbo3bj00Ck882|tQasV0t00BA%8UO(SgabMZ8h`)+ZxR{+00C(l8UO$RbRZf400Chp8UO$Rax5AE00DF|8UO$RV>lWB00Ct_8UO$Ra6}pa00DDK8UO$RVNeQo00DDe8vp0RSuw00DG>8~^|TWrQ3600DD~8~^|TW{?~J00Cx}8~^|TZ=4(e00DHO8~^|TW~dwh00CvL8~_0TEe!wxbh;b>00Cvb8~^|TbHp3~00Cyo8~^|TX3!h}00D2-8~^|Tble;O00C&?8~^|TXXqRN00C+48~^|UY;v?50Q4LH00BDs8~_0UE)6;a9e@A00ChZ9smFVWgH#=00C?w9smIVN&^4^WiB2700D9`9smFVbvPaX00DG99smFVctjom00Cu69smFVbWk1u00C=O9smFVV_Y5p00CiQ9smIVO9KD_Wo{k-00DAx9smFVb$A{C00DG<9smFVc!VAR00Cu+9smFVbdVkZ00DHC9smFVZk!$f00D2J9smFVa;P2v0RT(`00DBe9smFVWw;&y00Cyc9smFVX2c!<00DK%9smFVV$dD{00C^)9smFVW!xSB00DU79smFVY3LpR0RT<|00AlV9smIWO#>+S9)JJ=Wd0ri00ChJ9{>OWWegtx00whoVrFo103HA+9sp<_0InVY?j8UV9{>OWIv5`S0Rc|~Ix-)C00DA19{>OWWk4SQ00C=89{>OWV@w|a00LoY>Ky=59{>RW-~j*uXJQ`!00CiU9{>OWbZj3000DGz9{>OWX?Pz100C}(9{>RWvIYPFWQrdE00C)^9{>OWY?L1W00Ci|9{>RWvjzYGa;6^u00CvH9{>OXc5a{_0I(kb00C~c9{>RWwFUqIDaIcF0RglID9Rsz00BMF9{>OWJ=h-r00DB|9{>OWZ{!~U00DIB9{>OWVelUS00DCL9{>OWW&9ri00D3UAOHXYX>Y(E00ApigYa6lmd0RWE(00AjXApijZjtD4FA%Fk@bXFk%00C}ZApigYbz~s`00D1mApigYV{jn=00DG%ApigYWqct300C=)ApigYV~8OD00DK5ApigYVw52O00Cv1ApigYWuPGd00DBQApijYkq7_*DY78|0RfN*D7GPh00DBmApigYWyB!>00CyoApigYX3!x300DK@ApijYmk0m>DdHgj0Rff>DCQx600DIDApigYZuB7l00DLSApigYZvY|y00LrT+#vu4A^-pZcnl%{00CtdA^-pZbQ~f800D9$A^-pZWhf#50RWQ-00Aj9A^-sak_ad`B7gt^Wj-PR00DGHA^-pZVN4Bme*bbU-8k00DAFBme*bWlSUh00DMVBme*bWLP8s00CrPBme;bj}HI=DQYAD0RfH=C~hQx00CumBme*bbbKTL00CiwBme*ba)=}V00Cu=Bme*bZj>Yd00Cv1Bme*faBgj3XQCqj#3KOmBLHM10H7oQ00BCtBme;ckPkY%B!B<`c)}zA00CvnBme*bbkHOK00DB=Bme*bW!xkH0Ru+{a5{DzBLH+GfZ`+o00C&|Bme*bbND0x00CwGBme;b69WJNbP6Q^00CtVB>(^ca}*^200DCvB>({c6axSObS5PL00CtxB>(^cb1)?U00Cw;B>(^cW;`VT00LoeASD1oB>(^cI!Gk|0Ra^QI#MNo00CrJB>(^cX<#J)00DAlB>(^cXKW<^00C@rB>(^cWq2h300DS@B>(^cZ-gZP0RTS(00DH6B>(^cZj>be00Cv1B>(^cX`m$l00CmAB>(^cZLB2#0RTV)00DHkB>(^cZoDM`00CvfB>(^cX~-o200CsqB>(^cVbmo600DB^B>(^cXW%6O00DXCB>(^cYwRTe00LoivLyiWB>(^cI`}030Rce+Isztu00DFeCIA2dZV)B_00CtdCIA2dZ5$>500C|yCIA2dZzv`J00D9?CIA2dX*4DP00DM7CIA2dZa^jg0RWK)00DGNCIA2dWl$yn00C!KCIA2da$F_=0RWf>00C!cCIA2dZfqt100C)oCIA2daCjyF00D4*CIA2dVT2|C00C`^CIA2dWsoKS00C~6CIA2eVQ*q40GuWO0RWN*00DBWCIA2dWUwXx0RWZ<00DBmCIA2dWxyr?00DZ&CIA2dY0M@700DB+CIA2dW!NSF00DH~CIA2dbL1uf00Cj@CIA5elLvC}CIA2da`q+w00CwGCIA2dW&|ey00CwSCjbBebr2^200CkaCjbEelm`F-av~=H00CttCjbBeYb+-K00Cn%CjbBeX*eeU0RWW;00C%3CjbBebVw%v0RWi?00C!ICjbBeZdfM(00C)UCjbBeWMn4*00CiYCjbBeXmBS000DD$CjbBeWPB$800Cu!CjbBea)>7Y00DB2CjbBeWt1lX00MAkPA34GCjbBeWuPYj0RWc=00D2XCjbBeVYDXz0RWl@00C~mCjbBeWyB`{00CvnCjbBea?mFL00CpxCjbBebKEBY00DI3CjbBeY3L^a00C_7CjbBfb8xyR0Q4sS0RWo^00C_TC;$KfZwM#=00D0fC;$KfY!oN}00(qvXK-Y5VxlGhwk7}^CjdSt0IDYd`X>MyC;$KfIv^+j0Rfx`IzA|X00DDEC;$KfbWA7!00C@LC;$Kfbyz3>00CiMC;$KfW@IP;00CucC;$Nf$_D@eWp*e400DY>C;$KfX@DpI0RYPf00DB0C;$KfWsoQU00Cx}C;$KfW}GMh00DKPC;$KfVyGwp00CvLC;$KfZL}x=00CjTC;$Kfa=<760RYSg00CsoC;$KfWzZ-900DB=C;$KfVcaMH00CvXI#wY;pC;$KfI`k+20RqhjWIAvt00Jq100DFeDF6TgWfUm@00CzjDF6Tgav&)H00ChpDF6WgU;*g07fPNEGYoSDF6Tga?B|J00Cv@DF6TgWb7#b00D0DDF6Wgg#!Qqbp9y-00ChFDgXchbqFc|0RV>s00Ai!DgXfih65-VDu4h1bRH@I00ChpDgXchXDliJ00C|?DgXchX*enX00C=0DgXchZ$v5p00D1GDgXciacmAM08lCb00BByDgXfihyyxcDu4h1Ze}U~00D1qDgXchX>=+800DG*DgXchVSp+C00DG{DgXfhrUd{2Zjveh00C*1DgXchXPhbk00C*DDgXcha;Pc*0RX2300C~aDgXchZ@4M|00C*fDgXchbi^tE00CplDgXchWzZ@B00DB=DgXchY1}FR00M7ht||cHDgXchI_N3@0RVOf00AlZDgXfibq6T?Du4h1bOI{?00DCfD*yliVGt_-0RpH6I%D!GfEFtN00DU%D*yliVJIsA0RYnl00DV4D*ylibT}&j00C(}D*ylibVMrv00C}FD*yoi)CB+mbXF?>00C}VD*yliX<#b=00D1iD*yljWpGd{0BkD&00BC3D*yoj)df0yD}Vq2bb>1Y00C)=D*yoicn1IhDV8e$0ReXhD4HvP00Cv7D*ylia;Pf+00C*PD*ylka%g5QD*%uy0JJLr00BC>D*yojc?UYkD}Vq2bj~XP00DE>D*yliVcaVK00Cp-D*ylidFU$u00U)jVfZNkj4A-`D*yoi`v3p|ZUQU-00CtNEC2ujWeh9;00D9mEC2ujV;C#|00DCzEC2ujbR;YQ00C(#EC2xj4Fv!JayBdg00Ct>EC2ujbU-Ws00DDGEC2ujVN5Il00CoCEC2ujcUUX{00D1aEC2ujWMnJ=00CiYEC2ujXmBh50RV#z00DA*EC2ujZ-6WS00C@z00C*DEC2ujbEqr;00C~UEC2ujWwa~+0RV>%00CvdEC2ujY{V=800C#pEC2ujZqO_M00CjvEC2ujblfZe00D2}EC2ujaOf-m00DFEEC2uja`Y?!00CwCEC2ukbZ)vV001oj00C|WEdT)kg$@7#Wfm;}00CzjEdT%kZXhiH00ChpEdT)kh7JG$Wil-Q00C?^EdT%kXFM$c00C}7EdT%kVMr|i00DGPEdT%kZ&WP+00D4XEdT%nV`*}8k}LoaEdVSn0AMWu00BB?EdT)lhz>e3+50CX+@0RVgk00DG_E&u=lWr!{S00DE3E&u=lW|S@f00Cy2E&u@leFgvlWTq|v00C*LE&u=layW0OBry00DI9E&u=lZ}ctz00C_JE&u@l4FLcFDF!b90RapFC<-rt00CtXF8}}mdKfPN00C(pF8}}mb0jYS00DF=F8}}mWiT%Q0RRsH00AjHF8~1n4gn}YFMt36WkxRm00DYVF8}}mX;d!&00DDaF8}}mWneD=00m=Vb7yi6E&whr001ulHZK5XF8}}mI&3ch0RS-*00DA{F8}}mWsENX00Cx_F8}}mW|%Jk00DKLF8}}mVx%ts00CvHF8}}mZLlu@00CjPF8}}ma=b490RS=+00DEzF8}}mVazW800C^$F8}}mbl5Kd00L%V!Y=^cF8}}mI^-_^0Rb};I_@uk00DCJF8}}mW&AGy00DXeFaQ7nX$UX?00D9iFaQ7nWfU*~00DFwFaQ7nb09DP00ChpFaQAp5CJ-Jf-it9FaQ7nb22ah00Ch>FaQ7nY(y{s00DGLFaQAno(lj0b5<|_00CiIFaQAnp9=s1b7n9A00DJsFaQ7nX>c$A00CrnFaQ7nVSF$E00DA>FaQ7na)>Yh00DK5FaQ7oX>4FH0F*EQ0RW&200CsAFaQ7oVriN%0H`nk00BC#FaQAop$j^=Fn|C7a=tJC00CvjFaQ7nbj&aS00DE-FaQ7nVc0ML00LoSP%r@AFaQ7ncjPbt0RY(w00AlVFaQAn+X?^yDgH130Rh?yC;~Bn00CtPF#rGoXAm&}00ChZF#rGobR01N0Rq?xD0BEQfFdyf00D9+F#rGoWi&AW00Cq=F#rGoVL&ke00C%5F#rGob4)P+00BBuF#rJo+7AE$DPA!E0Rh<$C}J^y00CuaF#rGoXK*n900CrnF#rGoX?!sN00DA>F#rGoVu&#S00DB2F#rGoWt1@h00Cs0F#rGoVW2Sp0RY|)00AkiF#rJp-47_RF@OL8WwtQ@00C^iF#rGoX~Z!A00CyoF#rGoZ_qIS00DH?F#rGoW!y0U00DO5F#rGpXkn%?0O&CQ0RY?&00AlZF#rJp+Yc!GF@OL8Wdbq)00C?YG5`PpX%I3100CweG5`PpZ5%QH00D0zG5`PpawswY00Cw$G5`PpWHd4W00Ch-G5`PpZ$L5t00MJt?lAyHG5`PpI!rPE0Ri6+I#x1(00CuOG5`PpXJj$}00CrbG5`PpX>c+C00DA#G5`Sr+zL8kSTTTnG5`Ppa)L4d00M7i?l1t3G5`PpWRx-h0RYJX00DHQG5`PpX{a&)00DKbG5`PpakMf300CsWG5`PpY``)A00DKzG5`PqVQ-!?0L(G~0RZCx00C#*G5`PpVc;?V0RT)500AlNG5`SqOARRSGJpU9a`rL+00CkCG5`PpWdt(-00C?YGXMbqP7MG7DHbyT0Rc@7C>k?>00C?uGXMYqZzwYW00D0_s0RUPJ00AkWGXMbrSq&(pGk^dAWvVj(00C^WGXMYqVz@H^00DKrGXMYqZ^SbI00d%lX=F4r0Aw=&nlk{(GXMYqbkH*Z00Cv0Rc}9DDpFa00C_HGXMYqZvZp^00D0XGynkrR1E+DDH1dQ0RdADC>At;00CzlGynhrZX`4S00C(#GynhraxgRi00DG1GynkrSPcLHDMB;=0RdMHC`L4Z00DALGynhrWmGf(00C!OGynhrWneS_00DGnGynhrZfrCF0RUVL00Aj@GynksTMa0DG=KmBWr8#S00C@@GynhrVvsZd00DKDGynhrZ=5s$0svwSU=08PDX2660s&zSUkxa(G=KmBbF?%700CvbGynhrb;L9P00C^uGynhrVbC-H00m-mX=HW`Gyps_0CF?{qBH>3Gynhrblfxm00Cw4GynkrUJU>NDgHD70RdeNC;~Nr00CtPH2?qsXAm_200D9qH2?qsWgImC00d)mXKfHO0O&IS_%r|_H2?qsIw&;&0Rm$UbUNlT06H~*00DDAH2?qsXG}E!00C}NH2?qsX;?J?00DGfH2?tsdkz2rd1^HP00DGvH2?qsX>>IJ00DG*H2?qsZh$oa00Cu&H2?qsI*c^{0RemtI+8Vj00C~8H2?qsZ=f{*00C*HH2?qsbgVT100CpNH2?qsWwl0^00CtnHUIztY$!GW00C((HUIztW;8Yc00D10HUIztbU-!$00Cu2HUIztc1$(^00LuS5HvS00C}>HUIztZ;Uno00D54HUIztZJ0Iy00D2FHUI$t1_b~CDXKOA0RaUCD6Teu00DEfHUIztZoD=C00D2pHUIztX~;GJ00DH)HUIztVbnGN00C^;HUIztW#Bdd0RRXE00AlNHUI$u2L&kbHh=&DW%f1z00C_NHUIztX#_U_00CwSHvj+uZ4fsA00D0nHvj+uavV1R00CwqHvj+uWGFWP00ChxHvj+uZ!|Xm00eVma%@;O0Hihm<~9I2Hvj+uIzTr70RamII#M@)00CuKHvj+uXJ9t~00CrXHvj+uX>2zD00DAxHvjEW$HHo00D0HHvjQ6G&umWIRF3yb8=#UH~^+N0Ju2-00BD2IRF6xzz;gqIe-8GZ`wHk00Cj*IRF3!aA;*?bFM7_(lP+VH2_370O&aY0RR~R00DUfIsgCxWe7R|0RS2S00C|kIsgCxZx}iN00DF!IsgCxbR;?e00DI>IsgFx8vy_Tb2d5v00C(_IsgCxctAP;0stfdCIJ8eDNH&50RSig00AjjIsgFyCjls2I)DHHbYeOH00C}lIsgCxb#OWW00D1yIsgI$BLO7=Vqqv_FggH6Isj5SfP6Xt00CrzIsgCxVVF7q00D5GIsgCxWu!U)00C{PIsgCxVX!&?0RS8U00C~iIsgCxZ@@YL00DHyIsgCxbj&&c00DK}e200ChnI{*LybSygn00C?=I{*LyWjH$k00UxhWY{_Y6gvPuI{*LyWkfpw00DDSI{*Lybyzz900D1aI{*Rz9swW$00Aj#I{*R!9RVK!C~!M~00DA#I{*LyVSqaT00Cu&I{*LyY>Ybq0RSQa00AkOI{*OyMgaf;DWW?70Rcq;D5g7r00DEXI{*LyXS6#200C~gI{*O!Apt09oI8NPI{*LyWX3xH00C~&I{*LyY1lge0RSoi00AlFI{*OzDFGQ00D1qJOBUzX>>dQ00MJ%0z3eEJOBUzWq>>Y0RTh+00AkGJOBX!Ljfq1Jb(ZJbDBH=00Cs8JOBUzVW>O+00D5WJOBUzWwbm100C{fJOBUzVZb~900C#lJOBUzY|K0W00C^$JOBU!a&L+}0N6YL0RSuk00AlJJOBX!D*-6%Jb(ZJWb!-!00CwCJOBUza{xU600DCbJpcd!Wehz400D9mJpcg!E&%`mDIPrl0Rb%mC?Y+800CquJpcd!WiUMe00DD0Jpcd!VLUwm00Ct}Jpcd!Y)Cx-00CuAJpcd#aB>(u08~8y00DGbJpcd!b7VaL00DJsJpcg!FaZDoDRw;o0Rb-oD0)4B00DD=Jpcd!X^1@l00DT8Jpcs&G66IJHUT&RNC5x=DVjY11pzSuGXXULHvvZhD5gDt00CvJJpcd!Y`i@H00CseJpcd!Zpb|V00CjnJpcg!IspIyDcU^%0RcGyDBeAQ00Cv>Jpcd!bL>3;00DLKJpcd!Z}>d`0RTJ!00AikJ^%p$I{_#NK7arLa}GWL00C|mJ^%m#ZyY`V00C(tJ^%m#bSORm00CnzJ^%m$ZDIaB05m=T00Ct>J^%m#bVNP?00Ci2J^%m#WKcc;00D4TJ^%m;YiDg^VsL6900C~&J^%m#Z`?ir00C*@J^%m#bm%?+00Cj{J^%m#ZuC9?00C+GJ^%m#VgNq?00C_VKL7v$Zwx;G00CnXKL7v$bQnJX00DI#KL7v$a3ntf00C|)KL7#%m;#mp00AjBKL7#&mjaanC_F!a00DDCKL7v$c}zb500CuEKL7#%oC2Bx00AjpKL7#&n*x~vC}cl?00DDqKL7v$Zgf8Y00D1$KL7v$bbvnq00DG{KL7v$b&Nj%00Cl>KL7v$WSBny00Cj1KL7v$aHKx~00CvHKL7v$ZLmK800CjPKL7#%paPx(00Ak&KL7#&p8}l%D9As600DE(KL7v$ZrDEn00D2_KL7v$bmTt(00DIBKL7v$b?`p`00Cn5KL7v$W&A$?00DCXKmY&%bqGKJ00D0fKmY*%q5=Q`DH=ck0Rf=`C>}t700CqqKmY&%Wh_7d00DC{KmY&%b2vZ%00Ct_KmY&%azsD?00n7lXKipWKLA)i0K7i{6hHt5Q0s;63`UfbsK!5-NbG$$R00C*nKmY&%c+5Zm00CjrKmY&%bl5-u00DL0KmY&%aO6M$00D05KmY;&0|@;G00AlXKmY;(0toyEDEvTx00CtJK>z>&b__uP00C(dK>z>&bQnPZ00C(pK>z>&b0k3k00D0*K>z{(1qlBK00AjBK>z{)1PJ~IC_F)c00Ct}K>z>&c1%G400C)IK>z>&bXY+E00CiMK>z>&XJkPD00CucK>z{(2M7TO00Aj>K>z{)1_%HMD11SH00DD?K>z>&WsE@p00DTCK>z>&VVFSx00Cs4K>z>&VWdF-00D5SK>z>&Ww1d200C{bK>z>&VZ1>A0sspL2?ziIDab(p0s#sL2nZ<7L4W`OWz<0c00DL0K>z>&Y~(=z00Cj@K>z{(4+sqi00AlXK>z{)4hRegDEvWy00CtJLI3~(ZVW;I00D0jLI3~(dKf|g00CqkLI3~(VI)ET00CtxLI3~;X>e|5c4Y8C05CxSa6tgVK>+YU05C!T00BBSLI42)5C}R@LVy4Pb5=qC00C)ULI45)K@LL>00Aj#LI45*Kn_9cC0su!2MGgP~DZD}e0s%%2L=GszLVy4PbI3vf00C~&LI3~(Z`eWr00C*00DGPL;wN+dI)w100AjlL;wN-c?fj~C}2c@00DDmL;wH*WpG3Q00LupR73!FL;wH*VSGdY00BCNL;wK+dk8v=M1TMRbCN^=00C#3L;wH*ZlFW}00C*HL;wH*WUNF000C~YL;wH*X}ClH0R>3`I(1`VVvIh3z&-$~KmZ&>0KP;300DHwL;wH*b=*V%0RR~Z00Cj>L;wH*Y3xJ*00DIJL;wH*a`;3500MAj;zR)cL;wK*+5rFoXAVUG00ChVMF0Q+bQnbd00DF!MF0Q+X(UAe00C|)MF0T++W`OpXEsFu00Ch-MF0Q+bU;M_00C}BMF0Q+X-q``00C!GMF0Q+WmrW30RY?q00C!YMF0Q+VQ57F00DGvMF0Q+WOPLU00C}#MF0T+-2njr2Lk{Ba*9O&00Cu=MF0Q+W|Tz$00Cy2MF0Q+b)ZE600CmAMF0Q+WvoR200C{XMF0Q+VYo#A00DBoMF0T+2?GEDa>_*j00CvrMF0Q+Yt%&m00Cp#MF0Q+Y2ZZw00L%k#6MgRZ-bLd6@00C_7MgRZ-b@WC60RRjP00ChDM*si;bOc8L00ChNM*sl;4GaJQXck8R00DFwM*si;WFSWX00C(xM*sl;4h#SRbTUT(00C$=M*si;XFNv$00C)2M*si;Wk^Q=00U%qXb?vLEJpxNM*si;I#fph0RScu00AjzM*sl4-7hDVn={9NB{rXK-QOMgaOo08B^#00M4p1VsQ+NB{u<#Q^{TXKF|Q0RZFy00C!oNB{rGR0IWy=00C#RNB{rl00DE(NB{rXJw*E0MJPQ00BDINdN%>tOYvYNq_(WXXZ%&00D09NdN!=Y4k||00D6NNdN!=Z~#gG00ChJN&o->Z462P00CtZN&o=>@dp3_WgbcZ00DI(N&o->aVSav0RYnr00Aj9N&o=?(hDd!N`L?XZazu?00Cu2N&o->a7;=700D1ON&o->b683M0RYtt00AjvN&o=?)C(wRN`L?XZf;5d00CuoN&o->aC}Mt0RYzv00Ak8N&o=?)(a?%N`L?XWs*t&00DEFN&o->Z=gy500C^KN&o=>*$V&xDY8lc0Rh+xD7H#~00CvZN&o->Y{W_c00C#pN&o->XV6Lj00D2-N&o=>+Y0~zDdI{10Rh?zDCSCl00D07N&o->Y4l0}00C$EN&o->WdKV60RY_#00AisO8@}@+zTiWOMn0YWEM*R00C|uO8@`{X>Vh6Vr5=R0D?*YtV#gfN&p5+03=HQ00BBGO8@}@-U~WJOMn0YcuGqE00D1OO8@`?VpvN600C@XO8@`^ZgOuJN&qfO0Ax!500UuiZ*E8chDiWwO8@}?#{mEVbB0R*00D1`O8@`?VvtJ!0RYVb00DEHO8@`?WS~m`00C~MO8@`?VXR9400C{XO8@}?)d2tjXTD1S00CjbO8@`?bjV8p00DE(O8@`?Zq!Qv00D2>O8@`?Y2Zr$0RaC700C|6O8@`?a_~z400D3IO8@`?X8cP400DCXOaK4@ZU{^O00ChROaK4@auiGe0RR9800CkkOaK4@VkAre00ChtOaK4@VK7Vp00C?^OaK4@VLVI#00Cn{OaK4@Z%9l40RRC900ClDOaK4@VpvQ700CiMOaK4@VPs4I00CrbOaK4@Y;a5f00DA#OaK4@Z+uJu0RRFA00C}@OaK4@X^cz&00C!`OaK4@a+pj200Cj1OaK4`bZmER8cYCAOaOvR0HjO+00BCxOaK7^0|z?1On?9Za>7gi0RV�DW>OaK4@bks}$00C**OaK4@bl^+?00D01OaK7@g%1D$Zt_e300D3IOaK4@Y5Yt800DFYO#lD^VF*nC00D9iO#lD^bQDbh00CthO#lD^ZXitn0RV;%00C|+O#lD^Z!k>&00C(>O#lD^bUaM}00C)2O#lD^b4X1900L!iCQSfNO#lG^hYtV&Y+g+O00CiQO#lD^ZD>sZ00DAtO#lD^Z*)xn00U)kZtP3|R80VSO#lD^I)F_80Re~)I*v_%00C%}O#lD^bev5900C*DO#lD^cc@JO00C#NO#lD^ZnRAR00L!c%1i*dO#lD_b7baA0KiQE00C*rO#lD^Y}8Ev0RU|S00DX6O#lD^bmUC{00C+0O#lD^bns0800D0HO#lG^ZUX@TZvy}VF){*900vF~00C|aP5=M_Zxl`d00C?oP5=M_VIWQb00CkqP5=M_Z!As#00C?=P5=P_a03AVaRUGXF)}_*076ax00C}BP5=M_Z%|GE00C@PP5=M_VO&lC00CoSP5=M_Z)i>c0RVCX00C}vP5=M_Z+K1s00C)!P5=M_bc9X-00Ci&P5=M_a*$2{00DHCP5=M_Wt>g`00C~IP5=M_WvEU70RVFY00CsQP5=M}WoK+~Y5Yw9I8Fd=P5`b>0Ju&700BC_P5=P`bOSonPJjRbVcJdr00DI3P5=M_Vdzc(00Cs~P5=M_bo5RD00D0LP5=M_X#h_E00D0XPXGY`FcAO&c@j?m00DFsPXGV`X&g@g00DF&PXGV`ZYWOx0RS-(00C??PXGV`VK`3!00C`2PXGV`azsx600D1GPXGY`G7$g)b5>6P00DGbPXGV`ZeULU00C)cPXGV`Z){Hh00U)ia4t^(P)`7IPXGV`I(Sb20Rb}+I)+bx00Cr-PXGV`Y?My`00D2BPXGV`W}r_100C*HPXGV`ZmdrL00CjLPXGV{aBU1v0Ju*800DHqPXGV`W5`bc00CjnPXGV`bkt7(00V7oZn#ST+D!o3PXGY`;Q;^vXYNk`00Ck0PXGV`bofsI00DCTPXGV`Wdu+F00CPyhe{azIc300Cu2Pyhe{bWBhH00CiAPyhe{Wmr%E0RW%}00CuWPyhe{c4$xl00C)kPyhe{baYSv00CoqPyhh{p$7l~ZiY|*00D1`Pyhe{X^>C=00DHCPyhe{W1LU`00Cv9Pyhe{YN${E00D2VPyhe{a0N_vn00UugdVo*>x=;Y-Pyhe{I`B{c0Rf~3I{r|A00ChHQ2+n|atu)b00CtZQ2+q|It~B00Ch-Q2+n|V?a>=00BBiQ2+q}I}SQbQGfseWl~W900D4XQ2+n|VPH`J00C%bQ2+n|b8Jxn00C}tQ2+n|Z+KAv00C)!Q2+n|bA(X<00C)=Q2+n|Y>-g^00C^4Q2+n|Z=6v800Cp7Q2+n|WvEdA00C^SQ2+n|b+l0c00DElQ2+n}ZEzS-0KicI0RWr}00CyuQ2+n|Z`4r$00Cs$Q2+n|Y~WD<00C*{Q2+q|_zwU9WAae|00Cw8Q2+n|cKlHQ00BAzQUCz~`42h>Qh)#fa}H7f00DCrQUCw}VH{Eb00C_xQUCw}W++ks00D0QUCw}bU;!700C}BQUCx3b#HQEXl0g50N_smUQhtWQ2^{w08CN<0RYGW00CueQUCw}ZE#Wm00C)sQUCw}bbL|(00CiwQUCw}bcj*_0RYel00DB8QUCw}WtdU`00Cy6QUCw}W~5R800DKXQUCw}Vz5#G00CvTQUCw}ZM;$d00CjbQUCw}a>!Bu0RYkn00DB;QUCw}WY|&w00L%c&Qbv0QUCw}bmUS100D09QUCw}Z}d_C00DCPQUCz}(Fgzmat2cX00CtRQvd(~W)M>V00CweQvd(~bsSRw00CkmQvd(~Whhes00C_-Qvd(~VKh?!00DA3Qvd+~(+B_oaz;}C00Cr5Qvd)0W@tcD08mo^00C=OQvd(~V_;JN00CiUQvd)0W?}$S0BlnL00BC3Qvd-0)Cf9!Q-A;gXM$4z00C}_Qvd(~X^>L@00Cr{Qvd(~VVqL{00C&CQvd(~bEs1Q00CsKQvd(~WwcWO00DBkQvd(~a==pn00CvjQvd)0Y-Wy90L)VW0RZ9w00C#*Qvd(~Vc=5$00DI7Qvd(~a_mz800Cw4Qvd(~Yxq+D00CqEQvd(~X#`XN00D3cQ~&@0au8Gi00CtdQ~&@0WE@lg00C|yQ~&@0Whhht00D9?Q~&@0Z!}Z@0RVmw00DGBQ~&@0Wkgf}00DDKQ~&@0W>8cB00CxJQ~&`0e-HoxWnxqS00DYtQ~&@0X>3#g00M7wTvPyZQ~&@0ba+$%00DA>Q~&@0Z-`U?00D50Q~&@0ca&5B00Cv1Q~&@0X`oa900DNUQ~&@0I;>Ox0ReyzI?Tp00CioRR9412@e1PXNFY(00C}_RR911X^>R_00D58RR912bZvlD0Gw3-0RS-#00DBWRR911Z?IJW00C^aRR911Z@g6i0RS=$00DW(RR911bj(!%00C*zRR911bJ$e?00C~^RR911W#m-=00DIBRR911ZtztA00Lua!c_qFRR911I{Z}t0Rb}&ItEsN00DFiRsaA2XcSfe00CzjRsaA2X&_br0RTD?00DC>RsaA2WiVC%00Cn*RsaA2Zah{100Ch_RsaA2bVybJ00DDORsaA2X;fAK00CrLRsaA2bYNBh00C)cRsaA2Y;0Bl0RTM_00DD&RsaA2aC}w(00CiwRsaA2ZHQI?00DQ7RsaA2Z_C00C+8RsaA2WcXG900DIVRsaA2X#`gQ00C?YR{#J3a1d7j00DCrR{#J3bR1Uz00C?wR{#J3btqQ=00ChxR{#J3W;9m-00Ct>R{#J3WI$H{00DGHR{#J6aA;{|a#jGQRsgnE08Cc^0RTG@00CuWR{#J3V`x_Z00C}pR{#J3VRTmj00DG*R{#J3bAVR>00C)+R{#J3WQSO5S4WJFj100D4HSO5V4L=gZ1DOOkj0Rcl1C|X#600DDgSO5S4WoTFc00CoeSO5S4Zgf}x00CioSO5S4bbwd@00DD`SO5S4X^dC^00Cr@SO5S4beLEG00C*9SO5S4Y@}EK0RTo300AkmSO5V5MG+{pSbzWlWx7}Z00DZ!SO5S5aA~So0LWMX00DE(SO5S4bl6w`00C~^SO5S4W#m`@00DC9SO5S4a`0FH00DLOSO5S4WBgbE00DFYSpWb5We8aS00nbxZgpo;R{)+@0OVHyP*?yCSpWb5Iuuy|0Rcx5Ix1O!00D9^SpWb5WjI*?00DG9SpWb5b3|DH00Ci2SpWb5V^CQD00DPaSpWb5Z(Lab00CrTSpWb5VQ5(Z00C%jSpWb6Y;z`70CZUZ00C@zSpWb5VT4%#00C}_SpWb5Z;)9400C*1SpWb5bevfL00Cp7SpWb5WvE#I00DBYSpWb8WpZI@(o+E3Q~;t?0JK>E0RYMY00DE%SpWb5bkJD<00C~+SpWb5W!zZ+00C{{SpWb5b?8|D00C$2SpWe5(E$JfXZl$H00CkCSpWb5bOc%e00DFgS^xk6X%Jcf00C|mS^xn6(g6SgXChhv00ChpS^xk6bSzo`00Ct(S^xk6XE<5_00Cq^S^xk6X+&B800DAJS^xn6(*XbhXI5GO00CiIS^xk6bYNNl00D4jS^xk6b!=Jy00C}tS^xk6VR%{q00CuwS^xk6Y=l|>0RYqi00C!^S^xk6VU$_`0RXoU00C~GS^xk6ccfYX00D2RS^xk6Zm?Pa0RXrV00CsYS^xk6Wx!eh00CsiS^xk6Va!?p00D2(S^xk7Yizb!0N7dp00C~^S^xn6xex#WXYN`600D0DS^xn6x)1;XWd2$J00L=c_*wu0TL1t7WC&XT00ChVTL1t7Zx~wu0RX!Y00CqqTL1t7Whh$!00C?+TL1t7X*62^00Ch-TL1t9b!=wnS^yqf06<#+00BBiTL1w7+zvTYvxob7Wfp00DJ!TL1t7ba-0;0RZL@00Ak4TL1w8Tz~)pa|T=h00DFkTmS$8WfWWh00DCvTmS$8b0Ay*0RX@d00Aj1TmS(9zYr)eTz~)pWj0&@00Cz{TmS$8WJFv500C)ATmS$8a!_0V00ClFTmS$8a$H;h00CuUTmS$8bZA@v00DDuTmS$8X>?ow0RYkv00Ak0TmS(9(GVzvTz~)pVTxP;00DH8TmS$8Wtdz50RYwz00AkaTmS(A)evnco?HN^Tz~)pWUgEQ00L)WdRzdyTmS$8Wx!kj0RX}f00Ak`TmS(9!4N3aTz~)paN1k|00DL4TmS$8Zs=S900Cj{TmS$8W%OJC0RZF>00AigT>t?A;}9qWU4Q@qWeQyY00DFoT>t<9VHjNi00CtlT>tt?A!w@JqU4Q@qY(8B800C@9T>t<9VN6{B00DGTT>t<9a#&pe00D1aT>t<9aAaKo0RZ9<00Aj*T>t?A;SeZvU4Q@qWqMrz00DG@T>t<9VTfG-00Crt<9X_Q?600C^8T>t<9VW3?A00DNUT>tt?A#SkdKU4Q@qWX4?p00C~!T>t<9Y1CZ+0RYGl00AlBT>t?A#}FvwU4Q@qVd`A~00DIJT>t<9W%ykH0RYSp00AikUH}0C%MfiS{#^hFUVs1rWDZ^c00ChdUH}0A=nwz_DJEV30RiU_C@Nln00C?;UH||AY&c#300Ch>UH||AbVObN00DDKUH||BZ)qT208m~40RYMn00AjrUH}0B$q*=HUVs1rVQO9g00DGzUH||AWq4iy00C`&UH||AWQ1M-00Ci&UH||AZ;)O900C^4UH}3B-Vopr00AkYUH}3C-4NdpD5ze500CvLUH||Abhuss00CjXUH||AWW-(o00M4soL&IRUH}0A)DQpxDcW8D0RhtxDBfOx00Cj-UH||AbnIRL00Cw4UH}0A+7JK%DgIsn0Rq_&Z7BF&00Lit00CtPUjP6BbQE6z00C(lUjP6Bav)y-0RY$#00Aj1UjP9C*AOT$Uw{AsWHw&_00Ch>UjP6BWkg>900DAJUjP6Bc~D;f0RZX{00AjnUjP9C=@2MjUw{AsWoBOh00D4rUjP6Ca(Px?0CZmf0RZd}00Ak4UjP9C>kuf2Uw{AsWsY9}00D58UjP6Bd7NJW00DHOUjP6BZm3@X00DQdUjP6BZ?sG+FbxvUI5Tu0484mdS3w2UjP6BI@n(T0R`<4X<}n^IviR6P+9x00DEtU;qFCVaQ+r00DWVE_ODZQx-500Cv@VE_UETo76i00AlTVE_UFTM$_gDEMK300DFUVE_ODZ3toj00ChRVgLXEaui|!00ChdVgLXIWoL78a6DlEo?!sIVF2u503c!j00BBCVgLaFT@X4vVt@bvVM1a600DGLVgLXEWl&-O0RX8G00AjnVgLaFs1PV%Vt@bvWoBXk00C!iVgLXEWOQNx00C)wVgLXEa)4q00RXQM00AkCVgLaFt`I1YVt@bvWtL(900D5GVgLXEd8A?h00LrkhGGD!VgLXEbg*Io00CvXVgLaEu@C?ODaK*|0RgZOD9U1h00DE*VgLXEb=YD600D2_VgLXEZscMB00D36VgLXEa`0jR00C(BVgLXEWBg(O00C|SV*mgGb9umG00?6M00DCjV*mjFs}KMIDIQ}00RgHIC?aEk00CquV*mgFVK8F=00D0{V*mjFtq=eKDMDia0RgNKC`My|00Cu8V*mgFc2r{k00CiIV*mgHVQh04V*os30AOPP00BB?V*mjGvJg6SV}JkwWqM-(00C!$V*mgFWQbz`00C)^V*mgFa+G5L0R$@vb2@Ee3}686V1QO)0GeX}00DHMV*mgFWwc`e00DElV*mjFuL1x8WyWIw00D5yV*mgFdC+4300DH?V*mjF$^rlZDdJ-Q0RhPZDCT2;00C_5V*mgFZ1iIQ00DLSV*mjF%mM%bDF$Q!0RhVbC<pGZWv?$00D0vWB>pGawKE`00DF=WB>pHZgT)+05D_#00Lxl++zSXWB>sGumS)9WJ+WJ00C)EWB>pGa#Umh00D1WWB>pGXkcUj00DGnWB>pGVQgdo1pvANv;wjMxB|8U00Aj@WB>&LxdO8Su>!XOwE`%FWPktxbc$pE00Cv1WB>pGbD(4Z00DERWB>pGVXR~T00DWjWB>pGZn$Is0sy`OyaE6LDa2#|0RX@P00Ak`WB>sHzXB-KWPkz!y#l)eC_Tz#fZAjL0RYef00AlRWB>sH&jKj)WPktxKKf(;00DFYWdHyHJP2g~00DFkWdHyHWfWxq00DCvWdHyHb0B2^00ChpWdHyIJs{#_04!wy00D9`WdHyHZ#-oH00DGDWdHyHVMt{F00DANWdHyHWmIJV00D4XWdH#H!U6yRDQ0B=0Rh1RC~9SZ00C}rWdHyHZ+K+@00C)!WdHyHbA)9800DA}WdHyHWsqe60RY4T00AkSWdH#I!vZLvWq<$yWu|2S00D5WWdHyHd9-B!0RYAV00Ak$WdH#I#R4eAWq<$yXUb&&00C~&WdHyHY1m}|00DB|WdHyHbmV0K0RYGX00AlRWdH#K#{zV7D7s|;>SX}*Wq<$yWcpeh0XKg@a0CHpizGMJkWdI;%0EA`$00BCRW&i;J(*ioAW`F$t0RZ#|00CvtW&i*IbJS)400C^;W&i*Ib>LD?100Cq=X#fBLWk6{F00DGHX#fBLVN7WN00C@LX#fBLby#Tt00C`YX#fBLb!2G(00CoaX#fBPa&vBVWAs@7z+(VNX8^ot0B~sl0RYPZ00DW7X#fBLa*$~N00Cu|X#fBLb)0Dc0RYSa00DWZX#fBLbgXFr00C*TX#fBLbhv2%0RYbd00DBuX#fBLWyom&00CsqX#fBLVbo~=00Cv%X#fEL&;bAea^`6O00Cv{X#fBLbns~a00C+CX#fBLa{Ork00MG%;AsE?Y5)KMbO>qy00C|iY5)KMWf*Dz00M4yzG(m+Y5)NM&H(@cbS`QD0svbBT>}6Cb2w@M00C(}Y5)KMctmOd0RUVB00CuCY5)KMdQ@rv00C)QY5)KNVRK4q0AOkW00BB?Y5)NNUIRLCYJdO%VRmW&00DA-Y5)KMWrS(~00C`^Y5)KMVUTJ700Co`Y5)KMW1MOL00C*DY5)KMXsBuc00D5WY5)KMVYF%h00DBkY5)KMXTWLz00D2tY5)KMXv}H=00DH;Y5)KNaB?zg0N82(0RYwk00C#{Y5)KMVeD!E00DIJY5)KMaQJEf00CwGY5)KMbOdVv0RUGM00CtXYXATNZ4_$&00C(lYXATNbRcU000ChpYXATNbS!HC00C?=YXATNWjJd900MJl3Tps9YXATNWJGHK00CuAYXAWNf(ifuDOzg)0Re#uC|+xT00CuWYXATNXKZT#00CrjYXATNX?SY@00DA-YXATNVuWh|00Cu+YXATNY>;aJ00C*1YXAWNgbDxwDWYot0RV^!00AkiYXAWOhYBdLYk&X&WwvVo00C^iYXATNX~b&)00CyoYXATNZP04~00D2-YXATNa@=bG0Rn>xC}yT>fZ}Ta00Cs^YXATNVf1SN00D3MYXAWNh6(@yDF$o+0RV~$00AiwYybfPi3%tbY=8g(Wg2V%00C?wYybcOX((&}00Cw$YybcOZ!~NG0Rn{zD0B*JfI4gd00Ct{YybcOc1&yl00CiAYybcQW^8kuYXAUj09b4Q00BB)YybfPiwZhyY=8g(WpZo)00C!uYybcOWPoe{00C)+YybcOa*S*M00Cl>YybcOWteOL00MYyRBHg9YybfO(g^?oWUg!g00CvPYybcOY`AOy00CmYYybcOVZ>|z00C~wYybfO(+L0pW!7u}00C{900C|;Z2$oP)Cm9qY&vZK00Ch>Z2$lPazt$a00Cu6Z2$lPbWm*o0RYws00C@VZ2$lPVPI_l00C}hZ2$lPX>4r(00CrjZ2$lPb$D$600DGIrY^H4h00CjDZ2$lPW3X)i00C*XZ2$lPbi8c<00DBsZ2$lPWyoy+0RYzt00CswZ2$lPW!P;100Cv*Z2$oP*a-jubLwpX00D09Z2$lQaAo9e0Q7AD0RY(v00C(PZU6uQXb5fq0RY+w00ChXZU6uQbQo>`00CtlZU6uQXe4d`00(7tY<6>SbkJ-7G;IK!Z2-<~0QzkJ4sHM{ZU6uQIxubk0Rh_yI!xC*YyiS;0N8E-0RZg*00C$0ZU6uQVeoDM00DINZU6uQbo_1r00C(NZvX%RZU}Dx0RZj+00CzdZvX%RVHj@!00DF!ZvX%RY$R_000C?&ZvX%RZ!m8F0RZm-00Cz_ZvX%RVL)#H00DGHZvX%Ra!hXk00CuEZvX%RWLR$i00C}ZZvX%RWn^yv00U`oat?0*Hg5oGZvX%RcW`e200D1)ZvX%RWQ1=300C}_ZvX%RX^?LK0RTb+00DBGZvX%RZ=i1g00DHSZvX%RVXSWe00DBcZvX%RWw>tu00DHqZvX@Uml2y0nGux{00Ak=ZvX@VmJyl}m=Tl_DAaF&00Cv%ZvX%Rbm(sY00DIFZvX%RW%O?V00C_JZvX%RVE}Ld00D3YZ~y=SYz%M!00CtZZ~y=Sco=X100D0vZ~y`TpAnrA00Ai~Z~y`Uo)Mf8C@^q<00BKVZ~y=SazJnZ00D1CZ~y=SbWCsn00CiAZ~y=Sa#(Nx00CuQZ~y=SaAa@*0RW*900Aj*Z~y@Tpb;o^aDV^-VR~=?00DG@Z~y=SVTf=50RW>B00AkKZ~y@Tq7f*VaDV^-Wu9;V00DZYZ~y@Srx5@FDY9??0Rg5FD7J8b00DHoZ~y=TX=SW%0K{+r0RW{D00Ak~Z~y@Tq!B3CaDV^-blz|P00Cv@Z~y@SsSyAHDe`at0RgBHDE4rG00CtDZ~y=SZUk`v00C(VaR31Ts}TSJDHd@60RgHJC>n8q00CqmaR2}TWGHa}0RXKL00Aj9aR31UtPv00C}{aR2}TX_RpQ00C#3aR2}TWuS2Y0RXcR00AkiaR31UvJoh-aex2;WVUet00C~kaR31TwGjXTDavsG0RglTD9&+!00C{(aR2}TZ`^SJ00DC1aR2}TX6SJM00Cs~aR2}TVf1kT00D3MaR31Tw-EpVDF$)?0RgrVC<=0b00D0hasU7UbQp2~00CtlasU7UbR=>B00C(#asU7UaxiiL01jz(Z)9_4W?^t`Vr6W1#BTs3Z~$s>0FH0~%5VVeZ~zc-04{L=QgHx$aR8=q0K{a{vGVVT5x400VYxbMA5gLURC$a{vGVI*@Y!0RdtPI-YZY00CvBa{vGVXRLDo00CsOa{vGVX}EI$00DBoa{vJXxDh&Hc5;Bka{vGVWy*5^00DH?a{vGVblh_Q00CvZiI9I00D1~bN~PWX_RyT00DHGbN~PWX`plf00DERbN~PWZ>)3x0s|Wa83bb}aAtG>a&&;QbN~PWWVmzy00C*rbN~PWa?o@D0st5U76bqRDcp1b0s$8U6$B{abbtT>W$1JO00DIJbN~PWbog`t00CwGbN~PWYy@=x00ChNbpQbXA_M>dDHe4A0RbTdC>nKu00C_vbpQYXZzy#D00D9?bpQYXW;AsG00Cq=bpQYXVL){N00D1CbpQbXBm@8fDN=O+0RbZfC{}fV00D1YbpQYXbYyh^00CucbpQYXbZ~V500C)sbpQYXa(s0F00nkuaBO!xbO6?L01$NmOmzT)bpQYXI*4@u0RT1=00AkabpQbYH4`YPb$|c?Wv+Dq00C#VbpQYXWW03%00C*jbpQYXa>#W600CmobpQYXY}9oC00Cv%bpQYXWZ-oG00D32bpQYXZR~Xb00C_BbpQYXW%zXf00DUZbpQYXZv=J#0RT7?00Aiwb^rkZHxnonc7Ol@Wg2z>00C?wb^rhYX()C800Cw$b^rhYZ8UZO00D10b^rhYazJ(f00Cx3b^rhYWK4Dd00CiAb^rhYZ&-E!0RTD^00Ajvb^rkZITI*oc7Ol@Wo~u=00C@vb^rhYX?%7700Cx#b^rhYZ-{mP00DH4b^rhYWt4UR00DNIb^rhYVW4&Z00VYxa|(64}@00C`scK`qZX?S-400U)Xa~gL5Hg^DicK`qZI)rxs0Re#vI+AyQ00C^6cK`qZVW4*a00C*HcK`qZa;$d%00CvPcK`qZbhvi_00M7e{&oPqcK`tZJp=#&a?W=E00C*zcK`qZVc2&700D5`cK`qZbmVsc00Cy|cK`qZY4CRd00C(BcK`qZbNqJz00DRccmMzaZwPn*0RV{x00CqacmMzaX&86_0RWi>00Ai^cmM$bm200CplcmMzaY|wZB00CvzcmMzac-(jZ00D2}cmM$aj|Kn%Deiax0RfH%DDrrK00CwAcmMzaZ~%D#00ChJc>n+bXbgD(00DCnc>n+bZWwt000D0vc>n+bX(V|700DCn+bX)t*J00C?^c>n+bY&>}Y00D18c>n+bV@P=b00C@Hc>n+bWmI_p00DSfc>n+bZ(w-<00DMpc>n(00Crtc>n+bX@q$I00DA}c>n+bXOMXS00DHCc>n+bWt@2c0RWc<00Akec>nn+bV!(L-00DHyc>n+ba?E)E00Cvvc>n+bbJ%$R00C~^c>n+gVrO=Kb7>BE09tqe=y(8Zc>tn$0OWZ900BDcc>ndH?_cb3A$g00C)2dH?_cY)E;4-XL!00AjrdH@9h3=a|y77q>&5DzG9dVl}{WO8}{00C)&dH?_ca)^2W00C!?dH?_cY?OKc00Cv1dH?_cc%XU!00D2NdH@0d6%QE?00AkodH@0e6b~2=D7bon00BL|dH?_ca>#lB00D2#dH?_cbkuqP00CjzdH?_ca^QLZ00Cv@dH?_caO`>j0RS5h00AlZdH?|d8V@M^dVl}{WdeHu00DXmdjJ3dX%Kq=0RSNn00Ai+djJ6fAP;jW7JC37dw>7|bS8TM0RSBj00AjDdjJ6e91kcwdw>7|WkP!Z00DYRdjJ3eWoa^d08o1X0RSHl00AjrdjJ6e9uFvFdw>7|a%y`300CigdjJ3dWq5l40RSZr00Ak4djJ6eBo8Qvdw>7|bdGxf00DBAdjJ3dWt@8e00DNQdjJ3dZm4?z00L}petQ6}djJ6dBM$%pDZYCE0RbWpD8hSy00DH!djJ3dWzc&70RSft00Al7djJ6eCJ!j!dw>7|ZRUFb00D3AdjJ3da`bxu00CzDdjJ3dWB_~s00ChJd;kCeZw!0@0RSlv00Ai&d;kFfC=Vzce1HG}Zz6mE00DF=d;kCeWiWgI00DG1d;kCeX*_%Y00DABd;kCkc5icIXKZ(@dI0iz09Jbdw0i*7djJxA07!fQ00BBqd;kFeDiZ(!DRO)O0Rbr!D0X~+00Cuud;kCeXM}tJ00Cr*d;kCeX^?yX00DBAd;kCeVw`*c00Cs8d;kCeX{dYv00DBYd;kCeXS93(00C^ed;kCeWx#v@00DT$d;kCeZ_IoE0RSu$00Al3d;kFfD-$T(e1HG}W#W7Q00C_3d;kCeY4Cgi00Cz9d;kCeZTx%y00D0TeE00ChdeEIeEU{tbegFXgLjwQ-Wg>n600DX?egFUgX)JyK0RTh;00CtegFUgb%=fd00DH4egFUgc$9ts00Cv1egFUgbfA6!00C>JegFUgW2}Av00CjLegFUib7o>PegJrW0Jwet00BC_egFXhMguy`et-Z0a?*YP00Cs$egFXg>jeM-Ddv6v0Rid-DC&NI00Cw2egFUgXZU^q00CtFegFUgX#{@&00D9ee*gdhVi11-00C|me*gdhZybLB00DC%e*ggh?F9eDT03h0Rip>D29K400Cu;e*gdhY?OZh00C*5e*gdhW}trn00D2Ne*gdhbgX{>00CvPe*gdhcDR2400CjXe*gdjYHV{Te*k=c0K|U)00BD6e*ggi@C7>9e}Di1W!`@P00C#_e*gdhWbA(c00C+8e*gdha`=A$00CnDe*gdhZUle;00D0bfB*mia}a<40RTY;00DFyfB*miVIY7200C_#fB*miIxK(y0Rch=Ix>KO00DG3fB*miZa{zl00Cu2fB*mia!h~#00CiAfB*piBM1NibY6e}00CiQfB*piB?tfkDQ8N00Cr1fdBvjY*c{&00DAZfdBvjZ(xA{00V7lcW8hBo`3*mfdBvjI&6Ue0Rb!sI(mVC00CrxfdBvjY>0sX00DB2fdBvjZ#-J00C&uf&c*k;|~AlbO?h000DFkg8%>lW)y<}0RZX`00Ctng8%>ldL)AY00M7m8iN2Tg8%^lWjccZ00Cn@g8%>lZbX9s00Ci2g8%>lZcu{&00C)Mg8%>lZCrx@00DJkg8%^l<_`b?a&ChF00Cukg8%>lW_W`D00Cxxg8%>lb%cWe00Cl(g8%>lWsrja00C{5g8%>lVVr{i00DBMg8%^l=nnt^a;}2_00CsOg8%>mW@xB`0Jwty00DHqg8%>lZpecG00D2#g8%>la@2zW0RZO@00DB~g8%>lW#oeZ00Cy|g8%>lX7Gam00DLOg8%>lV*G;u00CtJga7~mZ3u(_00ChRga7~maukFB0RZU_00D9!ga7~mWF&+D00L%c8iW8Uga7~mYcPZW00Cnn00DLCga7~mbnt`#00DURga7~mW&DHy0RZd|00D9cg#Z8nWekM?00Cwag#Z8nW*CJ400DI#g#Z8nVkCtC00Ctxg#Z8nZ7_uZ00Ch(g#Z8nay*3q00MMo0)+rVg#Z8nZb*dy00D1Og#Z8nX;_5-00DGfg#Z8nV`PN@00CiYg#Z8na&UzJ00DG%g#Z8nczlHb00(Jwb8Kc}Wt@Tl)Pevog8*oQ0NR59)`S3pg#Z8nI*5e;0Rit1I;Mqy00C{Rg#Z8nZ?uH~00D2hg#ZBnCldexc*cbQ00D2xg#Z8nV$g*E00BDIg#ZBoC=)u|g@6D7W#WYZ00D67g#Z8nVeo|j00C(Bg#Z8nbNqz>00C|Sh5!HoZwQ6}00C(Zh5!Hoa}QKc4+{jX#gZ@0N!c<-fjSvZvYs60N{QA7JvXAf&esv07QlW00BBqh5!Kp@BuochJXM8WvYe%00C~Yh5!HoX}E>}0svJ4djbFfDa3{V0s&M4dIBiQhJXM8dC-Oc00DH`h5!HoY2bzc00L)pzJ>tih5!KoB?15eDfWf{0RbceDEfwg00DFWhX4QpZU~0}00CtVhX4QqZg%X302GG+0RRI400D9&hX4QpWhjRL00C|;hX4QpZZwAg0RRO600AjLhX4Tq1OO;RhkyV9JxYfF00BKxhX4Qpa#)7|00D1ahX4QpbYzDB00CiYhX4Qpa&U(L00CuohX4QpaD0aV00L=mI)?y)hX4QpI*5k=0RaX8I+BNg00Cr}hX4Wqum!RO00AkchX4WruLZFMD6EHo00DWjhX4Qpa=eEC00DHuhX4QpbI6AP00C*vhX4QpXVixP00Cv%hX4Tp#03BWDdvX&0RqDXawy=30P2T;00C|AhX4QpW&DQ#00DFYhyVZqa|nn400DUphyVcqv;_bGDH@0X0RgiGC?1G_00BKDhyVZqax91d00D0@hyVZqbU26r00Ch>hyVZqazuy#00Cu6hyVZqa8QT<0RXlI00AjnhyVcrwFM|(h=2eAbY_SE00CughyVfryam1m00Aj_hyVfsy9K=kD1eB700Cu&hyVZqc94hw00D27hyVZrb8U2p0Gx;b00Cv9hyVfrxCOce00AkohyVfsw*|QcD7c7#00CsahyVZqWXOmB0sz1T!UX^UDb$Dn0s+4T!38MVh=2eAW#EVa00C|4hyVZqVep6m0RYAY00AldhyVcr#RVt;iGTnBZU%_}00D0fi2wirX%vY700DFwi2wirX&{LJ00Cqsi2wirZY+ra00D0@i2wiwb8m8CZetXP09J?qtcU>4hyeD8062*N00BBai2wls#|1iAiGTnBd0vSC00DAli2wirbZm(L00DDyi2wirX?TeM00C!yi2wirWrT?U0RVaj00Cr>i2wirY?O%r00DBEi2wirZ=i_)00DQVi2wirbF7H~00CvPi2wirbGV5B0RVdk00DEvi2wirWypyD00D5$i2wirdDMvj00DH`i2wirVc>}X00DI7i2wirVeE+j0RVjm00AlZi2wlsdR-N00CjjiU0rsbkK?b00CsyiU0rsW!#DY00DO5iU0rsa_EWx00Cw0iU0rsbM%S;00Cn9iU0rtac{1Q004^s00BA%ivR%u%m_LVi+}(Da~6vL00C|uivR!tZzPKV00C(#ivR!tbTEqm00D3|ivR%tZ4Lkdazcv$00Cu2ivR!tW=x9!00CxFivR!tby$l400ClNivR!tWMqo~00C`kivR%tZVmteWp;}I00DJ+ivR!tWq^wS00DJ|ivR!tag2)q00C~2ivR!tX_$)u00C#7ivR!tb)<^`00C^OivR%tZw>$fdA5rH00DHmivR!tX~2sB00DHyivR!tZp@1S00CvvivR!tWY~)U00Cv*ivR!tcI1ly00DC9ivR!tW$=pt00DFMivR!tV*HB$00U!iZ*YqMu!{f!i~s-uItYva0ReChIu?w800DFyi~s-ucqEJf00Ctxi~s-ubTEtn00C|`i~s-uZ#;|u0RZj}00DDIi~s-uZcK~-00D1Oi~s-uX;_Q^00DGfi~s-uaAb@C00D1mi~s-ub8w6R00Cuoi~s-uZG4OX00DJ^i~s-ubBK%p00C}}i~s-uZ66X00Co$jQ{`vbc~Gv00Cu^jQ{}v&<_9sDV~i00RhhsD58yk00CvFjQ{`vYp{&~00CjPjQ{}v(hmRuDZ-5a0RhnuD8`L|00C{xjQ{`vWz>xT00DH`jQ{`vbKs2t00DXCjQ{}v)DHjwDe{c~0RhtwDE5tj00D0NjQ{`vbp(z80RYwy00AiwjsO7x)ek5Xj(`9Ga~h5S00DC%jsO4wWhjmS00CnzjsO4wV>FHc00eDwa$&rU0PKwb3XT9ejsO4wIzWy90SDI)X>wt2V`e&_hX9I+0Cb7~Jc|HAi~yL808);C00C`SjsO4wWq6JN00DG00CiMkN^MybYzeK00C}lkN^MyZ*Y(R00C)skN^MybbOEi00CiwkN^MyY>1Em00Cu=kN^Mya+Ht&00Cv1kN^MybD)p_00DBQkN^MyVXTk<00D5akN^Py3=04ODZY>Z0RamOD8i6{00DH!kN^MyWzdiS00DE>kN^MyW!#Ve0RRpQ00AlJkN^Pz4GSpjkbnRIbMlY?00D0LkN^MyX#kM`00ChJkpKVzbPSOI00C|ikpKYz5DNeSDISpk0RaySC?b)700CtvkpKVzbTE+s00Ch(kpKVzWjv7p00M7v7?A)%kpKb!5(^Xy00AjdkpKb#5epLwC|Hqz00DGfkpKYz7z+RaDQ=Mf0Ra~aC~}d200CuqkpKVzbAXWm00Ci!kpKYz9t!{gDUy)@0RbHgD3+0c00Cs2kpKV!a&C-~0Hl!s0RS2c00AkqkpKY!84D=5k$?aJXugpE00CphkpKVzVa$;L00CvvkpKVza@dgo00D2_kpKYz918#eDe92`0RbBeDDIJf00D0FkpKVzY5b7@00CzLk^le!WeAc0010$yb8=&0WoBaBj{pjg0Jx9<;*bDHkpO6s0IHDy500CuYk^lh!(F_0qWpa`L00C}xk^le!Z+wyf0RYns00DA{k^le!WsH&l00DH8k^le!VVIHt00Cv5k^le!a-@;~00C#Jk^le!X0Va~0RhqsX||F800D5kk^le!VZ@RE00DQ(k^le#ZgYZ?0ML>E00BDIk^lh#)C@Y{l7IjKZsw8z00D3Ak^le!Y4nl+00DIRk^le!VE~f=00C_VlK=n#atxCI00D0jlK=n#W*CzI00DCzlK=n#ZX}Zc00ChtlK=q#@(ch0DK?V;0Riz0C_0mX00MGvFp~g4lK=q#)(ijvDN>UF0RhzvC{~kz00CuOlK=n#Y-E!F00ClZlK=n#VQ`ZG00DG%lK=n#ZhVsf00D1;lK=n#X^4{m00DH4lK=n#VU&{q00C^8lK=n#WuTJ)00DBQlK=n#Wvr6`00DEdlK=n#a=4QK00CjXlK=q#1PuTIDaw-o0RaOID9)3B00CvxlK=n#dfbx$00MAn#FGHxlK=q#*bD#xDe{v50Rh(xDE5oT200DC#lmGw$ZYY!h00C((lmGw$VKkHg00DG5lmGw$Za|a(00L}p5R?E$lmGz$+6({zDOQvK0Rh00DBolmGw$Z_Jbc00DH;lmGw$Vc3)a00DB|lmGw$W#p6q00M4wq?7>almGz$+zbE#Df*NE0RY|%00Aikl>h+&-3%xQm4E;NZ4Q+H00D0nl>h(%avYTa0RZ9*00Ai|l>h+&;S4A&m4E;NZ!(nt0R!6%C}wp2lz<|Y06LWb00Ct{l>h(%b5NB400CiEl>h<&{tOlk00Ajtl>h<({R|ZiC}@>{00Crfl>h(&a&BCe0C<%E0RZ3(00Ak8l>h+&-wY^>m4E;NZIYD$00D2Bl>h(%a-fv}0RZF-00Akil>h+&;|wUUm4E;NZ?=^H00L%orj-D`l>h(%WyF;L00DN+l>h(%Z`73l0RZR>00AlBl>h+&=L{(1m4E;Ncj}b@00D3El>h<&>J01*00Alfl>h<(=?v=(C*L800DBcmH+_&`V0U8DZZ8f0Rj08D8iP200D2vmH+?(W^}lg0MM2I00DH?mH+?&c;J=*00Cv@mH+|({0tNg00AlTmH+|)`wSBeDEO9u00D0PmH+?&X$Y4900CzXmjD0(WfYeH0RR9E00Ai=mjD3){|qQ3mw*5PZ7P=l00D0@mjD0(ayXX&0RRFG00AjPmjD3)0Szcfmw*5PZ%&s00RR#W00AjnmjD3+5e;T^C_a|}R+j)^mw*5PcV?FW00CuomjD0(X?&Le0ssmP91Q>gDTtQ<0s#pP8x1Iqmw*5PJ(QOK0sssR9t{8iDWsPG0s#vR9Sta|mw*BQ4hbC00DFgm;e9)VGx)A00D9qm;e9)WgM6Q0RTJ>00C_%m;e9)Z!DMq00D9`m;eC)Jq`c?Z$6j+0RTP@00Cu4m;e9)bxfE500C@Lm;e9)VOW>|00U-pb~u;-LYM$vm;e9)I%Jpt0RcY_I&zqR00DG(m;e9)b%2-v00D4@m;e9)bc~n)00MAzBA5V@m;e9`baP{AWo>d{W^Q73Z%C5>=#v0UlmPIQ0DhGK+LZwKl>ii$0Fagd?3Mr;mjHs70GOBn00BCpm;eF*Uk+go00Al9m;eF+UJhUmDCC%c00Cs`m;e9)Y4n%?00CwCm;e9)Yyg=600CkKnE(I*VGNl700DFonE(I*ZWx&W00D0vnE(I*X(X8d00DF=nE(I*VKA8h00C?^nE(I*WjvVx00DABnE(I*Wk{I-00DDOnE(I*a#WcB00CiInE(I*aA27L0RUqT00Aj%nE(L+Vh$*9nScNRJ$9J@00BLInE(I*a)g-x00D1`nE(I*bdZ?<00Ci^nE(I*a-5j}00Cv9nE(I*aHyF800MJwW|;u4nE(I*I<%Pp0RZ3+00C&knE(I*bI6$h00CjnnE(L-WDYuLzL|j3nE(I*WZIbk0Rtlqayn^jk^tD4faaM100Cv}nE(I*Z2Xx300CkGng9R+VF;Q400DFkng9R+ZWNjT00D0rng9R+X&{;a00DF+ng9R+VJw;e00C?=ng9R+WjLAu00DA7ng9R+Wki|)00DDKng9R+a!{H800CiEng9U+tPB7FDPo!c0RgKFC}x^~00DArng9R+VRV`R00Cusng9U+vJ3zLDTbN=0RgcLD2keZ00C~0ng9R+Z>x00Cj%ng9R+W#pOw00D67ng9U+xC{URDfXHG0RguRDEgX!00C|Qn*aa;Wp(hH00^4^0RXTJ00Ai&n*ad;uM8+0n}7fTZ6cch00Ctxn*aa-bTFF$00DD0n*aa-c|4l{0RXfN00AjTn*ad;vkWLqn}7fTW>T8~00C)Qn*aa-d0?9W00C@fn*ad-whRCPDRP?t0RgoPD0Z8G00DA*n*aa-WrUjm00Cr*n*aa;ZgOm!0Favi0RXxT00AkWn*ad;xeO?zn}7fTXR4b300DKfn*aa-Vz`?C00Cvbn*ad-1rPuMa>|nG00DFgoB#j;VGx`E00D9qoB#j;WgMIU00D3!oB#jZ`004SUQ00BBKoB#m<2oO3roPYoUWImh#00C)6oB#j;WlWp^00CrDoB#j;Z&;iF00v`nb8lpB!kPdMn*c(a0G68o#G3$KoB#j;I%J#x0Rg)VI)0ph00Cu$oB#j;Y>b=$00DK9oB#j;WSE=)00Cv5oB#j;Xr!C~0RTV`00CvNoB#j;b+nuS00C^eoB#j;VZfXK00DN!oB#j;I?S8^0Rce|I?|kg00DH^oB#j;Y2cgy00DL8oB#j;aqOG`00Ct3oB#j;Z1|i200DLWoB#j;Zv>qH00en(V`$Kh09={?s+<4{od5vod5syP0Rc<_C{~?-00DGdod5ss00DE7od5s000Akgod5y>QUO!}D6pM?00C~cod5su{00D3Uo&W#@baG^KOq~FBodBer00^D{00BARslL7o`3)Wb0(eu00Ct#o&W#=Y&4z#0RY+&00AjLo&W&>*%2s2o`3)WXG)#`00CiAo&W&=+z|i)DPEoc0Rh_)C}N&~00Cuao&W#=ZE&6d00Ciko&W&=-Vp!+DT1B=0Ri0+D2ASZ00Cr-o&W#?bZ%)_o&bEF0F<5p00BCho&W&>-w`^fo`3)XVrM#@0Ir?@0RUtJ00C{lo&W#=Z^WJe00Csmo&W#=ZqS|p00Cjvo&W&=Wdi^KZsMK*00DRAo&W#=Z|t4`0RUzL00D6Lo&W#?a%6Sfo&fTm0Q{Z+00BAzp8x>?X9GGApMU@XY!;sY00Chhp8x;>b0nVt00D9;p8x;>WiX!r00DM3p8x>>V-WxWbV8p100C)6p8x;>VN9O@00DARp8x;>bXcDN00CuQp8x;?VP!m@0A!y40RYJg00Aj?$OWQ?Bx00C^0p8x;>X_%h?00DKLp8x;>Vx*q{00CvHp8x;>aIl{M0RYVk00Akyp8x>?%nB&LpMU@XWyYTX00Cvrp8x;?d2+U&0MwrV0RYPi00AlFp8x>?$_gmxpMU@XWA2{-00C+Cp8x;>a{QkF00DFYpa1{?WeA`E00C_dpa1{?Z4{sY00DU#pa1~?&k6tmDJGx*0RhemC@P?U00C?;pa1{?VK|@w00DA7pa1{?WkjF=00C`Epa1{?Wl*3100C%Lpa1{?a9p4O0RYho00Ajzpa1~@&WuDej^G0ResuDDt9!00D0Jq5uE^ZvdkJ00C(RqW}N_bPS^a00ChVqW}N`b8P6M02reH00CtlqW}Q_eGLEsDK4V`0RemsC^Dmf00DG3qW}N_Za|{|00Cu2qW}N_ZcL*900D1OqW}N_a9E=N00C`YqW}N_Z)BqY0RVvw00Aj*qW}Q`fDI^gqksSbZhE5t00D1;qW}N_X^5i$00DH4qW}N_VU(i)00C^8qW}N_WuT(~00DBQqW}N_W2~b900C*TqW}N_a=4=a00DHqqW}N_WyGTZ00C{vqW}N_ZP23t00DW{qW}Q_gAD)yDdM950Re&yDCVPp00D07qW}N_Z}g)800C+GqW}N_bO59P00ChJqyPW`Yz(9T00CtZqyPW`au}ol00CtlqyPW`WhA5k00D9;qyPW}a$|FJD5C&sqX68a05GHg00LxlvZ4SsqyPZ`bqxRkDN>{W0ReOkC|0C^00CuOqyPW`aAc$a00DVwqyPc{c@1|B00Aj>qyPc|cnx+9D14-V00DD?qyPW`Zj7V=00C)|qyPW`VVI-<00DHKqyPZ`hYbJ$DXOFZ0Re^$D6XV{00DEfqyPW`biAYh00C~oqyPW`Wyque00C~!qyPW`Z`7m!00D5?qyPW{Zf&Hb0N|tm00D32qyPW~a$#w7W7eSno}vIqqyTWF0Pv&$00BDoqyPZ{iVZpprGNkeVsjRu01~AD00Cthr2qf{a3rMw00UuidA6PaYM%fqr2qi{Z~*`TDL$nD0s(9RZviMmrGNkdWk{s}00DGTr2qf{VOXUA00CuQr2qi{d;tIfDQcwv0RejfC~l>I00DAzr2qf{VSJ?k00Cu!r2qi{h5-NpDUPK80Re>pD3Yas00DEDr2qf{bfBdG00C~Mr2qf{WvrzD00C~Yr2qf{Z@8rZ00D5mr2qf{ZN#Mj00VMtZ)Bwah@}9^r2ql|bOCY!00Al9r2qo~Z2@xuaRDggrGNkdWa^~=00Ct7r2ql|cmZ|+00AiirT_y0ZUJ`zbpa>{rhowehyefrDH^5#0Re{rC?2MO00DC(rT_o|ZY-t%00D0@rT_o}WoZtk063-q00DG9rT_o|VMwL`00C@HrT_o|WmKjB0RVad00AjrrT_r}c>yS7rhoteWoo7X00C!mrT_o|a(Jcy00CuwrT_r|egOahDT<~50RephD2}Fp00D56rT_o|VVtG_00C{HrT_o|X{e?E0sw*mfB^sjDYT{l0s(;me*q}ErhoteWx%EY00DH$rT_o|VbG=k00C*%rT_o|blj!@00C~|rT_o|Vd$m+00DIFrT_o|bM&SF00D0LrT_r|gaH5nDF&wi0Re*nC<>>500DClrvLx}Wf-Rb00C(prvLx}bR?$$00C(#rvLx}bTFp?00C|`rvL!}iU9xtDMF_J0Rf2tC`PA%00Cu8rvLx}ZB(ZK00CiIrvLx}ZeXVX00DVsrvLx}bZn;p00C)orvLx}bab|0Q{u@TBZPmrU0&{005@|Jf{GnrvLx}I;f`r0Rf8vI?AVj00DH+rvLx}ZrG;)00C*o}00DLOrvLx}Z2YGH0RWBx00Aior~m;0jR7bOsDJmNAsDJ{1kpU^0VHl|Z00CqksQ>^0a3rY!0|1l(ngN&r00Aj5sQ?23lL46lmjNg^sek|hcRr~A00Cu6sQ>{0wgCVEDORZf0RgoEC|aq200CrRsQ>^0X=tec00C@nsQ>^1X<<;Q0CcGU0RWZ(00Ak4sQ>{1l>sP-sek|hbdIS200C~6sQ>^0b)2aH00D2JsQ>{0umJ!8DXysi0RgW8D6*-500DEjsQ>^0Wx%Nb00D5usQ>^0dCaK*00DH;sQ>^0W!R|z00C&;sQ>^0W8|p-00DC9sQ>^1V_~SN0Pv{*00DINsQ>^0WdN!G00CzPssI21atx{f00ChVssI51oB;p0RXN600Aj*ssI52tpO->s(=6iD|)H`00ccMEh{>z08pv`YN`N&ssI21a)_z`00D2BssI21bfBsL00Cj9ssI21a;&NV00CvPssI21aJZ@f0RWx>00Ak)ssI52odGDws(=6iZqBLz00C*%ssI51paB2@DdMUC0Rf)@DCVkw00D07ssI21Y4oZ900C$EssI21WdN%H0RW-_00Aiss{jE3p#dlmtAGFjWEQIc00C|us{jH3qyeS@00Ai~s{jH4qXDG>C@`yl00D9~s{jB2Z$PU600DGHs{jB2VN9z400DARs{jB2Wmu~K00DGfs{jE2%?JPib84#q00Cugs{jB2X>_Xq00DG*s{jB2X@IK$00DG{s{jB2Zj7q{00Cu^s{jB2I+&{f0RhekI-aY500C&Es{jB2W2~zH00DHes{jB2VYsUR01I(rb#`=baAIX?ZBVEH`ltXZsQ`MZ02rzOzN!G+ssIM703@pbWUBzas{jB2I>f600RguGI`XT400DCNs{jB2WdN)I00DFctN;K3Yz(Xb0RX5900Ai&tN;N4rwS+>tbhOkaw4n%00CtxtN;K3XfUh*00Cn*tN;K3bUds800Ct}tN;K3W=O0600DVUtN;K3a#XAU00CuMtN;K3bzrOj0RXBB00Aj%tN;N4sR}4?tbhOkWp=Cp00DA-tN;K3VT7yz00D4{tN;K3Wss}@00DBAtN;N3tO@`DDWa?Z0RgKDD5k7{00C&MtN;K3W3;RQ00DHmtN;K3Wx%We0RXNF00Ak?tN;N4tqLg6tbhOkZPu&+00DB|tN;K3W#p^?00ePxW^`t(0GzA<#;gG9tN;K3I`FIj0RgWHIs&bL00D9ctpET4We}|Z00C$gtpET4V;rpj00DF&tpET5X=M_u04S{h0RRO800DG3tpET4Wjw6_00C!0tpET4a!9QJ00Ci6tpEW41_A&9bXu(d00DJgtpET4Z)B|i00C%ftpET4ba1Tz00C)stpEW42Lb>AY=W%-00Ci!tpET4Zj7w}00D23tpET4X_&1500DHKtpET4aHOpO00VS)Z&a-Se60YgtpET4I$P00M7e;H?1utpET4a0IRZ00C_dt^fc5ZxpTo0RUVC00DF$t^fc5WhAZu00Czzt^fc5axks{00Ch(t^fc5bUdyA00C`6t^fc5Z%D2H00DANt^ff5T?7CDbXu+e00CuQt^fc5XJoDb00DApt^fc5VQ{Vh00DG%t^ff5UIYLEY=W);00Ci!t^fc5bBwM400DB6t^fc5Wtgr200DNMt^fc5VWh4A00M7ve69eht^fc6W^`1p0I;qA00BC>t^fi7Uj)qtI>fGk00C~wt^fc5Z`7^;00C**t^fc5bl|Q400Cjn0RWo?00DF?uK)l6WiYP*00CzumAu7Z#b|30RYnm00AjPumAx8(gr9b)9)&?jHv48*pZW6Ho00D0ru>b%8X&|ux00DF+u>b%8VJxu#00C?=u>b%8WjL__00d=sZ*u&v0IskA0b%8Wkj(600C=Ou>b%8VO+5Q0RY_w00Ajzu>b)9+y*FYv48*pd2+D;00DG*u>b%8X@Ic+00DG{u>b%8Zj7-20RZ0y00AkOu>b)9-UcX~v48*pbfU2U00C~Qu>b%8Ww5aT00C~cu>b%8Z@jSp00D5qu>b%8ZOE|z00D2#u>b)8;RXN!DcZ3B0Ri9!DBiJv00C~~u>b%8Z|t!E00C+8u>b%8boj9V00CkCu>b%8Yy`3Z00CtRvH$=BWn*%Zu>jPu01&bO00DCrvH$=EV{&D5ZD|^=04A>he6Ik=uK;4P03@;i00BBGvH$@A%JDd4gI0s#vI4Fo9WvVZ^rV|3cG0PL~=0RRXD00Aigvj71B2Lvbtvw#2rWeT$Z00DFovj6}AVHmRj00Cqkvj6}Aa3r$;0RRdF00Aj5vj71B2?QuKvw#2rcRI5G00Ct}vj6}AX-KmG00ePib#|n(0QRx~DzgAivj6}AI#ja&0RayLI%czg00Ciavj6}Abab--00Ciovj71AHwFL!DTcEE0Rc7!D2lUy00Cu?vj6}AWSFx600D2Fvj6}AZltpS00CsGvj6}AWw5gV00DHivj6}AVZ5^d00C^mvj6}AWyrGt00DB&vj6}AdDOE200DB^vj6}AW#F>_00DL8vj71AIR*d$De|)b0RcD$DE6~}00CwEvj6}AbOf{j00ChNv;Y7BZ4k5o00C(hv;Y7BbR4t*00DC%v;YABI|cv&DK4}C0RcJ&C^EEw00Ct)DPFVy0RcP)C}OmL00DGpv;Y7BcyP1;00Cuov;Y7EabY2Y00C~Uv;Y7BWVEyZ00CvXv;Y7BbilL#00Cjfv;Y7BY|OL(00Cvvv;YABg9!iuYu>Z~00DF2v;Y7BVd%5~00C|8v;Y7Bbo8_U00CwCv;Y7BX8^ST00D9awEzGCVGOkZ0RV&v00DFuwEzGCZXC4$00DI(wEzGCZz#0@00CnzwEzGCbTqX900Ct>wEzGCXF#<800DAFwEzGCVNA6E0RV*w00DGZwEzGCZd|nh00DJkwEzGCZ)mju00CoewEzGCa&)x-00D1$wEzGCbAYt~00DA_wEzGCb&RzD00MMlQndh*wEzGCc$l>S00Cj5wEzJChY0`yDXz5u0Re^yD6+MH00CvVwEzGCWWcom00D2twEzGCZp^g+00DW@wEzGCa@e&100Cv*wEzGCb>y`G0RV{!00AlRwEzJDhzTh4wSWKta{9FZ00D0Twg3PDa|pHo00D9iwg3PDbriM$0sxZ7It00DGzwg3PDb9lA@0RWE)00Ak4wg3SEjtMA;wtxTuWsbH000DHCwg3PDVVt%A00Cs8wg3PDaHzHb0RWK+00Akqwg3SEkO?TbwtxTubiTF#00DT$wg3PDWz4n!00?w#abs|0b#4;10I0P9>a_qGwg5u50DiUruC@Tuwg3PDI@q=V0RfZ=I{LPN00CtHw*UYEWC*ta00D0fw*UbE2nqlJDH^u`0RaaJC?2y|0RcM?C~~@h00DG(x&QzHbAY-400DA_x&QzHX^gr600wblWpH6;zPSMCxd1A<08F|7Xu1HBx&QzHI+(fu0S7-1W^`n7ZecnutpHxK0D!Xq*t7r?w*Zv60J6G(00DWpx&QzHa@e{600Cv*x&QzHb>zAL0RZ~}00AlRx&Q$I`T;2Px_|%ybNadf00C|Sy8r+IX$ZRj00CzXy8r+Ibrib*00C?oy8r=DyMO=zJ?^^z00BMry8r+Ia{Rjh00D0TyZ`_JbO^iv00ChRyZ`_JaumD(00CthyZ`_Ja3H(@00L=m-n#%MyZ`_JIxM^Z0Rf{0IySt300Cq?yZ`|J+y?*wDN4Km0Rr0xX(&Xz08YGs00C!IyZ`_JVPL!f0RYkm00Aj%yZ`|K(FZ7Synp}!a(27`00CisyZ`_JWrVx{00C@@yZ{3L)CblF*arXsDVDqd0|Cynp}!W$L^D00C_ByZ`_JY52SV00C(JyZ`_JcLcov00DFgy#N3KVGz9l00Ctdy#N3LZE)JW035vl00Ctpy#N6K-Uk2yDKfnP0Ri0yC^o%-00DA5y#N3KWkkII00Cr5y#N6K;0FK!DOSAz0Ri6!C|bRM00CxTy#N3KX=uFw00DV!y#N3KY;?T<00MGuP`v00Ct_zW@LMV@SUM00DANzW@LMbyU9q00D1WzW@LMb6~#!00CuYzW@LMa%{f<00DGzzW@LMX?VW?00C}(zW@LMX@tK30RT4w00AkGzW@ONHUcP=zkmP%WtzVL00DHOzW@LMVW__V00CsKzW@LNZg7gf0JOgV0stEV7XknQDa5}30s$HV76K^BzkmP%WzfF>00Cp#zW@LMa^SxJ00DL8zW@OMGXeksDe}Jn0Rb`sDE7aA00DITzW@LNZ)NPi00h7Q0stcdAp!saDHOl}0s$fdAOa{Fz<>Y&ZXmz_00D0*zyJsUWder+X#$G^V*-T&X99@=00AjBzyJsVWCDf)Xab4?VgiH$W&(%;C`iD700Cr9zyJUOX=O0L0A#=b00DGrzyJUNVRXO%0RT$^00Ak0zyJXON&+Z^z<>Y&Ws1N600C^0zyJUNX_&wO00C&8zyJUNccj1o00DHWzyJUNVX(je00CvTzyJUPb8K)5zyNx{0KC8e0RTAy00Ak`zyJXNNdf=?DcZmQ0Rcz?DBi$;00Cy?zyJXPI07hX)WCr3zyJUNZt}nY00L!o!oUFjzyJUNbmoQt00MSy6o&u~!2kgOCjtNgDIUQ90RTS&00Ai|!2kgPJ_0B#!GHh(ax%dH00Ct>!2kdOWI(|H00C@9!2kdOX-vTY00DJU!2kjPMFLL(00Ajp!2kjQL;_9%C}hEa00Crb!2kdOWpu#+0RtuiC}L+K!GKu70D8dy00C!!!2kgOF#-SqDVD(i0Rb=qD4M~500DBK!2kdOWvIab00DNc!2kdOa00Cvj!2kdOaLmB~00Lookih`b!2kgODFOfiDdNEZ0RboiDCWU{00C$0!2kdOVf4WO0RSxm00Aig!T200C{p!TSXDfGht0s(Xaasnv&!+-z*WB|kf00CqQ!~g;Sc>;F=00Ai$!~g;Tcmj3;C>+Fq00Ctp!~g&Rb}YmI00D0@!~g&RZ8*dL00Ct_!~g&TY+-Wl!vGM(07S$900UxlZlc2g%EJIk!~g;SK>|?%00Ajx!~g;TKmt$#C~U-l00Cuk!~g&Ra(u)900D1;!~g&RW{AW900Cu=!~g;SLjqF*00AkQ!~g;TLIP3(D4@iE00DBQ!~g&RWw68m00DHi!~g*RM*;u=DZ<160Rct=D8|Hq00D2z!~g&RbkxKE00Cs$!~g&SW@Nm?0N}&`1OQnAe*#wmeF6XhDe%Mq0svhCTLJ(9DFDR)0s&kCS^_8r#ee_-bPUA+1OQSbX>&%00C)Y#Q*>eV{l|?b#i5Nb8li{caFXQ#=Zdjz5p!00J^^b1i=6l!2sC704l=(Si}I7!~o{R0BFSk00BB~#Q*^TkODfS#ee_-bE?Gv00D2Z#Q*>SVz|Ws0RRvL00C&k#Q*>SbI8R200Cjn#Q*^Su?qkJa@xfJ00Cv*#Q*^SvI_tKWa`BL00C+4#Q*>SZ1lwd00Ck8#Q*^Sx(fgSDF(&>0Rg!SC{00Cjf#sB~Ta?Hj600Cvv#sB~TaM;EG00e1mWN$LY09wWXmc{_y#sB~TI^@Ox0Rp`XXgbuz0QSa!00CtD#sB~TX$Z#v00C|e#{d8UZ4}1<00DIx#{dBU0SN#BDJI7N0RaFBC@RN*00D9^#{d8UWjMzG00Cw`#{d8UW<$p8QXZEPUP07S_E00Cu6$p8TW6A1tTDO$+@0Ra*TC|=2c00CuW$p8QWbZp5000Cig$p8QWYVD4NND00C&A$p8QWbEwGx00DKb$p8QeV`*h%b769IaKOg^B**}M$N;p+0N%&|{Kx=Q$pDba0JO;f00BC>$p8TX7zsMy$$$U>a^}eZ00Cw0$p8QWX7tGb00CzD$p8QWbpXl$0sssU3J?GRDGbU00s#vU2@og}%76d?a~R4100Cqo$^ZZXZYatC00Chx$^ZZXZ8XXN00C_}$^ZcX7!UvfDMrcw0Ra~fC`!tJ00CuC$^ZZXbXdv&00CiM$^ZZXWn{_#00M7vK*|7W$^ZfY5D*R!00Aj_$^ZfZ4-gFyD1gd<00Cu&$^ZZXW01-K00DBA$^ZZXb)3oo00D2J$^ZZXbEwJy00CvL$^ZZXaF20st@&LJ$A}Da^|N0s=1(K@egn#>)WG%YXm@dDzPU00DI7%K!iYY3$1Y00DIJ%K!iaZE|in%K(te0Qk!Q0RS2h00Ais%m4ua84xHC%zyv^c^1q700D0v%m4rZawN;1^_k?AP`0nG!PyTL=XT0DQwID1_3n?9}q%zyv^WPr>700Cr@%m4xaBoHDH00AkU%m4xbBM>1FD5T7Q00CvH%m4rZcC^d@00D2h%m4xaC=ezP00Ak+%m4xaIuJMz00Ak|%m4xbIS@AxDA>$^00C{@%m4rZZ|KYb00DCD%m4xaJ`g+*00Alb%m4xbJrFw(C;-iX00D0X%>V!bW_0w-01(Xp0sV!aWgyJ}00DF^%>V!aVKmJE00M1nz{~(T%>V!aWkAgU0st%!Di8nxDNxM-0s$)!DG(@D&42&_Wn9ew00DGn%>V!aVQkF+00C@r%>V!aWq8d100DA-%>V!aZiLMM0RS=(00AkG%>V%bF%T$}&42&_WSY$Y00Cv9%>V!aZK%xv00CjH%>V%aKo9@{DZ0%70RcY{D89{r00DBu%>V!aWz5Y000Csu%>V!aY}m~J00C*<%>V!ab>z(e00Cm^%>V!abnwjp00D0H%>V!aY5dIq00D9W&Hw-ba0t!-00CtV&Hw-bbrjA300C?o&Hw-kV`*h%b769IZenoC0NBa^{>uP7%m8N00GP}GO3eU@%>cB`03gl)00BBC&Hw=cM-Vzt&VT>{Vsi${09MWb00CrP&Hw-bZfMQ`00Cic&Hw-bZFJ560RVXq00DA<&Hw-bWrWTE00C}_&Hw-bZjjCZ0RVds00AkS&Hw=cdJia|&VT>`J*Lh800BL&&Hw-ba00D2h&Hw-bbimF400Cjf&Hw-ba?H*E00Cvv&Hw-baM;cO00L=mmd*g)&Hw-bI^@m(0RemuI_}PZ00Ct5&Hw-bY5dLr00C|S&j0`cZwSu-00C(Z&j0`cbQI4300C(l&j0`cWFXG~00V4oZXm}1dd>hQ&j0`db#K1K04&b{0RW`}00C@7&j0`ca7fPp00C`I&j0}c83OG-x!p{H-&;S4dIuOtR0Rn>zXgX@o03OhQ00Cqq&;S7d8x8;gDK^jm0Rb8gC_2!900C$~&;S4da7fSq00Ci6&;S4da#YX&00C!O&;S4dWnj<%00D4j&;S4dd2G-C00DGz&;S4dWq8m400C%z&;S4dV}#HE00DA}&;S7d9S#5iDVERx0RbEiD4NiK00DHM&;S4dWvI{q00DEZ&;S4dWwg)$0RSHk00Ak$&;S7e9u6qP(0~8|bIQ;F00C~&&;S4dY1q&J00Cj%&;S4dbmY(g0RSlu00AlR&;S7eC=Mv}(0~8|bo$T$00CnH(EtDeWeCv#00C?c(EtDfZfxq%02I*x00D0r(EtGeAr1fmDJszb0RSTo00Aj9(EtGfA`U1x(SQH}bUx7l00DJI(EtGgAPy*RF42HY(EtDeXj0Jt00DGf(EtDeX=Kp=0RSZq00Aj*(EtGfBn~Ka(SQH}bb8SM00DD?(EtDea){9Y00C)^(EtGeCk_AsDVos$0RbisD4x-P00DHQ(EtDec&yO?00CvP(EtDjVRB=4W^Rzs0J_isB+&qB(Eyau0JzZr00BC_(EtGfDh@i>(SQH}Xx`BP00D63(EtDeVeHWW00DCH(EtDfX=gCd0Qk`W00CwG(EtDea0t=>00DUp(f|MfbQID600Cth(f|MfXdu!60RWx_00Ctz(f|MfbuiKZ00C?^(f|MfVLZ|R00DMF(f|MfI!Mw00Rf){I!@An00DDU(f|MfbX?K^00C}d(f|MfWoXg>00C`o(f|Mfb#&4I00LuYCei?U(f|Mfa)8nR0RVvm00Cu?(f|Mfb(GQo00C^8(f|MfVW83g00DNU(f|MfI;_$F0Re&oI(f|MfVcgOH0RV*s00AlJ(f|Pggas(<(trQ~bn?;w00CwC(f|Mfa{$u-00CtN(*OYghXnuuDH78F0Re^uC>GOz00Ctj(*OVgbR^RN00Cht(*OVgWiZnK0RWK&00AjH(*OYhkOe3}(|`a0b4Jqu00C}J(*OVgX;jky00CiI(*OVgbYRl}00C}h(*OVha&I=%0Bq9$0RV{w00Aj{(*OYhhy^Hs(|`a0d4|&f00D1~(*OVga+K2m00DHG(*OVgbD+}z00CvD(*ObhjRlJZ00Ako(*Obij0K7XD7e#r00Cvb(*OVgaLCgD00DW<(*OVgbkx%T00Cv%(*OVgXyDTT00Cp>(*OVga_rLp0RWE$00AlZ(*OYhjs+4ATH|(*Uf~0P@oSI@ADO)BpehI%L!U0RfZ+I)2oE00C@-)BpehZ;aFc00D23)Bphhum=DEYo62q00DEN)BpehVW`vq0RXWF00DTk)BpehWw_J;00Csa)Bphhzy|;UDazCU0Rg`UD9+S?00C^&)BpehY~0iU00DL4)BpehZs^ni00M4v#MA)p)BphhvIhVGZvNB&00D0T)c^niX$aK-00DFk)c^niVHDK>00D9u)c^niWgyi600C|$)c^niWh~VI0|2xKxCgce00AjD)c^wlvj?{awFf9b)qns2c}CR$00DGT)c^niX;{?&00DGf)c^niZe-N}0RXxO00Aj*)c^qiyaxaQDSFia0Rg)QD1Oy|0Rp)PC_Qx5fP~cm0RX-S00AkO)c^qjy$2|q)qns2J)+eB00KQBjMV_D)c^nia(g2v$0Q%K{00DUb)&KwjbP(1600C(h)&KwjbR5)&KwjWI)yc00Ch})&KwjWlYup00DAR)&KwjbXe8^00C}Z)&KwjWn|U>0RVCY00Aj*)&KzkaRexI)_?#3WO~*B00MSyYSsXP)&KzjZUg`UDU#Lz0Re3UD3;cM00Cs2)&KwjVWido00CvH)&Kzja0CDWDYn)C0Re9WD7w~w00C~m)&KwjX~@<900C#t)&KwjWz^OH0RXiM00DB~)&KwjZ{*eh00DIB)&KwjVer-f00DCL)&KwjW&G9v00DFY*8l(nWpZL^h}HnG)&Sbp00`Fr00BA<*8l+la|Ajd*MI;4awgXR00Ct#*8l(kWHi?R00Ch-*8l(kWkA;e0RXrP00AjX*8l+lw+bjw*MI;4Xjaz%00DDe*8l(kb!6870RXxR00Aj**8l+lxe6$B*MI;4YkJoJ00DD?*8l(kVTjiN00C`|*8l(kbd=Ws00C~A*8l(kWuVsp00DNU*8l+kyb1sTDYDl90Rp=UWhkuI0JhhF00DHo*8l(kWyse60RX-V00Ak~*8l+ly$UGU*MI;4a^BYf00Cj<*8l(kW$f1g00C_B*8l+kzzP5XDgM_00Rg`XC<54k00DCd*Z=?lbP(7800C|m*Z=?lWgOT500DL)*Z=?lWhmGH00DF^*Z=?lZZy~c0RX}Z00AjL*Z=_m!3rou*nj{5WlGop00DYZ*Z=?mWobIt09e=n0RY4b00Ajz*Z=_m!wM*D*nj{5a&p)J00Cus*Z=?lWPsQJ00Ci!*Z=?lWsKMW00DB6*Z=?lWSH0h00Cs4*Z=_l#tHxdDXQ220RhDdD6ZIm00DBe*Z=?lWxUt`00Cse*Z=?lVaV7300Cvr*Z=?la@5!W00Cv%*Z=?lcHr0m00D32*Z=?lZS2?p00Cw4*Z=?qaA#w4VRCBM0M6F{_}2hl*Z`#10QlGd00BDw*Z=_m#|k+5i9nXh7Nk00VAza3a+yDRpZZzBg00C(_+yDRpVL;pf00DGH+yDRqY;GLf08HEf00D1O+yDRvWMOb~a%E$j+5q0#02qT2w(+W_?209@Pv00BB;+yDUpNC*G{DTdqt0Rcw{D2m*G00DWB+yDRpa+urz00DHK+yDRpbEMn=00C*L+yDRpXRzD=00CvT+yDRpa=hFC00Cvf+yDRpY{=XI00Cmo+yDRpVbt6J00DH`+yDRpW#HTZ00DF6+yDRpZtUCu00Cw4+yDUpN(cY}DgN950Rc$}C<5Jp00DFe-2eaqWf0u}00DCr-2eaqWgOiA0RT)000Ai|-2edrO9&_|-GBfAb28lk00C|~-2eaqX+Yfo00Ch}-2eaqbWGg<00C}N-2edqP6z-2DPG+G0Rc@2C}Q1!00Cua-2eaqba34O00Cik-2eaqWqjQL00M7vSls}E-2edqPzV44DU#g)0Rc}4D3;xT00DHI-2eatWO8F+_}l;@-2jN)0Hoaj00BCx-2edrQ3yJ`-GBfAdBWWQ00DB!-2eaqbkN-Z00DE>-2eaqY24ia00C#>-2eaqW$4`i0RjsKI&y&AfbQJ@00Cw6-2eaqYyjQ>00CkK-T(jrVGP~?00DFo-T(jrWf^G00C@z-T(jrVSwHM00Co$-T(mr$PWMkDU#j*0RhJkD3;!U00Cv3-T(jrb)?<^00C^O-T(jrVX)o+00VV%c5vPRjNSmY-T(jrI=tQh0RhPmI?CRF00Cvt-T(jrZP?xb00C*<-T(jrbmZOu00Cj@-T(jrbnxB)00M4oB;Ek_-T(mr%LxDhDF)vF0RhShC<@400D0v-v9vs%?SVjDJtIp0RhYjC@$ZC00Cq)-v9ssVLaae00D18-v9ssY)Ib#00C}J-v9vs&j|nlDO%qE0RhelC|=)y00C}f-v9ssZ*1QH00C)o-v9ssba>wY00Cou-v9ssZiL?e00DK1-v9suY;|TN-vCtK0Fd7R00BCd-v9vt&UN_0EplK00BCV-~a&vZxCoY1mFOe;D7)DWS-yv00C*L-~a#tWw77?00D5e-~a#tdA#5N00DHu-~a#tVaVVB00DH)-~a#vWqD!z-T?030My_B0RT$|00AlJ-~a&uN(LzG;D7)DWb)tu00CtB-~a&tO$Gn~DF)#H0Rc<~C<@_#00CtX;Q#;ub{OFR00D0v;Q#;uZ6x6U00Ctx;Q#;vVR8WB05IVI00DV6;Q#;uWuPX+)1DPG|K0Rc`1C}QD&00CrZ;Q#;uWN_gC0RT}300Aj{;Q#>vPzES~;eY@EWrpDZ00DN6;Q#;uZQ0RU4500Ak~;Q#>vQU)m4;eY@EYu@1i00D32;Q#;uZ|va!00C(7;Q#;uZusE<00VAlby(p5&fx(5;Q#;uIt1bX0RdD7Iuhc50RSHe00D9!;s5{vWhCMN00C|);s5{vZZP5i0RSNg00AjH;s5~wAP6Wx;(!1FJx1aH00BKt;s5{va#Z2~00D1W;s5{vbYS8D00CiU;s5{va%|!N00Cuk;s5{vaCqVX00L=mHsSz&;s5{vI)vf?0RbWiI*#Ii00Cr_;s5{wb7>gj0G#3g00DBM;s5{vWvt==00DNg;s5{va=79E00Cvb;s5{vbHw5R00Cmk;s5~vdh00D0@8>H0sxs3ml6O0DR|`o0s)v3mJ%p_<$wSIWrXDb00DN600D2N<^TWzX{_b|00DHe<^TWzVYuc100C^i<^TWzWyIzH00Lujh~@yw<^TWzbkODi00DE_<^TW!ZEis30N~~T0RUAJ00AlR<^TZzR}ugLDf;FB0RdJLDE{Vv00DFa=Kui$R1zp*^yYvJ=Kuf!WfJEA00DF!=Kuf!VI=1O00Ctx=Kuf#Z*u1505InO0RSHo00AjL=Kui#9ug=-=YRkKWJ>1%00C@L=Kuf!a#-g800D1a=Kui!FA@L&DQf2c0Rb)&C~oI~00DAz=Kuf!WqjuV00DG@=Kuf!bBN~v00C)^=Kul#brN$D00AkQ=Kul$bP{qBD4^$n00CvD=Kuf!bg<_D00CjP=Kuf#XKa+`0KDe_00Cvf=Kuf!a?Ixd00C~&=Kul#F%mNp00Al9=Kul$FcLBnDCFmW00DFA=Kuf!W%TC&00D6N=Kul#H4--x00Aim=l}u%G!ixvC=BR;00DCn=l}o#WgO@L00C?w=l}o#VkqbU00Mbo0O$ZN=l}u$ITAY(00AjJ=l}u%I1)M%C`9Oh00C%9=l}o#a8&3300CiI=l}o#a$x8H0RUeT00Aj%=l}r%UJ_?0X6OKL=zstLWp?NQ00D4<=l}o#d5Gu$00DH4=l}o#Wt8Xu00C&4=l}o#W1#2&0sxf~lM(;{DXi!K0s)i~k`gGg=zstLWVq-600MGkrsx2|=l}u$JrX|>00Ak|=l}u%JQ6+P-($r9BP;S%i<00Aiy=>P-)$P&~N;1cW-C>-g400BKB=>P-(%M#ZT;}Y)@00AjB=>P-)$`aNR;u7u>C_w3e1OUwv*%IXv@e%+5DOBkI1Odzv*b?Lt@DeCq>3{$MK4j?t1OU$x+Y;vz^AZ37DR}7s1Od(x+7jjx@)9V5>3{$MD~Ra;00ccMEh{kT07mHma_In;=>Px$a-8V^00D2V=>Px$bhPOJ00CjT=>Px$a=_^T00Cvj=>Px%VsH%U0L3{$MW$5Vu00Cq2=>Px$a`@>000DLW=>Px$Zv^T900DCf>Hq)%Wf1BB00D9q>Hq)%bR6mc00D9$>Hq)%Whm+Z00DC@>Hq-%VG;lVDLU!^0RdnVC_d_d00Cu0>Hq)%c1-F300C)I>Hq)%Y*^|500CiM>Hr7;#}d;L-xBK*-4ewT=@QWr00Aj#>Hr7<#uCyJ-V*8(+!DkR=n~KpD17RG00DA>>Hq)%ZHq)%VWjE+00DBU>Hq)%Ww7c100VAwbTsM!WaHq=&M-oL600Ak=>Hq=(MiN94DA4MF00Cvz>Hq)%W8mrl00DC5>Hq)%b?oW@00D3E>Hq)%bNK2200CwG>Hq)%as=xD00CtR>i_@&a}etQ00ChZ>i_`&gAxD%DI)6t0Re&%C?@NG00DF?>i_@&ZZzuv00DJ6>i_@&Z$Rq+00Co0>i_@&c}(j700DGT>i_@&X;|w31OSl|wGzV;rxE}GDP-#a1Obo|v=YJ+rV=P_>wo|PbYx!Z0CejB00MGu9P0pr>i_}(OA<*E00AkM>i_})N)kvCD4gqn00Cv9>i_@&W31}{00DBc>i_@&b-3#Q00D2l>i_@&bHwWa00Cvn>i`Gi`G>h!UO>tP;8sh7z0-suH*oawyR20O;$000DFE>i_@&VF>I10RUSP00Ai!>;M4)S`sK2?0^6Pc^>Ql00D0%>;M1(axCls00DF|>;M1(b2#h(00Ct_>;M4(T@nBRDN5`B0RdbRC{FBv00C}P>;M1(Z(QsE00C)Y>;M1(bZG1V00Cic>;M1(a&+tf00Cus>;MP=jS{00u@b)$ixQy{uM)iy00Ak6>;MP>j1r;}uoAu!iV~m_t`fWwD46Vk00M4wfb0OC>;M1(Wwh)71OSf`vl77)r4j%EDa7mm1Obi`vJ$`&q!K93?0^6PZq)1m00C*@>;M1(XXxwz00Cw0>;M1_a$|RObYX94WoTq)VzT7`Hs=6j=K$E}05s?T$mjsl=>WXy0F3JZ4(tF#>;S&(0QBqt00BDs>;M4)^b$HS?SKFQWH#*p00C@1?EnA)azyO_00D1G?EnA`b97>HaARpQs)00C^~?EnA)VeIVy00DOL?EnA)Z20W}00DFU?EnD)8UO$RZVK)I0RS5S00DFq?f?J*br|jd0RS8T00D9&?f?J*awzTq00U`nWe)BD9_|1x?f?P+9snQ!00AjN?f?P-9RMEyC`j&r00C`I?f?J*VOZ_}00CuQ?f?J+WO6j_0A%g}0RSuj00AjiK0RbfdD5~y&00DHc?f?J*W4P`B00CjX?f?J*c*O1i0svqDVgLXEDbVf!0s&tDVE`!B?tlORY~1bu00C*{?f?J*bnNZ`00D0D?f?M;Apj_4b)fEm%I*O8?f?J*Wd7~|0suAuH~;_vDHQJj0s%DuHvlLa?|=XSb0F^k00Ctx?*IS+axm`z00C(>?*IS+bv*9?00Log4(|X$?*IS+Wk~M;0RSWb00Ajj?*IV+C;$KfDPr#c0RblfC}!_~00DGt?*IS+V|4ET00Cio?*IS+c!2K!0RkfcC}mvlfQIh?00Cu;?*IS+beQh|00C*9?*IS+a-{D70RSoh00Akm?*IV-DF7(6?|=XSY`X6N00C^m?*IS+WytRU0RS!l00Ak~?*IV-EdVIk?|=XSX5Q}r00D32?*IV+FaQ7nDe~_C0Rb-nDE9Aw00C?K?*IS+Wd!g50RS`r00Aiw@Bje;GXN+Q@PGgTbQQvg)}R{&W6D3tJk00Cv1@Bjb-bF}aP00DBk@Bjb=Wp#343h)3T@Bn!50Ko770RS=p00Al3@Bje;F#sss@PGgTbmH&;00Cv{@Bje-WB>pGDfaLH0RdwGDEjb#00CtH@c;k;atQGN00D0f@c;k;ZWQqV00Czj@c;k_b8>fdWpHO{lI{Rf?*OXr0M73K?C$`^@Br}e03h)I00BBC@c;nt0RedlD9Z7G00C>z@c;k;W!Uim00MMn!0`ay@c;n;bO`_fDemzA0ReLfDDv@u00Ct9@c;k;VF2;~00CtN@&EwHX700Ctj@&EtP00D1u@&EwfdWpL#201WZ~Hu3;k@&I`90G#pw00BCp@&Ew=e+fFg@_+yVZNl;Z00Cjj@&Etd<23700AkA^8f+?djx?5D3J4j0swvlgaiNqDWLNJ0s(ylg9Iq1^MC*WKCJTq00Js4mh%9%^8f$=a=h~Z00D2t^8f$=bjsI{x#300CqK^Z)<>at!nU00ChV^Z)<>br|#j00Czn^Z)<>WhC?f00DF=^Z)<>X)yEv00D9~^Z)?>90mXZDMIuB0RbBZC`R;v00DGN^Z)<>a#ZvH00CuM^Z)<>b71rU00C}h^Z)?>9tHpbDRT4x0RbHbD0cLK00DG-^Z)<>W`y(r00Cu+^Z)?>AO-*dDVFpA0RbNdD4O(u00DHM^Z)<>XsGl600C#N^Z)<>X|(hJ00L}skn{k$^Z)<>Wx(_R00DE#^Z)<>VbJsd0RS)t00Al7^Z)??F9s;!^nd^XdFJ#000DIF^Z)<>aP;&50RS`x00Aig^#B0@GX^LG^?(2YWD4~F00VMuZr1bw`t$%2^#B0?A_f2fDJJy*0RSWh00Aj5^#B0@BL*lm^?(2YbUO6_00Cw~^#A|?Wk~e^0RScj00Ajf^#B0@B?c&1^?(2YbYArU00C%b^#A|?XKeKV00C)o^#B0_AqFUHaw_$JPW1qI^#A|?bAI&z00C}}^#A|?X_WN<00Ci|^#A|?bfEPB00C~M^#B0?ECv7pDYEqd0RbxpD7N*000DBm^#A|?VZ`+S00Cvn^#A|@Z)~jf0MPXS0RSil00AlB^#B0@Ck80w^?(2Ybn5j000Cz5^#A|?W%%^~0RSon00Aik_5c9^DF!GA_J9BZbPo0a00C$g_5c6@XB_qb00C(t_5c6^Y;ykf04VkV00DF^_5c9@E(QPrDL(c90Rb%rC_?st00Cu4_5c6@dQkQN00C)M_5c9@G6nzvDPr~j0Rb@vC}#G600C}n_5c6@X>|4g00C!u_5c6@Wq|eo00wDgV_|b*Z1eya^#IoO066vlT=oEl_5c6@I*j%J0Rc4zI;Qr300D5U_5c6@VYK!D00C{f_5c6@X~6aX00Cmg_5c6@WX$#e00Cvv_5c6@a@h6&00Cv*_5c6@WaRb$00DC9_5c6@Z}9d200D0H_5c9@6bJwTZUXlJ00D0X_W%F^X$0RdMIC@%Ma00Cq)_W%F^ay<6{00Ch__W%F^cS!dD00DAN_W%F_b#Em1095w?0su7$GYJ3zDP;Em0s%A$G6^VZ_kaKaWN`NY00DA(_W%F^VSx7l00DJ|_W%F^XN>m%00Cr@_W%F^VVL&-00Cv5_W%I^Hwgd%DXRAX0Rc7%D6aQ_00DHg_W%F^WxV$Q0RTA(00Ak;_W%I_I0-1s_kaNaI|%>*Dcbh{0RcJ*DBkyg00BPa_W%F_DlO9Y0PObw00DCH_W%F^Z~XTF00DFY_y7O_VF>sD00D9i_y7O_Wfb@T00D3s_y7O{a%XR(_W;8803i4P00BBC_y7R`JPA59_<#TbWIFf&00DAB_y7O_VMzD@00DJQ_y7O_XH@tA00CrL_y7R_;R^r(WoGyQ00D4n_y7O_d2sju00DG%_y7O_I(+y50RiF*I)eCs00Cu)_y7O_W03d&00C~6_y7O_Wt{i`00DBM_y7O_WvKW700CyM_y7O_WwiJJ00DBk_y7O_Wx)6V00DN!_y7O_Z_M}r00LocVE6#i_y7O_W!U%t1pwj+<_Y8p-U;9d00AlJ_y7d~;R)pl;|bjf-w7!6_<#TbZTk2C00ChN`2YX`Wf1uQ00D9q`2YX`bR78r00DC%`2YX`awz!#00Ct#`2YX`W;FQ#00Cw?`2YX`bwK$50RZR;00AjX`2Ya{=LslK`G5cca#r~O00CuQ`2YX`W@PyQ00Cxd`2YX`b#VCr00Cll`2YX`bbR>$00Cu!`2Ya`>Inb=DUSI70Ria=D3bYr00C#1`2YX`ZlL)900C*H`2YX`a;*6P0RZv|00Aku`2Ya{@d+rr`G5ccYr^>e00Cvn`2YX{bY-&n0MPjW0RZd?00AlB`2Ya{>j^02`G5ccWa{|<00Ck0`2YX`W%&630RZj^00Aik`Tzj|?FlFd`hWldWe)lP00DFs`Tzg{X&m|h00D9$`Tzj{@Cg6`DK7c|0Ris`C^Gth00C?``Tzg{Y(V+|00Cu2`Tzj{^a%g~DN_0X0Ri&~C|3G_00CxP`Tzg{Z)Exa0RZ+100Aj*`Tzj|^$93+`hWldYkK+s00Cu!`Tzg{Wr+F!00?4db8>fdWpGCM0Eqbj*7*Sb`2Z;T08IJ-YWe_<`Tzg{I+XeV0Ri_3I=1?N00C{h`Tzg{VZ{0X00Cvn`Tzg{a?tt!00DH?`Tzg{bKLp>00DC1`Tzg{W$5|<00Cz1`Tzg{X7u_100DLS`Tzs~9Sk1~BMc!700Aim`v3$191I=|A`Bo5C=mOA0storB@6%oDJ1&<0s$rrBn&7j`+xxeGYkL$DLVTA0Rb`$C_eju00C@7`v3p|Z%q3D00D1O`v3p|Vp#hC0RS}&00Ajv`v3s}Gz=(c`+xxeHw*v)DR%n+0Rc7)D0=&V00BOL`v3q0Js>JAF#7;r`v7kH0Eqhl00DB2`v3p|Z=m}C00DHS`v3p|VXXTA00DBc`v3p}bY&L%0J!@A00D5m`v3s|DGUGsDbD)<0RbosDAN0Y00Cv#`v3p|W8nJ$00Cj<`v3p|Z0!300RSru00AlZ`v3s}Dhw$6`+xuebOQVU00CtR`~U#}ISc>+DHi+y0RcD+C>s2L00DC#`~Uy}Whndr00D9?`~Uy}X*B!*00DJ6`~Uz0aC33;`v4I906_cz00Cu2`~U#}EerqwDO&sh0Rb!wC|>-400DDk`~Uy}ZfyJj00C)o`~Uy}VR-xi00DG<`~Uy}ZiM^*00D1``~U&~FAOmZ00AkM`~U(0E(|aXD4hI&00Cv9`~Uy}b*%gV00C^W`~Uy}VYvJN00eJxV|K{<095<{ko*9?`~Uy}I>h_{0RcJ;I@bJv00DH|`~Uy}aOC^|0{~78Obkj400AlR`~U+1O$awO00ebpV{I`10A~LHivIwv{{R31Xte(T00DEx{{R61Y777YDboJ{0Rd?YDAxag00D5^{{R32b#Ki70ObDw0RUtS00AlV{{R62V+<(x|9}7ibpHPU00C?U00962bqoLj00ChV00962W*7hg00Ctl00992W()uUDJlQ~0Rd$UC@uhj00DV400962a6AA300D1800992Xbb=WDNX`D00Cj100962a-;wO0RV6e00Akm00993Zwx530D%AjWx4jBQ00D9!0RaF3VJHCs00Ct#0RaI3dJF&oDLMfG0RedoC_Vv!00DVK0RaF3bW8yO00C)I0RaF3V^{$J00CiM0RaF3aAW}i00L}bGywr>0RaF9VP$e@aC2iy{Q%_s03!YX0RI5${{RR90dN5U00BCB0RaI4eGEF70f7Jka-IPJ00D2N0RaF3bgTgZ00CpN0RaO5_Y(OM`w{>FDZT*#0|E9D_!9aOD8>PS00Cvp0RaF3b=Uy`00C^?0RaF3VdMb;00DOD0RaF3dGG-N00D0H0RaI3{Sp8HDFOlk0Rj9HCR$S00CpJ0|5X5bhHBj00C^e0|5X5b-)7w00Cjf0|5X5X3PTt00Cvv0|5a54HEzXDc%DC0RapXDB=Tw00DI90|5X5WAFn300DLO0|5X5a{L1U00DFY1OWg6a|i?h00C|e1OWg6ZxjRp00Cnf1OWg6Wgr9r00DL;1OWg6Z!81>00?1kbZ2&BWNrKb0X_l&Vgdn#0s*c90cZmO*aHDF1OWg6IyeLY0RavZI$8vQ00CuS1OWg6b!Y?u00C@n1OWg7Wns7h0dxcb00DM-1OWg6d4vQ300C}_1OWm7hYW=b00AkM1OWm8h75!ZD4Ya=00DHO1OWg6a;yXa00CvP1OWg6bGQTn00C~k1OWm7iwubj00Ak=1OWm8iVTPhD9{9f00Cvz1OWg6bKnF400Cj<1OWj6oeTg0De?pX0Rfy0DE0(_00DXY1OWg6bOZ$f00D3c1pxv8p$w%A00Ai$1pxv9pbVr8C>#ZW00Cqo1pxp9a&2zx1OX5Q0W1Xp0sxN;jSK(*DL@4Q0s)Q;j0`A71%Utob4&#R00C}R1pxp7X3q6{eZ1%UtoZu|uS00C(R1_1y8XAA}b00CtZ1_1yDX=P(!b7I5<0Wt*vo&^EM1p(>>0T>1W00BB41_1#9rVKhb27v$pa6SeB00Ch}1_1y8ZA=CM00CuE1_1y8a99Qb00DVk1_1yHX>)gVW^!V0VRQuU02cEAJoEtk_5fP<0OI%n0Q&&y`~Z*y0b~XN00BB`1_1#9Sq?gs27v$pd71_R00DBM1_1y8Z>RId800D321_1y8W9$Y200C_B1_1y8W%vdG00DOX1_1y8WdsKS00C?Y2LS*9a1aLp00C(h2LS;9761SNXd(vz00DF+2LS*9WGn{(00C(-2LS;97XSbOWj+T100C!02LS*9VMqr700DDO2LS;97ytkPbXo@i00CiM2LS*9ZDa=l00DAp2LS*9Z*T_z00m@icXeja1_2xg0XPQ%R0jce2LS*9I(!EK0Rb5RI+6#000Co|2LS*9bD#$S00CvD2LS*9WUL1P00CsO2LS;9CIkQhVZH|e00DHu2LS*9VaNvo0RSfi00DH=2LS*9ZrBF_00DL02LS*9Z{!C700Cp_2LS*9Z14vG00Cw82LS*9cKinc00CtJ2mt^AYzPPe00D3g2mt^AX%q+n0RSij00C$q2mt^AbR-A?00Cqw2mt^AX)p)@0RSlk00DG72mt^AXg~-700C!42mt^AX-o(K00CuE2mt{ADg*!lWnKsY00DYp2mt^AX=n%m0RSrm00Cum2mt^AXLtw!00Cis2mt^AbA$*10RSun00DH62mt^AVU!2~00C{92mt^Aa-awS00D2N2mt^GWNmk7b9H9U2LT!g0X7H$SO@`b2my)+0jvlC00BC(2mt{BEd)By2!Q|rW7Y@(00DE}2mt^AW#k9}00Cs`2mt^AdGH7U00Ck42mt^Aa{LGZ00D9W2>}5BsS5xBVGaoa00DFo2>}2BVHgPk0RXBC00DF)2>}2BZYT)>00DI_2>}2BZ!`%300Cn<2>}2BY(NPC00Cu22>}2Bc1#HY00CuE2>}2BY*+~a00D4b2>}2BX=Dij0RXED00C%l2>}2BbaV*;00Crr2>}2BX@Cg<0RXHE00DH22>}2BXpjj300C!~2>}2BX`BfG00Cv92>}5BtqTAFWv&SU00C#R2>}2BVYmqa00DEp2>}5Bt_uJGbjk?<00Cjn2>}2BZPW}2BZ{P_500v}jcW8BH9ti}2BI_wDn0RgWIItB`X00CnR3IPBCa}){z00Cth3IPBDVPpsi0U!zi00Cqs3IPECWeETQVKxc@00DG53IPECX$b%UXhsSF00DGL3IPBCa8L>X00LoUKnej?3IPECW(fcRbY=00C*<3IPBCW#kG00RUjI00Ck83IPBCa{vng0RU?W00DFi3jqKDVGs)e00C_l3jqKDavTc*00D0z3jqKIWNmk7b!J=&0jvrE$O-}K3IPTS0VoRr00BBK3jqNEYzaC@3xNOuV@?YJ00DDW3jqKDWn2pZ00CrT3jqKDWM~Tk00S{HGq?u3jqKDb%+ZA00DH43jqKDc$5nP00Cv13jqNDi2wirDW(en0Re~rD5?vA00CvN3jqKDbhrxv00CjX3jqKDWW);r00D5y3jqNDivR!tDb@=C0Rf5tDB25w00Cs+3jqKDVdx7100Cw03jqNDjQ{`vDf$Zm0RfBvDE00Ctt4FLcFZY&J}00Ct(4FLcGb!XBH0XPi-00BBa4FLfGI1V~U4S@gwc}@)h00CiE4FLcFa$F4o00DAh4FLfHkN`Siq6~p(4FLcFWNr-s0RVyr00Ak04FLfGfd?pr4S@gwWr_^}00DH84FLcFVVDg800Cs44FLcFaHI_Z0RV&t00Akm4FLfGg9j+I4S@gwbGi)y00D5q4FLcFVaN>u00C{z4FLcFaMTR}00C**4FLcFZQu<700Cv@4FLcFbnFcQ00Ck04FLcFa`+7a00CwG4FLcFZUhbi00CtR4gmlHb!Vy#0T2!W00BA{4gmoHg$Fty4uJpxWF`&)0RS!v00Aj94gmoHEea?&4uJpxWj+o800DGH4gmlGVN4DI00CrD4gmlGa99oj0RS)x00Ajv4gmoHFA6AV4uJpxb8Zd+00D4z4gmlGVSEk&00C`+4gmlGaEJ~800C)^4gmlGZIliH00Cv14gmlGbf69a00Cj94gmlGa;y#k00CvP4gmlGZnzEs00Cvb4gmlHb!T1<0mKdg00BD64gmoHF$y}=4uJpxWZDh^00S~JF?tOFE)D_W4gmlGW#|q800DCL4gmlGb^Hzi00DFY4*>uHcnA*x0RR9C00Ai!4*>xI{|YD=4}kyyZXOQ-00C(x4*>uHXDkl^00Ct(4*>xH0t)~EDLxMY0RaIEC_)c`00Cr34*>uHZcq;a0RRLG00Ajn4*>xI0}Ci%4}kyyWo8cn00C}p4*>uHZ*&g<0RRRI00Ak04*>xI1q&#I4}kyybczoF00C^04*>uHb(jwU00DEJ4*>uHWuy-Q00d%XWO6tU0agzIdJh4r4*>uHIHZu00DBy4*>uHWzY`+00C{*4*>uIWoZr%0o)G(2>{6e(*Vl=%>dB=)d0@`*8tf700AlN4*>}Q$Nj3ir00Aj55CIJV@Br=r+5p@D-T>?X-~i$Pf@&G7I5P<*zbW#uj00C}t5CH%IVR#S$00DG<5CH%IbA%8900C}_5CH%IZ;%iH00Co`5CH%Ibes?Y00Cv95CH)I^#A|?DXtI!0Ri*?D6$ZN00CvV5CH%Ia=;J)00DKz5CH%Ibj%O|00Cpt5CH%Ib=VLA00DB|5CH%IbmR~L00DFA5CH%Ia_|rV00Cw85CH%IX8aHV00CwK5di=JbqEmw00CkS5di=JbQBQ*00C|q5di=JVIUC!00DF+5di=Jb1V@700C|?5di=JZ#WSF00Cn@5di=Jc|;Kb00DAJ5di=JWl#|T00DJY5di=LVsmjS5CNzV0bCIQ00BB;5di@K_5eC?5rF^!baoK|00C}(5di=JX@n6000D1`5di=JaF7uJ00C!~5di=JZk!PT00C*D5di=JWT+7V00C~U5di=JX|xdm0RTh>00Ak$5di@KLk1|s5rF^!bjlF{00C~&5di=JY1k0~00D2_5di=JaO4pI00C#}5di=JZtxKS00C+C5di=JWc(2U00C|S5&-}KX$TSl00CkS5&-}KbQBT+00Cth5&-}KXCM**00BBC5&;1LMFu)75`h2#Wik>000C|~5&-}KX+RPI00C@95&-}KWlRzQ00D4P5&-}KX;=~g0RZv_00Ajv5&;1L@dhYp5`h2#Wo{Ay00D4z5&-}Kd3+K900DG@5&-}KbchlG00Cu=5&-}KXOt2F00BCh5&;1L^9DMg5`h2#Wu_7V00C#N5&-}KVYCtf00DHm5&-}MVsLZ15dmHj0l*Rg00DBw5&-}KWz-S@00Cs$5&-}KVc-%00RS)w00DCB5&-}KW$+RK00C_F5&-}KaQqSh00C_R69E7MXkq3O0SFTT0RW@|00Ctf69E7LbQ}`_00Chl69E7LbSM)600DC@69E7LY%~)A00C(_69E7LV?YxD00C}B69E7LWlR$R00DGT69E7Lb667r00C%T69E7LbYv3&00D4n69E7LWpEP#0RZL#00Aj{69EAMZwJ0Ria(I?fY;00DB;69E7LW!w`100Cy=69E7LX6O?E00DLG69E7LV)PRM00DUV69E7LWdIZb00CqM6afGMZVVIw0RTq>00D9s6afGMWgHX%00Cwq6afGMW+)T^00DI_6afGMVl)&100Ct>6afGMZ9o(O00Ch}6afGMa!eEf0RUG600Ajj6afJNRs$$p6oCK%WnvTo00DGr6afGMVQ>@y00Crn6afGMaC{U20RUM800Ak86afJNSOX}G6oCK%bCMJR00D5C6afGMVW1QN00C{L6afGMaI6#o00C*T6afGMZMYNx00Cvb6afGMbi@<^00Cjj6afGMa?lh300Cvz6afGMZrl_B00Cv<6afGNb!UPU0q7I~00BDg6afJM;tBu(DgG1z0RiC(C;}CM00CtP6#)PNbPyE*00ChZ6#)PNWE>R%00D3!6#)SN8j00C`Y6#)PNWn>ir00DGr6#)PNVQ>`z00DA#6#)PNWqcI@00C}-6#)PNWr!6400MPqC=~&Y6#)PNI+PUw0RiO-I-V7Q00DWV6#)PNVXPGa00DBc6#)PNa<~-%0RmbBI$`(}fxZ<100D5s6#)PNVbB!;00C{*6#)PNW!x1300Cm+6#)SNAPN8hDee^k0RbNhDDoA700D6L6#)PNVE`5Z0RSQj00Ais76AbPAqprE7J&c(a26H;00Chh76AYOZ6p=}00C|)76AbOBnkilDK-`X0RbZlC^{B_00C@376AYOY)BRX00C)E76AYQZFOb_76C980aO+N00BB$76AbPB?>xd7J&c(a&8s@00Cuo76AYOW_%U_00Cx#76AYOb%+)L00Cl-76AYObd(kW00C~A76AYOVW1WP00DHS76AYObF3Bt00C~Y76AYPb#Leu0k{?c0RU+O00Cvl76AYObj%h300Cjr76AYObl4UF00DE}76AYOWaJhB00D0576AYOW$+dO00C_F76AePVgzIa00Aii7XbnRVFY6YC=ywF7y$qQIuIBE0Rg!PIvN;(00D9!7y$qQWhfW{00C_-7y$qQX*3uC00DG57y$qQWIz}J00Cu27y$qQZcG>f00C)I7y$qQY*-ip00CuQ7y$tQu?heIDQXx20RgZIC~g>m00D4x7y$qQVSE??0RXcK00Ak87y$tRvI;1S7=Zu*aFQ4S00Ci|7y$qQZJ-zd00C~M7y$qRZFPbe0jwAS00BC(7y$tRv5t^00Cvn7y$qQX3!V`00Cy!7y$qQb=(*M00Cm+7y$qQYv>pO00Cp}7y$qQVe}XQ00D6N7y$qQYycSn00CtN836zSaCl@G0Sp-d00C(d836$Ri4gz+Wg-~?00DF+836zRVJsN|00DF|836zRb2u3R00DA7836zRWkeYP00DGL836zRb5I!p00CiE836zabaP~BW@BP@aB|`g0S*%Zb`t>-6ai8c0lpRi{1ySi7Xcg@0bCgY00BB;836$S;0rp88G!%+Y?2uP00D5C836zRZJ-$e0RUeC00CsI836zRWw03m00C^a836zRV!Rmv00Cjb836zRZpaw{0RUhD00Csw836zRW!M=300C^?836zRV&oYC00Cj@836zRZtxia00Cw8836zRW&9Zd00DFY8UX+SX$Tqt00D9i8UX60RUqG00Ct{8UX+Sazq*d00Ci28UX+Sa8Mcn00C`Q8UX+SZ(JGy00m`tZf0Z7837a;0V)~+IvN3D8UX+SI%paJ0s&+J8v{Ci8i4=-XoMO800DH48UX+SaFiMW00Cv18UX8UX+SVcZ%400C{{8UX+SWat_J00L%V&Kd#k8UX+SW%L>W0RS=x00C}xH00Ch_8vy_TW=I8vy_TVcZ)50RVvr00C_18vy_TY3v&T00Ck08vy_TX80Qc00C(J8vy_TbOam$00D3c9033UWe^+z00d)ZaAdX{0n8f#;u`@L9033UIvgAU0Re&tIxZZ600Ct*9033UV>}!I00MGhjvE0&9033YWpa07X2==={u%)?8v$S&0Z1GH00BBu9039WH3%F7I%ph$00C@n9033UX?Pp~00Cou9033UZiE~G00Cu+9033UbdVeY00Lxlpc(;|9033UI-DE<0RbHYI;I?f00CpH9033UbF>@*00CvX9033UWWXE&00Cvj9033Ubj%z900Cjr9033Ubl4mL00DE}9033UY~&mP00C+09033UWAGdS00D0H9033UW&9ig00DFY9RUCVa|j&)00C$Y9RUCVbQB!{00D3s9RUCVWgr~^0RUwI00Cqy9RUCVWiTB900C?^9RUCVVmuuI00Ch_9RUCVZb%&g00CuA9RUCVWKJV{#n<00DA#9RUFVX8`~Kbb=iL00DD`9RUFVXaN8LaFQJX0RU+M00DBG9RUCVZ=f9k00C^K9RUCVZ>${w0RUWxgH(00DBw9svLWb<7?C00DH;9svLWW7r-600DL09svLWa^xNX00DIB9svOWvkm|OW%eEc00C|K9svLWVE`Wi0RXfP00DFi9{~UXWe^_$00DCr9{~UXW*i>@00Cwq9{~XXwGIFQWiB5900DY39{~XXwhjORWj-GP00Cq|9{~UXX-FRd00DAN9{~UYX>>Rr0aPCW00VAsa|Ry)C?5e@9{~UXI%FRK0RguTI&vR@00DG(9{~UXZh#*F00Cu&9{~UXZHylQ00Cu^9{~UXY?vPb00MJm@E!r49{~UXa-<&t00CvL9{~UXX0#sx00CyY9{~UXb-*7100Cmg9{~UXbj%+C00C~&9{~UXVb~u500DH~9{~UXbL1ZZ00D059{~XX69xbQVfG&Z00DIR9{~UXVE`Zj0RR*R00DFiAOQdYZV(^=00DItAOQdYZyX>200CnnAOQdYY$zZB00Ct#AOQdYb~GRX00Ct>AOQdYY(O9Z00D4DAOQdYX-psi0RR;S00C%NAOQdYbX*_-00CrTAOQdYX=oq;0RR>T00DG#AOQdYXm}t200C!yAOQdYX@npF00Cu+AOQgY7X|*)V00D58AprmZX`CSe0RWu{00C&IAprmZbgUr(00CsOAprmZX}BQ)0RWx|00DHwAprmZXviS}00C#tAprmZY1APB00Cv%AprpZp9lZ}W#%CP00C#}AprmZVelaV00DFMAprpZpa=i~bOIs)00ChJA^`vaZ44p-00D9mA^`vaZx|v000v}jcW8BHRv`hRApyQ20pKA4{2>7zA^`vaIwT?i0Rf>1IzA$S00Cn}A^`vab4(%u00CuEA^`vbVPrrd0azjd00D4bA^`vaVQ3-&00C`oA^`vaWpp9|00ClpA^`vbZ*}k=0e~U_0RSEY00Cu?A^`vaZImJb00Ci|A^`ya9|HgZWu_tl00D5SA^`vad9We@0RSKa00CvZA^`vadcYz90RSNb00CvpA^`vaWY8i300C*%A^`vaa@-;T00L=r#v%dYA^`yaA_D*cbn+qr00Cw8A^`vabNnI!00CwKBLM&bW(Xqz0RSTd00DRuBLM&bWf&s?00CqkBLM&bZX_cC0RSWe00D9^BLM&bWi%rJ00Cw?BLM&bW0A00C`=BLM&bWsD;M00C^0BLM*bBMSflbecbqFK@0RSco00CtbBmn>cZWts100C(pBmn>cY$PNB00CtxBmn>ca4;kR00C(>Bmn>ca6BXd00DABBmn>cWk@6e00Cr9Bmn>cVN@gm00C%PBmn>eWny#YBLNO10bnEn00BB?Bmn^dCkr}sB!K_{V|pY300DD?Bmn>cWr!pJ00Crcd6Xmp00Ci|Bmn>ca-bvu00DBQBmn>dWnq{j0jwke00DTiBmn>cWxON-00DHuBmn>ca>yhB00CvrBmn^cD+K@nDcU3f0RbunDBdK200DC3Bmn>cW$YvY00Cz5Bmn>cX80rl00DLWBmn>cVgw}t00CtRB>?~dZ4e~^00ChZB>?~davUWA0RS%r00Ai|B>@2eE(ItoC4m3|WillJ00DG5B>?~dVL&AT00DGHB>?~db4(=x00DARB>?~dWmqKv00DGfB>?~db7Um}00CiYB>@2dGX($vDRw0R0Rb`vD0(G<00CuyB>?~dbciJZ00Ci+B>?~dbd)6l00DEFB>?~dY@j6p00C*HB>?~dW2_|s00C~YB>?~dWw<2)00DHqB>?~dbHpV900C&qB>?~dbkHRM00D5;B>?~dW!xnJ0RT4z00AlJB>@2eHU%i`C4m3|W%4Bf00DIRB>?~dVE`rp00DFcCIJ8ea||W{00CqYCIJ8eZWty300CtlCIJ8eY$PTD0RTG%00Aj5CIJBfIt3^+CV>C}ayljf00Ct}CIJ8eW=JLh00CxBCIJ8ebyOw+00ClJCIJ8eYhWe;00CoWCIJ8eVQeM=00D4vCIJ8eYDHbRJ0Rcn>C>kh%00CqmC;0eC0@0RTq@00Ak8C;IG00Cr%DFFZhZj31b0RT}200AkODFFciPz5NQDS-e1a-t~#00CvHDFFZhX0Ry%00CyUDFFZhb-XD70RU4400Ak;DFFciQUxf?DS-e1dD1BX00CjzDFFZha^NWe00DC5DFFZiVqwB50qiLO00DUNDFFZhW&9}t00DFYDggiiatJB`00CtVDggirW^!a=aC3BHX?7wd0dOS&;w1qpCIRRs0j?(jekcJzDFKox0Te0$00CthDggiibVMov00Ci2DggiiWl$;s0RUwM00AjnDggljWCbW-DuDn2a%L(400D1qDggiiY;-CC00D1$DggojX$5Bm00Ak6DggokXa!~kD2ytB00DB6DggiiZ=5Ot00C^GDggiiZ>TB(00CpJDggiibhIh~00CvXDggiiXTT}}00DBwDggiiVazH40RU?S00Al3DggljY6U3VDuDn2XyPgX00DIBDggiiaPTSt00Cw8DggliZ3O@UDFQ120Re0UCt00MGsRw@BjD**ujEd>ApDP}7H0Rb!pC~7N#00DAvD**rjWq2zA00CxxD**rjW`rvN00DK1D**rjVvs8V00Cu|D**rjZJa9s00Cj5D**rja;Pf-0RS-t00AkqD**ukFa;>MD}ew3Wxgu`00DHyD**rjVazK500DH;D**rjbJ!~Z00DB|D**rjW#lUX00DIBD**rjbMPwx00Ck4D**ujH3a|xDFQ430Rc1xCm1U00C}3ECB!kWkf6i00DGLECB!kb5JY+00C%LECB!kbX+U}00D4fECB!kWoRq`0RTA#00Aj#R00DH8ECB!kbC@gv00Cs4ECB!kZlo*$00CvHECB!kY_Kc=0RT@000AkyECB%lP6a5yEP((4a>gtH00CvrECB!kX4EVJ00Cy&ECB!kb>J)k00Cm=ECB!kcEdc-lbU-Zu00DAFEdc=leFXpkDN-!~0RemkC{`_j00DGdEdc-la%3$500D1mEdc-laBwXF00DP)Edc-lWqd6G00L!cOf3O|Edc=lUj+aGDUvM#0RdhGD3&dO00Cv3Edc-lZlo;%00C*LEdc-lY_Kf>00CvTEdc-laJ(%600C*jEdc-laL6qI00DB&Edc-lWz;PJ00Cs$Edc-lVc;zR0RVpm00AlNEdc=meg!D-Er9?5a`r6&00D3QEdc-la|A8{00DCfE&%`mX%H>}00L-Z<}CphE&%`sW^!a=X?An2D*^l~0d6b-wk!bzEdhuv0URy?00DF+E&%`mWkfCk0RV3W00AjbE&%}nZUrb*E`b06b6PF|00CuUE&%`mZfGt600C)kE&%}maRmSYDS9pe0RVFa00Ak4E&%}mcLe|eDUL1y0ReUeD3UIL00Cr}E&%`mWuPtr00CpBE&%`mZmcc=00CjLE&%`mbhs`700DEpE&%`mZp1DD0RnObC~1f;fyyoc00CssE&%`mW!x?S00DU7E&%`mW#}#e0RVLc00AlVE&%}nbOk8*E`b06Wd1Gz00CtNF984nV+=0=00C|iF984nVHhs~00DF!F984oWOME=0VFR000C|)F987pa0Mu7elCGDF984nb2={p00Cu2F984nY)mf!00C!GF984nZdfk?00CiMF984nX=E<}00DApF984oY;<%k0dOw?00DP)F984nVSq0I0RVXg00AkCF987ocm*hsFM$97WtJ}i00DHKF984nb)+u=00D5SF984nZLlu^00D2dF984nW4tc`00C&iF984nW5_Q700DH)F984nVbm`H00D5?F984nbKoxl00MGphA#o;F987ndj$XiDfTY`0RegiDEcpf00D9UFaZDoWe6|<00C(ZFaZDoauhHD00D9uFaZDoVIVL800CkqFaZDoc`Psi00D9`FaZDoZ#Xak00C`2FaZDoWkfIm0RVvo00AjbFaZGpfCVU2Fo6I8d0H?500DGjFaZDoa%eCC00CugFaZDoaC9&M00D1$FaZDoa)2-a00D4@FaZDobc`?o00Cu^FaZDsV{>F}XIv`*N-hEHF9Aw00hllW00BClFaZGpf(1IXFo6I8Wx6l{00CpdFaZDoX~-}E00DN+FaZDoWz;YM00Cs$FaZDoa^Nrl00Cv@FaZDoWb7~j00D0DFaZGoZ3X}VWd1M#00CtJF#!MpYzQ#{00CkSF#!MpVH7a|00C|qF#!PpZUz7WWhOBJ00CnvF#!MpVK6ZP00L!ZATa?pF#!MpY&_-;0RZm@00DVqGXVeraA-3D00D1qGXVera&$8R00DG*GXVerZ-6ra00DD`GXVerX^b-g00C~2GXVerVVE-k00L)tUNZrnGXVesX<;%m0i-hl0RZd=0RZg>0RZj?00VV)cepbFyfXp7GXVerbHpc00BDoGXVhs@CP~sG=TsCV+u3@00DCnGywnsWf(L800CqkGywnsawIeX00CtxGywnsY%nwd00D3|GywnsZ9Fsq00Ch_Gywqs@(2I{DNZy20Riy{C{i?m00CrJGywnsVPG@?00DJoGywnsacndJ00C}tGywnsWq33J00CuwGywnsa)dMi00Co)GywnsbC5Iv00Cu|GywnsbeuE+00Cj5Gywnsa;P)`00CvLGywnsZnQK300CvXGywqsT?qgIWyUlC00C^uGywnsWY9DL00C~+GywnsVcawU00C&?GywnsI_NY30RdhKI_@-q00DILGywnsW&AV&00CzLH30wtatJj600ChRH30wtbQCoK00DU#H30wtVIVaD00D9)H30wtax66g0RSux00CtblNom00C~^H30wtb>uYx00D36H30wvbaP|SH38N&0q`{e00DINH30wtWdt?>00CzTHUR(uau7BF00L!Ux-|h7HUR+u9SQ&eY$i4V00CtxHUR(ub}%*p00Ct-HUR(uY&a&u>9pbG(}838680Yn}Fh9UvfBmssp0Z23fz%&7hH~|0wI*>R40Ri&}I=VQ40RW@`00C#nH~|0wVazxI00C*zH~|6xrU0q{00Al9H~|6yr2we_DC9VS00D05H~|6xr~s@000AlbH~|6yrvR$}C;&Nu00DRgIRO9yX<_s@0T4L>0RXN500Ai=IROCytpF$_Ie`EHcq%yo00D0@IROCxumAu7DLy#?0RgW7C_*`b00DAHIRO9xWl%W*00DGXIRO9xZd^G500CuUIROCxvH$=9DQ-Cd0Rgc9C~`T00RXfB00Ak0IROCyvj8ZBIe`HHwg3PDDUvw>0RgoDD3&>a0RXrF00AkaIROC#w*Yu~dMJ1~0g5>RoH+rgIe`EHbFMi700D5qIRO9xVaPcF00C^yIRO9xa@08i00Cv%IRO9xcHlVy00m@iVqI{^RzZ-_eq00MAsY&!vtI{^RzI+QyB0RdYHI-Wa$00C~KI{^RzZ>&230RXlM00AkuI{^U!wFxM^JAnWKX>+nW0m3^000DH$I{^RzW7InV00Cv%I{^RzbKpAx00DC5I{^RzW$Zfv00DIJI{^RzZumO^0RXrO00AikJOKd#w+Sc+Jb?fKXAV3800C|mJOKa!X&gKO00D3!JOKa!a40+h00C((JOKa!Y&1Lp00CnJOKa!Wr#ch00C%@JOKa!bd)>+00DKHJOKd!x(NUQDW*ID0Rg!QD5^Yx00C~WJOKa!Z@4@G00C*fJOKa!bi_OX00CplJOKa!WzakU00DE>JOKa!a@;%t00CvTJ%IoLWi~wl00C}3Jplj#VMILv00C@DJplj#a8Nw~00C}RJplj#XT00DDuKLG#%b#y-g00DA(KLG#%W`I8d00Ci!KLG#%a*RI#00Cu^KLG#%ZJ0j+00L}bAU^?~KLG#(ZE0iVJpq6|0i-_x00DHaKLG#%WxPKD0RZL;00CvlKLG#%ddxoo00C*zKLG#%bJ#xt00Cy+KLG#%Y~()y00Cj@KLG&%=nDV=DfT}B0RiU=DEdEv00CzJKmh;&VF*A000C(ZKmh>&>I(n?DH=cl0Ria?C>}t80RZd^00Aj1Kmh>)>kBj}BtQW$K!E@Ob2dN$00DABKmh;&Wk^5)00C}JKmh;&a#TP800D1WKmh>&?h60`DP}+c0Rim`C~81~00DDwKmh;&Wq3dV00CouKmh;&VT3>d00Cx-Kmh;&XOKVv00C~6Kmh;&X`Da-00DENKmh;&Z>T^400C^SKmh;&W3)g40RZp|00Ak$Kmh>(?+YlzK!E`O@(Ta~Dbhdz0Riy~DAquM00DE{Kmh;&W#m8s00Cp_Kmh;&Vemi!00Cz9Kmh;&bo@X800C|SK>+{(We7n500CnTK>+{(VH80D00C+mK>+{(WFSES00MJi%0K}oK>+{(Wh_Af00Cz+{)Ze+SZ0X#tg0RZ$100AjXK>+~)^9v|YL4g1Pb5=nC00CuQK>+{(XJkPE00CrbK>+~(_6q<3DRw~t0Ri<3D0)GG0RZ?500Ak8K>+~)_X{YDL4g1PbCN*;00C^8K>+{(VW2?)00C{LK>+{(a;!lC00D2ZK>+{*Wpi$DK>>h40k}Z{00CvbK>+{(W6VJT00CjrK>+{-Xk=q$X7E1&6hHxBKmkHQ0oXwS00BDQK>+~)`3pMqL4g1Pc=|yB00D0TLID5=VPk1?aA#s1Isq&@0scDypgaM3JpsZ$0SH0?00BALP00C)kLID5)W^_UU00D1$LID5)bAUnt00DD`LID5)WsE`r00DB6LID5)WSBw$00Cs4LID5)VWdI<00BCxLID8*l>j=hLV*AQY_>uH00D5mLID5)ZNx$W00C*rLID5)X3#lh800CtnL;(N+dMHEz00C((L;(W;7zY{$Fb4nuDLO;}0|6HY83!*1C_+Sm00DPML;(N+WmH4~00C)QL;(c=90xK7JO?xfJ_i5+DP}|g1pyleF$X&bGY35fC~`!B00DG(L;(N+Wr#!p0RSKe00AkKL;(Q-9|tIyM1cSSWu8O<00D5OL;(N+d8|YM0RSQg00AkuL;(Q-AqObDM1cSSWx_-O00C{vL;(Q+BnJQiDb_>*0RbZiDB47U00DI1L;(N+c<4j{00LoU&_n_5L;(f>CI=`7Mh8>}L_D0)YM00CuyM*#oivwjSvPS{DM}YtVWWq-Q00C^yM*#o+600DIVM*#okpn2mNPz$Wa?VHr00D2-NC5x=blgY*00Cp-NC5x=b?8U|00DCDNC5x=bo59800DFQNC5x=ZU9LE00D0XNdW)>V+=_F00CtZNdW)>b{I(k00D0vNdW->lmh?(DJn?;0RfW(C@x8X00DC}NdW)>ay&@^00D18NdW)>bVx}700Co8NdW)>byP_K00DAZNdW)>bYMvV00DDmNdW)>Zfr>b00D1uNdW)>V|Ymc00CouNdW)>X@p4u00DD~NdW)>VUS4y00d-XZDLqR0lr89BuN35NdW)>Xq-s_00DHaNdW)>X|zcJ00Lrn;70+vNdW)>I>1Q*0Rfc*I?73b00DB)NdW)>W!Omp00Cs)NdW)>Y~)D+00C+0NdW)>b?`|60RX5D00AldNdW=@i4La@C;&=<00D9aN&x`?pbh{5DHcir0Ro>6ZzvE-0UAny00DF$N&x@?V=PJm00DI}N&x@?ayUu>00DG9N&x`?sty1FDN0HK0s)E+sSYSkN`U|Ya#TtI0RW;700AjvN&x`^p$=~-UP=LIN`U|YbZ$xk00CoqN&x@?b%06%00DA_N&x@?bc{*?00DE7N&x@?ZkS2|00D2FN&x@?W28y}00DHWN&x@?Y_LiJ00DKjN&x@?VZ2HK00MJnL`ng|N&x@?Wynea0RXHH00Al3N&x}^iw>&}DBMbc00DC1N&x`?qz(W9De_7I0Rp2AZz$|a0rpCP00DITN&x@?V+czD00DIlO921@auiDe00DFwO921@b0A9r00C|$O921@Z!Ajz00Cn%O921@c{ob}0RWB;00AjPO924^jSeVCOMw6ZbWTeF00C)MO921@VO&cA00DAhO921@bZAQf00CugO921@Y;;Qj00ClpO921@X@E-s00DG{O921@V~k4y00DK9O921@a+pg200DHKO921@bEHcF00MAsK1%_rO921@Z?H=N0RXNJ00Ak$O927_j1H|1D8x&F00DB!O924@rVaoBDcVZ`0Rp8CZz$AD0p3f200DI5O921@WAIA>00DLOO921@a{NmH00DFYOaTA^a|lcU00C|eOaTA^Zxl=c00CnfOaTA^Wgtue00DL;OaTA^Z!Am!0RWH=00AjDOaTD_j}9n2Oo0Faazac200D1GOaTA^bWltI00CoGOaTA^bzDpV00DAhOaTA^bZATg00DDuOaTA^Zgflm00D1$OaTA^V}MKn00DG{OaTA^Y>Z3+00DK9OaTA^VVFz-00Cy6OaTA^Wu#020RWN?00AkmOaTD_kq#)dOo0Faa=J_b00D2pOaTA^bjVBr00CppOaTA^b<|7&00DB^OaTA^bl^+@00DF6OaTA^ZtP3}00D3EOaTA^WB5z~00DXaOaTA^a0E>O00D0bO#uM_lnwv^DHcru0RfW^C>l+H00D9!O#uJ_ZzxRx00DF^O#uJ_V>C?x00DJ6O#uJ_azIT100DGHO#uJ_b4*PE00C}NO#uJ_Z&*zM00CoOO#uJ_Wn@hO00DMtO#uJ_Z*WZk00U%WZK_NG5KRGgO#uJ_Xnaip00DH0O#uJ_X^>3;0RWZ`00AkSO#uM`l@2JNO@RObWu{F500DZgO#uJ_X|zoN0RWf|00Ak$O#uM`mkubzO@RObbjnQu00C~&O#uJ_W!Oyt00C{@O#uJ_Zsbh?00C#}O#uJ_Y4A+}00C_FO#uM_nhpQ~DFRLb0Rfo~Cy0Rfv1C~{7L00DG(P5}S`V}MQp00DJ|P5}S`a*R#^00DH8P5}S`bC^y600C~EP5}S`Z=_BE00CpFP5}S`d9Y3a00D5eP5}S`Z@f+c0RWy300Ak;P5}V{oen6>PJsXcbka@%00Cp#P5}S`b>L0`00DC5P5}S`bnH$600DFIP5}S`Zum|C00D3QP5}S`V+2nD00CtRPXPb{b`Vbi00D0nPXPb}WMge;P65JB0US>O00DC%PXPb{VK7et0RXTL00AjHPXPe|uMQ|cPk{gdWJXT`00CuAPXPb{a8yqL00DVgPXPc4Vq{}&cXMHAboNOB(nI1R^+5_wZWhe+x0UA(&00DF$Pyqk|b2Lx^00Ct>Pyqn|m;(R-az;=A00Cu6Pyqt~wFBJ)-va;vDOOMc0szee%L4!bDP&Lq0s+he$^$5BP=Npea&S-q00D1$Pyqk|bbwF+00Ci!Pyqk|a*R*`00Cu^Pyqk|beK>90|T@J+ymYNbSP<1Pyt?0fu2wS00DHQPyqn|s{;T5DZWqv0RgH5D8f*I00CvlPyqk|deBe-00L!cxKIJsPyqn|nF9a;a^_G00|2)J;RE9X00AlRPyqu1wgcb;;sa$U>QDjrP=Npea{f>O00ChRQ2_t}WfV~X0RW`~00Ai=Q2_w~qys1Q2_w}=>q@(DN0cR0RiX(C{9s<00DPYQ2_t}Wn57K00C)YQ2_t}c4$!n00DGvQ2_t~baO;e0d!FT00C}#Q2_t~Y;PJ-0fbQj0sxx>odW;?DU?wG0s)!>oC7GDQGoyfbf8fI00C*LQ2_t}VX#pF00DBgQ2_t}bi7dk00C>lQ2_t}bI4Hv00CjnQ2_w}p925^DcVs10Rf%^DBe+l00DI5Q2_t}Y3xw}00Cn1Q2_t}WcX150RX2100AikQUL)0rUNJlQh@*hWOV*f0S;0D0sx}}p#uN`DIih-0s*1}paUo-Qh@*gbSzQ<00C(>QUL$~Vmwj-00C%1QUL$~bVyPG00C)EQUL=1sRQK$?*jk?Kn00C!uQUL(~u>$}BDTY!30RgZBD2h^n00DH6QUL%0Wodv?0hm$&0|2c9uLIWu00AkeQUL=2tOKqC)&nT8Qh@*gceYXi00CvfQUL$~X~{0;=Qvm`1y#v1k00Ai)Qvm`2yaT=iC?HdT00D9)Qvm=0Z!l8<00DG1Qvm=0VLVd-00DABQvm=0Wk^#200DGPQvm@0!2Z^Qvm`1#RJg;00Ak6Qvm`2!~@U+D2!8q0szMY(*pnjDV$RQ0s+PY(gP@>Q-J^hKB!Xx0szSa)dK(lDY#Ps0s+Va)B`BKQ-J^hE5uU)00ccMEh~Cc0g_VzvQq)hQvm=0a@11+00D32Qvm=0bnH_B00Ck0Qvm=0a`;mL00CwGQvm=0a0FBV0|4^_=L7Kr00AiwQ~?74@&o1r@B=6qRDl2iWFAxj00C|)Q~>}CbaP{EVRvG7ZfS32Ku`hPPyvcj0n||e7E%FJQURV)0nSnZ5K{qEQvnK80Ween00BBSQ~?12^aDC*RDl2ibZ%4u00C)sQ~>}1VSH2p00DA>Q~>}1bcj>|00C=`Q~>}1bCgs800Ci|Q~?115(NMOWu{aC00DZcQ~>}1X|PlQ00C^aQ~>}1VZ2lU00C*jQ~>}1a>!Hx00CvrQ~>}1bJSD;0RR&P00DF0Q~>}1W#m)=00D67Q~>}1dGJ&L00DINQ~>}1a{N>Q00CtJRRI72b_i7g00D0fRRI72V-!^Z00DCvRRI73Wog<}0U%WY0RR;R00Aj5RRIA36a^?WRe=BjbUIZ500C}7RRI72Wk^*400C)ERRI72Y*bYN00CoKRRI72WnfhS00D4jRRI72d2Cey0st8W7X<(TDR@-@0s$BW76mANRe=Bjbc9s_00C)^RRI72VU$$?0stKa8wCIXDWFvW0s$Na8U-k(Re=BjWvo>J00D5eRRI73a(S9n0lZZK00DHuRRI72WXx3o00CsuRRIA29|ZsbDc)590RbKbDB@Lt00DI9RRI72WAIf000Cw8RRI72Zv0gN00C|SRsjG3ZwOWa00d-oVPhs$0diFV*i``zRsjG3Iuup`0RbQdIwn?u00DF?RsjG3ZZuW_00Ct>RsjG3X+Ty100C@9RsjP5Yzk-!Y6<`WDNdU00DCnSOEY5X&6`m0RZv}00Ai^SOEb6@d_v?Sb+cmaxPc_00Ct-SOEY5c05=C00DABSOEY5Wk^^700DDOSOEY5WmH%J00D4XSOEY5d0eSpfh6ItW<-0RjCAIv!bp00D9&Spfh6Wh_|%00DL~Spfh6ayVH500Ct_Spfk6jt~F=DN0!Z0RfE=C{9^{00CuGSpfh6ZCqIa00CiQSpfk6kPrX?DQ;N-0RfK?C~{eW00CuqSpfh6ZGc$;00Ci!Spfh6Zj4z000DH8Spfh6a+p~G00D2FSpfh6Xrx&I0RWN^00AkmSpfk7kq{`fS%ClnbGlgp0sxc{mJk2|Dacs?0s)f{l@KV-S%ClnXw+E&00DH~Spfh6Y2;Y}0sxp0nh*d1DezeV0s)s0nGh)US%ClnbNpEW00ChJS^)w8oDiN600AiyS^)w9n-HB4C>UCS00DF!S^)q7Whhz!0RW&700Aj9S^)t8pAaZGT7duoJw93i00BKlS^)q7a!gtQ00D1OS^)q7bXZye00CiMS^)q7a%5To00CucS^)q7aBx}y0RW;900Aj{S^)t8p%5s5T7duoWrkV-00DH4S^)q7VU$_{00Cv1S^)q7a-doP0RW^B00AkiS^)t8qYx;tT7duodA3>s00D2lS^)q7a>QBz00DH$S^)q7bI@7=00CvzS^)qFZgXjOXlHL@WN29ds#yWTSpn)<0SsCJE?NP0S^=h70o+;v00BDUS^)tBr4VCsb2>~`0iIU@L|Fj{TY&%pWe!^b00D3!TLAz8c_>=}0su=3VG95ODKuLF0|6)tN(*2MC^}n#00C$~TLAz8bWB?T00C!GTLAz8Zdh9Z00CuQTLA$8DGLArW@=jj00D1qTLAz8b97q)00DD)TLAz8Wq?}&00DA_TLAz8WQ(00DIFTLAz8Z1`IN00DLWTLAz8VFX+O00CwSTmb+9We{8e0RT}800Ai+Tmb?BD+^EyC?H&c00DU>Tmb+9a4=i}00D0{Tmb<9QwsnADMDNU0s$-wQVS?XT!8=qWlUTF00DMZTmb+9Z(Ljf00U%WZ5CVsJX`@{Tmb+9bZA@w00DA#Tmb+9Wqe!#00DD?Tmb|CYYTM?X$x};00AkETmb|DY72A=XbW-+D41M<00DBITmb+9Z>(Ga00DHeTmb+9VYplY00DBoTmb+9WyD+o00M4wh+F~6Tmb<9RSN(CDcW2C0s$=xR0}BHT!8=qW#n7|00DFETmb+9Vf0)90RTe_00AigT>$|BLJKGaU4Z}rWeQyZ00D3kT>$_Ac^F**00DF!T>$_AbR=B?00C|)T>$_AWiVX<00C__T>$_AWjtL00svhLXA1xUDM(!b0s&kLW(z1zU4Z}rWK>-N00VMtZu(pSLR|q~T>$|AF$(|zDRNx_0Rb=zD0W?e00DG-T>$_AY=m6_00DK1T>$_AVUS$`00Cx}T>$_AWt?3B0RS@#00AkeT>$|BG7BiIU4Z}rd9qyr00D5iT>$_AZ@^sv0RS}%00Ak?T>$|BGz%!uU4Z}rW!7B*00DO1T>$_AZ{%G800U%WZK7QP#$5sGT>$_AbnsmP00DCTT>$_AWdvRU00DCfUI73BZV+Ap0RT4(00Ai+UI76CHVY^qUV#7sWhPz$00DC@UI73BVKiO=00DA3UI73CX=N5(0YF{>00DGHUI73BWl&xL0RTA*00AjnUI76CI14CXUV#7sbY@-w00C@nUI73Bb#z_<00CioUI73BW`JG+00Cu&UI76BI|~2-DUx0R0RcJ-D3)G<00DWNUI73BaHL)V00D2RUI76BJqrKDF$Bw0RcV>C<0sw6bcMAXkDUe_R0s(9bb_*z$V1WVvZwq+~00AkcU;zRFZVPw|D6C+C00BO-U;zREaSMA300Ak&U;zRFa0_}1D9B)e00Aq`U;zLFDlIFVU;(^f0oY&x00DB|U;zLDZ|q00DF+VgUdFWh`O=00C?=VgUdFVmM*}00Ch>VgUdFY(!!K00C@DVgUdFbx>jf00U`rZn$9q{9yrBVgUdFI$UA_0RamPI%;Bp00DGxVgUdFX?S7*00CisVgUdFa)e?500DH0VgUdFWsqV400C^4VgUdFVw_?D00Cj5VgUdFY^Y)Z00C^SVgUdFb+lpu0RSfr00DWxVgUdFWyE3u0strtDGdMtWzb>)00DK@VgUdFY}{f200Cj*VgUdGYj(Udb00MMm3}XQvV*vsH(GAlL00Aj7V*vvJr47&x(hVp$V}SqxWjg0|A^3#0}aFD57J500C~OV*vmGX|!Vj00C#ZV*vmGWx!(r0szSk-wgl(Da>O50|A{4$PL~NDAHqr00Cs!V*vmGZscPD00C+0V*vpGo(%v2W%gqM00CqAV*vmGZUAHf00ChJWB~vHb_`?z00CqYWB~yHpA7&3a2{j<00D0zWB~yHsSN-DDK2CI0RgBDC^BS$00DG3WB~vHY(QiI00DJIWB~vHVN7HJ00CxFWB~vHWmseZ0RXEF00AjvWB~yIstqV;WPtzyd2VC@00D4zWB~vHZ+v6{0RXKH00Ak8WB~yItPLoPWPtzyWs+n800DNIWB~vHZ=hrW00U%WZC+#nf@A@vWB~vHbgX0n00DBkWB~vHWx!+s00DExWB~vHZp>r>0RXQJ00Al3WB~yIt_>*MWPtzyW#VK300DFAWB~vHVen)D00DCLWB~vIX=T!60sLeE00DFYWdQ&JbY&=H0SsjU0RXuT00Ai+WdQ*JxD6;EWq|+zWhP|-00D3=WdQ&Ic{F7K0Rf;5bUI}L00DVGWdQ&IWk_WK0RX!V00AjfWdQ*Jx(z5;Wq|+zWnN_g00D4jWdQ&Id2D3?0Rf>6baG_@00CuqWdQ&Ib%13700C@Ky$!z&!3_WbDUxLY0|C4Zz74<)D4Jz~00DQPWdQ&IWvpcZ00LoYjAa3`WdQ*I%MAblDZ*s|0s*28$_*&SWq|+zbj)P|00C^)WdQ&Ib=+kE00Cj*WdQ&IX6R)B00Cw0WdQ*I%?$tnDf(pr0s*59%nd01Wq|+zc?4zw00D3gW&r>JZxm($0RYbp00Ai=W&r{Lqz%puC?sZq00CtxW&r>Jb~I)I00D10W&r>LWMgggWdRyy0YGK}00DGHW&r>Ja#Usk00CuMW&r>Jb6{ox1OVd=^9|t*@eKe0DQso|1Oeg=@(th(@C_(-W`O_!a(re100D1`W&r>JbdY8N00Ci^W&r>Ja-3!X00Cv9W&r>KZggg50jOpH0RX2B00AkuW&r^KrVS{(W`O_!bi!r<00C*rW&r>JVbEp)00DB=W&r>JblheE00DX8W&r>Ja_D9O00Cj{W&r>JZuDjW00D3MW&r>JX#i&d00DFcX8`~KV+>~j00C(dX8{2Ku?+wLDIRA50RgZLC?aQp00DF;X8`~KY%pg500DJ2X8`~KVLWF600Cw~X8`~KWk_cM0RXcN00AjfX8{2LvJEI$XMq3#d0uA$00D4jX8`~KZ)|4)0RXiP00Aj@X8{2Lv<)bHXMq3#WrAk`00DN2X8`~KZ;)pJ00U%WZBAzaa%TaSX8`~Kbev}a00DBUX8`~KWw2)f00DEhX8`~KZoFp!0RXoR00Ak;X8{2LwhbuEXMq3#WzuH>00DE_X8`~KVc=&000DC5X8`~LX=TD^0qkc100DFIX8`~KVf<$S0RYtv00AioXaNBM)D0*MXn_C$auR3(00ChdXaN8LWgut)0RYzx00Aj1XaNBM)(t2yXn_C$cQ$AN00Ct_XaN8LX+&rN00DMNXaN8LbWmsk00DDWXaN8LZd_;q00L}pCTIa-XaNEM00Aj-XaNEM=MDD_00Aj}XaNEN<_-1@D1>N%0s`a>^bIIIcxZu&XaNEM=?(b}00AkYXaNEN=neP{D5z+G00BL&XaNEM>ka!200Ak!XaNEN>J9o0D8y)i0s!p|{S5#CDb#2I0s-s|{0%7DXn_C$KHz8p0s!v~{|x{EDe!0k0s-y~{tYPhXn_C$EBt5y00liEDlIFNXaTrr0m^6r>SzH5X#oHMatvt!00D0zX#oHMbSP;700ChxX#oHMax`fH00Ct>X#oHMa6oAR01ahqVrF4;Yj$a5Xk%|&V*!?90mfqi@M8fOWC0Ro0ZwHBxMcyZW&s#y0Rm_NXlMaOX#oHMI!tK+0RaFGI)Z6|00DG}X#oHMX^?3F00Ci^X#oHMa-3-a00DHOX#oHMd8lat00DBYX#oHMVYF!h00C~gX#oHMZ@_5*00C*nX#oHMbj)c100CptX#oHMY1nB20RS!!00DI5X#oHMW9VrC00Cw0X#oHMZ1iaX00CzDX#oHMWdLdc0RZz500AisY5@WP?hx`2C=hCa00D0nY5@QNbRcR000C|$Y5@TN^$-97DKcsS0s-$3^bjaEYJmU&Z9HlL00D1CY5@QNa!hIg0RZt300AjjY5@TO@DM0mYJmU&bYf}&00C)gY5@QNVQ^{z00DA#Y5@QNbbM+700C}-Y5@QNZ-{CE00C)^Y5@QNbChZU00DBEY5@QNWuR&S00DNUY5@QNZmenn00D2ZY5@QNW4LMo00C#dY5@QNZp3N<00C*rY5@QNa?ol400DH?Y5@QPX=ZaQY5`Je0o-Z<00BDUY5@TO_7FPoYJmU&boOci00C+KY5@QNVFYUd00D9eYXJZObP#I+00C|mYXJZOZyaj@00C(tYXJZOb0}*800D9?YXJZOWi)F600DM7YXJZOZa`}R00D1CYXJZOV@zuS00C!GYXJZOZdhvp00C)UYXJZOa%5`(00DGrYXJcOY7qbdDRyfC0Rd?dD0*vw00DG>YXJZOX^3k900Ci+YXJZOa+GTU0RU_f00AkWYXJcQYY}uPnri{1Yk>d(bE<0r00DHiYXJZOX}oIz00DBsYXJZOWyos*00C&uYXJZOZq#c50RV0h00AlBYXJcPZ4oHsYk>d(W$J4I00DFIYXJZOVfbqS0RV6j00AikYyklQZxJX6Y=Hm)Z4PV!00D0nYykiPavW>{00U`aX4-23{%ZjuYykiPIw))b0ReFlIyP*900DG7YykiPX+&%R00Ci2YykiPa!_mm00DGXYykiPb6jiz00DGjYykiPX=rQ#00DAtYykiPWpr!-00C%vYykiPZh&k70RZ3;00DB0YyklP`4IpCDVA&j0Rs3DWhjtr0h(-q00DHMYykiPbF6Fu0RRsY00AkuYyklQ4iYH5Y=Hm)XTod&00C~wYykiPY0zu|00DB=YykiPblhwK00DF2YykiQWpA=<0qAT20RZ6<00DCNYykiPW&CUb0Ra0E00AioZ2k;V@00AimZUF)T>JjJ>C=70a00DFoZUF!RZX9j_00ChlZUF!RX((<100D9?ZUF!RVKi<500DM7ZUF!RXh3cO00DGHZUF!RX-sYb0RZh000AjjZUF%S>=7tjZh-&+b7F1*00C}lZUF!RX>e`<00CikZUF!RbbM|B00C}-ZUF!RZ-{OI0s!$5_YnXADU@yj0s-(5_7NzWZh-&+bf9hl00C~QZUF!RVX$ri00C*XZUF!Ra=dN<00CjbZUF%R^AP|6Db8*I0Ri$6DAI0$00C~;ZUF!RY2a=F00C#_ZUF!RW$bPN0Ra6G00AlZZUF%S{1GVpZh-&+Wdd&j00C_ZZvg=S{}BKIDHd-50RjFIC>n2p00DF$Zvg-ScqnfH00LoU5N`o4Zvg@T0TKfe00AjJZvg@U01^TcC`50800DAJZvg-SZ&Ysq00DGbZvg-SVPJ0o00DAlZvg-SWo&N&00DGzZvg=S1rh)ODSmGO0RRUQ00Ak8Zvg=T1`;TYZ-D^<1QIAcf^UJ6Zvg=S2@(JSDW-1$0RadSD5`IP0RRgU00AkuZvg=T3KA&1Z-D>-KEiJS0RRmW00Ak`Zvg=T3=$~RZ-D>-E81@X00ccMEi0OD0kCfY%5MSUZvg-Sa_DaX00D3MZvg-SbO3Mx00ChJZ~*`Tatv?*00CtZZ~*`Ta2Rj_0RRya00Ai^Z~*}U5E3XTaDe~;XD)C700C|`Z~*`TX*_TN00DABZ~*`TbVzUk00DDOZ~*`TZB%dp00D1WZ~*`Ta$s-)01R|Z~*`TI&5$O0Ra>eI-YQW00DHQZ~*`TX{>Mo00CjLZ~*`Ta=35-00DHqZ~*`TZNzW^00DK%Z~*`TZqRT601IYgZFFI7WO8$9WpGCU{!am*Q~@qq0fu1#x?%y|X#oam0dQ*phHL@WZ~*`TI^1vp0Ri{{Itp=t00C|gaRC4UZy0d_00C(paRC4UbR=;B00CnvaRC4UWiW9800C?^aRC4UW;}5L00Ct}aRC7U`2YX`bWU*r00CuEaRC4Ub69Z!00CxRaRC4UW@K>z00D1maRC4UI&g6T0Rj2|I(Bh^00DG-aRC4UZiI0G00Cu+aRC4Uc93xa00Cu|aRC4UY@Bfc00C^GaRC4UZ>Vtr00DBYaRC4UW3+Jr0RZg=00C~maRC4UZ^Ur{00DH$aRC4UbkK1D00DK@aRC7U?gjt>Wa4oF00Cv@aRC4UbL?>e00DFIaRC4UW%zLc00DCTaRC4VVsPAX0R(aZ00BA*asdGW?*=*)a)AH=bQ*F200C|yasdDVWhin100DL`asdDVWi)aD00C|~asdDVZ$NSZ00DGHasdDVbWCyq00DJUasdGVRSp0FZeDT$00D1easdDVX=ri*00DGvasdDVX>@V{00DD)asdDVZ-8$y00DNsasdDVZ^Uu|00VPkZMty*SaJc%asdDVWzcc~00DE}asdGV!4CidbLw&d00DCDasdDVW%P0Z00C+GasdDVW&m>m00C(Ra{&MWWDIiw00D0ja{&MWZ5VR_00BB4a{&PX!VfwmbAbQ>bSiTJ00C|?a{&MWWjJ#I00DMBa{&MWWkhoU00DDKa{&MWa!_*t00CuIa{&MWX)0x00CpNa{&MWI=FKI0Rh1QI=*v(00DHwa{&MWZp?E500Cvva{&MWcGz000DXYa{&MWWdL*m0RW^100CqSbO8VXWe{`$00DCrbO8VXa~yO500CtpbO8VXawv2G00L`p26O=~bO8VXIy7_v0Rg23IzDuP00DGFbO8VXZcKCm00CuEbO8VXc35-)00CuQbO8VXd1Q0}00CucbO8YXj|%_+WOj4`00CiobO8VXaDa3H00Cu&bO8VXZH#mQ00Ci=bO8YXkP83-WS(>Z00Cv9bO8VXbf|Oz00CpJbO8VXWwdkw00C~gbO8VXZoqT_00D2tbO8VYXJeRj0nBs(00BDEbO8YYkqbK9bb$Z?bmDXY00D05bO8VXW$<(X00DOPbO8VXW&Csj00C|SbpZeYZwPe(00C(ZbpZeYbQE;~00CnfbpZeYWgv9{00C|$bpZeYZY*^H00D0@bpZhYfe-)zb3Sze00C}7bpZeYZ%B0k00DGPbpZeYbX0W#00DJcbpZhYf)D@!b7pk`0RV;&00Aj*bpZhZg%Buob%6i@b9!|F00L!cYIOmEbpZeYc!+fY0RV&$00AkObpZhZgAgd3b%6i@WTJHe00CvHbpZeYbFg&*00DEhbpZeYWxRC(00DBsbpZeaVqtJ#bpeuf0myX$00BDAbpZhZhY&j4b%6i@W#V-K00DIBbpZeYVeoYU00DINbpZeZV{#Z800C^yb^!naa%`q{0n~N@0RY|(00C{}b^!nZVd!=N00Cw0b^!nZV)S+a0RZ0)00DCVcL4waa|Cw*00D0bcL4waau9a`0RZ3*00CqicL4waZXkC700ChpcL4za;SK-+WiodG00DY7cL4waX*_oU00DDCcL4waWk`1c00DANcL4wacT{%)0RZ9-00CuScL4wadSrJ200C)gcL4wab8vS700CuocL4waa(s6I0RZC;00Cu)cL4wadW?4g00C)|cL4wabC`Dl00Cv5cL4waa-??w00CvHcL4wabFg;-0RZF<00CvZcL4wadcb!900C*ncL4wabIf-E00CvvcL4waa@cnP00DR2cL4wabL4jc0RZL>00Ct1cL4waW%PFe00DRUcL4waZvc1!00C?UcmV(bYz%k-00ChVcmV(bbQpL600eV)Wp9Fa0k(Gm>URMicmV(gVQFJ%Wp3Jb0s3|U7Iy(GcL7>=0VH?<00BBScmV+c=MFkhc!2-`WL9_q00DAdcmV(bVPtp#00CrbcmV(bZg6-300CikcmV(bbbNRL00DD?cmV(bI*51y0RiX^I*xdO00DB8cmV(bZ=84m00DENcmV(ba;SI#00DKbcmV+b_z(aADY|$80Ri_AD86`s00DHwcmV(bZp?TA00CvvcmV(bcG!3U00Cv*cmV(bXykYS00DFAcmV+b`VasCDfV~)0RSQq00Aigc>w_dArUA9d4T}}`4A{``gnl~c>w?cbP{<100C|uc>w?cWh8k400DL?c>w?cWiWXG00C?^c>w?cY&>}Z0stNn91#EkDM)z%0s$Qn8xbf@d4T`{WK?+p00CuQc>w?cb7Xk|00DDqc>w?cWpH@`00VVza`1QoLU{ppc>w_c{15;EDT;Xk0Rj6ED2{o700DE9c>w?ca-4Yq00Cv9c>w?cW~g}q00CyMc>w?cb+mZ_00CmUc>w?caKL#100Cjfc>w_c01*HIDbjfX0RjIIDAsv_00Cv(c>w?cdgOTl0RRRO00AlRc>w_d1raFpd4T`{W%_vm00DCXdI10dZwPt;00C?cdI10dV-$J;00CqgdI10dY#@3800DI-dI10dZ!CHN0RRvY00AjDdI13e4-qIldVv4|ZbEti00D1GdI10dX;69r00DGXdI10dXywd0hoFL0Ra9G00AkmdI13e{SYX$dVv4|Wx9F+00CpddI10dX~=p300DN+dI10dWz>2B00Cs$dI10da^QLa00Cv@dI10dWbAqY00D0DdI10dW%zml0RRFK00AikdjSCf0TCz&dw~D}We$4*00DXydjS9eX&ie200DC%djS9eawvNN00Ct#djS9eW;A;N00Cw?djS9ebwGOo00Ck~djS9eWlVbk00C`MdjS9eVOV9E700D2xdjS9ebI^MM00DB=djS9eb=-Ra00Cp-djS9eW$1eW00DIFdjS9eVf1?e00CwCdjSCe6cGRcDF%E20Ra;cC<=Um00D9kd;tIfZy0<500DCzd;tIfawL2K0st5h77+jeDKLBi0s$8h6%i;le1QM~WITKU00DAFd;tIfVN84h00D1Od;tIfVpx0u00D4bd;tIfX=Ho>00eJxb!@VG0RVgfDtrNId;tLf2oV4QDS~_f0RaaQD29B200Cu;d;tIfZIpZg00C*5d;tOg3=s+u00Akcd;tOh3lRwsD6D*e00CvPd;tIfbi8~400Cjbd;tIfbjW-G00DE(d;tIfWz>8D00DE_d;tLf8W8{iDdv0u0Rb5iDC&HH00DFGd;tIfa`=1!00CwGd;tIfX#{-%00CwSeE|RgX%Kw@00MPn;CulVeE|RgZybFA0RRpW00Aj1eE|Uh4G}0XeSrW0ZZ>@Z00D14eE|RgX+(Vi00DGLeE|RgX;6Iu00DDWeE|RgZ(Mx=00D4feE|RgWoUf?00DDueE|Rgb##3J00D1$eE|RgZGe3N00DG{eE|UgAQ1ooDUy8w0RbNoD3*PJ00Cv3eE|RgbfkR&00CjDeE|Rgbg+E^00DEheE|RgWW0R=00CjbeE|RgaL9cD00CvreE|RgZPa}M00L!UjC}#xeE|RnaC35IV{~n2e0c$$dIA1=0c3jtaC`xvd;unX0pNWB00BDceE|UhBM~|bet`f1cM^U900D0regOahWFUS400C|$egOahX)JyL00DP0egOahWjKBT00DD8egOahVMKlb00(V!YiDv}Vt#W0_HzMnbO9=M0g!e9w0HqZegOahI#7NA0Rh4YI&OY}00D1wegOdh{{R31Zi0RR00D1?egOahX^egW00DH8egOahW0-yc00C~EegOdh00962WvYGw00C^SegOaib!nu20knPr0RRC300CvhegOahZpeNC00C*vegOdh0|5X5DcXJk0RaL5DBga700C#@egOahZtQ*m00C+8egOaha`=7$00DIVegOajW^8l1egV{e0R(>m00BA*e*pmj1OYl2e}Mo2ZXSOD00D0%e*pjiX)J#M00DF|e*pjiVK{#Q0RSxn00AjPe*pmjECVP=e}Mo2a!!8%00CuIe*ppjH3KsP00Ajte*ppkGy^gNC}@9y00Cuge*pjiY00DGvfB^sjb98_K00CusfB^sjZGeCQ00C)+fB^vj=?VY=DUyHz0RiX=D3*YM00DQLfB^sjZ=`?$0RZa?00AkmfB^vk>Ix{dfPnx3XS#p^00C~ofB^sjX~=*900DB&fB^sjbku+W00VSxbBuris(=C7fB^sjI^ci-0Rij^I_`jh00D6HfB^sjZTx@%00ChFfdK#kbO?a~00DCjfdK#kWfXw{00C_pfdK#kX&`|C0RV;z00C?)fdK#kWiWvO00DM3fdK&khzkG#ZbE?p00D1CfdK#kX-t6u00DGTfdK#kVOW6y00CoOfdK#lWp6xz0c3#z0RV>!00D4xfdK#kZFqqJ00CisfdK#kbcBHc00DD~fdK#kWsrdZ00C{5fdK#kX`F!p0RV{$00CvFfdK#kXRLt%00CjLfdK#kbGU&400DEpfdK#kWyFC20RV~%00C~$fdK#kVbp;E00D5?fdK#nY;mJOes3f`I@5ayo(m00Ct}f&l;lXGnqp00C!Cf&l;lZ&ZQ-0RX5100CrRf&l>lsR952XljB100DGvf&l;lVRV8400L=nWP$;Df&l;lI)H)!0RgH4I*NjU00Cr>f&l>l5CZ@KWS)Wn00DBMf&l;lVW@%u00DKbf&l>lcLM+cDY}9I0ReUcD87P$00C~qf&l;lY0QEF00C#xf&l;lW!QoN0RVXe00AlFf&l>mcmpWtf`I@5WbT3i00D0Hf&l>ldjkLgDFTB50ReggC00DSrgaH5nVQho}00C`sgaH5nba;dT00L=cDue-kgaH8n0S^EHDUO5z0RaFHD3XMM00DBCgaH5nVW5No00CvDgaH5nY^;O<0RROL00AkugaH8o1P>^@gn5l900CighXDWsbYXWMhXGWF0eFW200BCFhXDZrO%FPZhk*bAY?6lo00D2BhXDWqZ=i<(00D5OhXDWqWUPk)00CjLhXDWqWw?g{00DBohXDit#SzC5%Mr;D00Ak=hXDiu#1Y03$`QyBDAb3600C>-hXDWqbLfWw00Cj{hXDcr&k@ZL00AlbhXDcs&JoNJC;*6o00BJ)hyefrauA3C00D0nhyefrbR38Q00Chlhyefrawv!a00Ct#hyefra5RVk0RYhv00AjLhyeis&=Dv^h=BkBXiA6y00DDShyefrX;_E>00C}ZhyefrX=I220RYnx00Aj*hyeis(h(?hh=BkBWO|4J00DA>hyefrVTgzU00Co;hyefrbCiey00C*5hyeir)e!&zDW-@40RhwzD5{8o00CvNhyefrZn%g600D2lhyefrWW#<30Xm2QYKQ@#hyl=u0RV{s00BA%i2(rt*bzD)iGctCYbJ>S00DC@i2(otXko;M0W^sL00MAy)`kH(i2(osIz)*90Rfc-I!=j!00CrFi2(osVO)s;00CuUi2(osa%hPG00L!bfQ12Wi2(rs@&Nz=DSn9o0Riy=D1wQB00DA{i2(osWsr#h00DZIi2(osX`G1x00C^Gi2(osVW^1#00C*Pi2(osaH00DW@i2(osa@dIh00Cj%i2(osZsdsp00C+0i2(rs^Z@_?DfWp00Ri&?DEf(k00CtHiU9xta|nt700D0fiU9xta1@FG00C_piU9xtZy<^R00CnriU9xtWh{yT00LrU@QDF3iU9xtIyi~}0Ri;^Izozp00DAHiU9xtWl)L%00DYdiU9xtX$AS00CvriU9xtbJU6f00DX0iU9xta^Q*q00CjtM00DW9iva)ua+r$&00Cj1iva)uZlsF=00C*Liva-u)dBzkDYlCN0RhwkD7uS*00DHsiva)uZ^(-Q00D2#iva-u*8%_mDcXwx0Rh$mDBg>K00DI5iva)uZtRNz00DLKiva)uZ}^J=0RY(o00Aiki~#`w*a9dBjDY|FbPkLG00C|mi~#@vbsUTV00D0zi~#@vZ77TZ00C|;i~#`v+X4UqDLRY+0Rh?qC_apV00Cq~i~#@vZcK~;00C)Ii~#`v-2wmsDPD{L0Rh|sC}NC(00Cuai~#@vba0FT00Ciki~#@vWqgbQ0RZCy00Ak8i~#`w;sPj)jDY|Fd6J9)00D5Ci~#@wa&Ll+0icWl0RZ0u00Akmi~#`w-U2AJjDY|FdAf`N00D2pi~#@va>$GU00DH)i~#@vbJUCh00Cv%i~#`v;Q{~wDdvm;0Ri9wDC&%X00D0Bi~#@vW%!H%00D6Ri~#@#a&2{HV`OjCivj+N0W^#OSd0Oti~-<`0R)W!00BA*jR64x00CvhjR61wbj*zb00C*zjR61wa@dUl0RVat00AlFjR64xc@Ze+je!6GZ0?N#00C_FjR61wW&Di+0RVgv00AiojsXDydl4uMj)4FHYZ8tD00CthjsXAxWgw0L0RVmx00Aj1jsXDyeGw=yj)4FHW;Tui00D14jsXDxfDr%zDN2q30RevzC{B)n00C=MjsXAxWn7K{00CuUjsXA%W^#9Qb7gRljRCZc0p5)P0*(PDjsZlD0cef^00BB~jsXDyfe|{4j)4FHZIX@w00Ci|jsXAxWuT4$00DBQjsXAyd2~pP0j!Pz0RWW`00CvZjsXAxbij@Q00C*njsXAxa?Fka0RfW_chZgl00Cs!jsXAxVc?Dd00Cv@jsXDxln(#_W%7;z00DINjsXAxY5a}>00D9Wj{yJza(C>G0SJ!)00BA900AjDj{yM!q7Q8-GLHc~kAVOIZbFX%00CuAj{yJya8!>00RWc|00CuSj{yJyY-EoC00Crbj{yJyZg7tQ00Cikj{yMynGXN~DT0py0Rfl~D29)L00DH2j{yJyZj_G!00DKHj{yJyZ=jC>0RWp100Akij{yMznhz+jkAVOIbheKH00C~kj{yJyb;OSW00D2xj{yJyZP1Sa00C~+j{yMyoeuy3DdLX-0Rfy3DCUoW00Cs|j{yJyZuE}<00C+Gj{yMypAP^5DF%=M0Rf&5C<>5)00CtXkO2SzbQq8U00ChhkO2SzWh9UR0RXcP00Aj5kO2V!vJWUUkbwXJWIB)m00C@5kO2SzX-JR(00MGoDv$wAkO2Vzp$`B7DPE8P0Rf;7C}NO-00DVukO2SzZ*Y(S00DA#kO2SzbbOEj00DD?kO2VzsSf}FDUOf<0RgBFD3XwY00DWJkO2Sza-fg_00D2NkO2SzbgYm800CpNkO2SzWw?+500DBokO2S!Wod|z0mP620RW{B00Ak~kO2V!qz@?AkbwXJW!{hh00C|0kO2SzVeF6r0RX2D00AlZkO2V!rVl9mkbwXJXabP|0RXQL00AiwkpTe#t`8^_k%0gKbQ+NX00C|ykpTb!WhjvW00MM!3XuUWkpTb!VKk8e0RXEH00AjPkpTe#st+hgk%0gKWloU+00DMZkpTb!X(eS0ep`ErjG&Kj{yLX0aTCy%8&u_kO4lC0d$c8jFADtkpTb!I>?a$0RprSb2_q)0s4`F00CtHk^uk#Yz&eC00C(dk^un#`vU+0DISsm0Rj30C?b-900D9+k^uk#WiXNf00DY7k^uk#X*`kv00C@5k^uk#VMvkz00C)Ek^uk#a#WH500CuMk^uk#b6}DI00CuYk^uk#WNeZF00C}tk^uk#Z+Mac00DD;k^un#{R032DT5}L00C@rlK}t$VR(}P00C)!lK}t$a)grs00Cu+lK}t$bC8n(00C~6lK}t$Z=90>00DENlK}w$$qWDiDXx00C)QlmP$%a$uAJ00CuYlmP$&WOGQ90c?~300C}tlmP$%Z+w&i00DD?lmP(%oe2N|DUOr@0Rfx|D3X+c00Cu~lmP$%cA%6200C*HlmP$%Xsnb000CpNlmP$%a=4TM00CjXlmP$%WWq<&VGNZ400CtZl>q?&tqA}DDIS#p0RgNDC?b`C00Cqul>q<&Y%rAp00C(>l>q<(a%dQp0X&rf0RW*100AjXl>q?(pb02Ym4N^Oc~+GH00D1al>q<&a%7bO00DGrl>q<&b8wXb0RW{500Aj{l>q?(qzNd1m4N^Od4`n%00DB2l>q<&Zq<&W1y7*00CvDl>q<&a;%jB0RTY^00CvVl>q<&ZM>BM00Cjbl>q?&LJR-_dCrvq00DB+l>q<&Z`hRq00DH~l>q<&W8{?q00Cv{l>q<&a`2S_00C+Cl>q<&Wc-x@00DCXmH`0(Lks``bPkpQ00C|imH_|(Wf+zL00D9ymH_|(VI-CT0RTh{00Cz(mH_|(ZZwtw00C(_mH_|(Y(SO)0RTq~00Cu8mH_|)VtPiF0Z^6!00C)MmH`0(MGOD|WM-BD00C@jmH_|(X>gVS00C%rmH`0(MhpM}VS<(c00DG{mH_|(VT_gm00wSpaC2j1$dv&ImH{f30brH^e3k){mH_|(I+&IL0RR{h00DHkmH_|(ZoHNO00DKvmH_|(Z^)Jb0Rl)2I%BeyfzFlz0RR^g00DF0mH_|(W#pCt00Mbw)RqD2mH_|(a`2V`00DIRmH_|(ZUC1700CtNmjM6)It-Tq0Rb5jIue(G00ChbmjM6)bRd@j00U)dVRn@PvXucQmjM9)qX_^3DLR({0Rf^3C_a~g00Cu0mjM6)ZA_N|00CiAmjM9)rwIT7DPETW0Rg57C}Nj^00DVumjM6)Y;czW00C}xmjM6)Z+w>l00CrzmjM9)u?YYHDUO!`0RgZHD3X_f00Ci`mjM6)bfA|300Cj9mjM6)WUQ9~00DBcmjM6)Ww@6C00DHqmjM6)bHtYc00C*rmjM6*VP}Y!0nnEL00CvzmjM9)sR;l9Ddv{}0RgB9DC(Di00DIHmjM6)Zupl000CwGmjM6)as-$G00ChNm;nI*s|f%BDHfOk0RgHBC>of700Czpm;nF*ZYY=m00C((m;nF*Y&4hw00Ck;m;nF*X+W3(0RXQF00AjXm;nI+t_dhmn1KKRZdRB900CuQm;nF*aAcSP00?DcWNvbBb8qgH0Ya4lESCXTmjU3H0T7r0MwkI=m;nF*I&hc)0RgfJI+B=y00Cu~m;nF*cA%I600C*Hm;nF*Xsnn400CpNm;nF*a=4fQ00CjXm;nF*WW<;O00Cvnm;nF*WYCxa00Csym;nF*W!#tn00Cm+m;nF*ZRnT*0RSfo00AlVm;nI+CJHF{n1KKRa{ibB00CtNnE?O+dJLHX00C(dnE?O+Y#5mV00ChhnE?O+X(X8e00D9;nE?O+WiXim00DD0nE?O+XFQn!00DJEnE?R+D+&MsDNdOI0RbusC{me$00CuKnE?O+b6}YP00D1inE?O+aBP_Y00C`snE?O+Z+Mvj00LrTNSOhCnE?O+WrUdl0RSlq00AkKnE?R-C<-W;nSlTSd7ha800DHSnE?O+bgY>H00CvPnE?O+a=4iR00Lxij+p_znE?O+I>ea)0Rb!uI?kDa00DB;nE?O+W!#wo00Da9nE?O+Y3P{&00C_7nE?O+Vf2{+00C+GnE?O+asZkE00CtNngIX-a}1gR00CzbngIX-br_lf0su-AND}}7DI}T!0|7r1NfSpCC@PwP00C<-ngIX-Z#?00DAPn*jg;Wmua500DYln*jg;X=IxL00C@jn*jg;VQ`xP00C)sn*jg;a(tTs00Cu!n*jgj186zlnp4Pn}GlUYpR<800D2dn*jg;Z@ilU0RW8+00C>rn*jg;Z_Jwk00D2(n*jg;XxN(p00Cs)n*jg;W#pRy00D67n*jg;dGMP70RWE;00Aldn*jj}00DGboB;pOc5vyoq+%WWfGkM00DLyodEy=X&{{e00C$wodEy=V=SEk00D9`odEy=VK|)u00Cq^odEy=azvd000Ci2odEy=WKf*}00C}RodEy=VO*U70RUYQ00AjzodE#>ToEX2oq+%WXL6kZ00C}#odEy=X@H#p00C@P!TBfoq+%WW%``~00DFYo&f*>VF;c900CtVo&f;>Ul9NSDH@&u0RdhSC?1}H00Cqqo&f*>Y%HDu00C(-o&f*?a%dEu0XUuk0RU4G00AjTo&f;?QV}Rjo`C=Xc~YJM00D1Wo&f*>a$ueT00DGno&f*>b8Mag0RUGK00Aj@o&f;?RuL$Co`C=Xd4iq+00DA}o&f*>Z;+k=00DHCo&f*>W1OA=00Cv9o&f*>a;TmG00L!ca-IRMo&f;>RS^IIDZZWo0RdDID8inB00Cvlo&f*>ZP1SrGsMDdL_10RdPMDCVAl00DXIo&f*>Z1kQ100D0Lo&f*>ZvdYG00CqMp8)^?VGN%E00CtZp8){?TM+;ODIT8z0RdVOC?cPM00DF;p8)^?ZZMw#00Ct-p8)^?ay*{_00Ch_p8){?VG#fUDNdgO0RdnUC{mw+00C}Tp8)^?WniBH00D4jp8)^}b7^B_ZgOyMn4JOYodG_c0kob0+@1j#p8-gp0c@WE00BC3p8){@Vi7u&pMd}YWtyJ>00DNQp8)^?X{et800C&Op8)^?W3-*T0RaULC|00>00DVipaB2@Z)BhW00DAppaB2@ba0>n00DD$paB5@3Jw4PDT1H@0RagPD2AYc00DW7paB2@a+II}00D2BpaB2@bfBOC00CpBpaB2@Wvrk900DBcpaB2^Wodk%0l1(60RRXN00Ak;paB5^2M#FApn(7ZWzwJl00C{g$d00C@vp#cB^Vtk|V?wA3Xn*s2j0sNr>00BAzq5%N`1pzuBqJaPbVJ4yh00DF^q5%K_VKkxv0RR&L00AjLq5%N`5&q5%K_b(Eq300LxUYN7#}q5%K_WuT$~00DHWq5%K_VX&eB00CvTq5%K_a=fAe0RR^P00Ak;q5%N`76B;CqJaPbbJC�Cv%q5%K_W8k6z00C*{q5%K_cI=`700Cw4q5%K_WcZ>100CwGq5%K_bOfUT00ChNqX7T`auA~d00CtdqX7T`Z5*Qk00DI(qX7T`ZYZMx00LuW!lD5#qX7T`Iy9pJ0Rb2RIzFR;00DGFqX7T`cub=K00CuEqX7T`bXcPS00C}ZqX7T`Z)BqZ00CoaqX7T`Z*Zdl00C)sqX7T`WPGCm00DJ^qX7T`VThvv00C)^qX7T`Zj_?|00C*5qX7W`_67g}DW;ErF00CtjqyYc{Vh>00BCxqyYf|{RTR;q=5hdbh@Mg00DTyqyYc{Wyquf00DH)qyYc{Zq%d!00D2>qyYc{W8kC#00D32qyYc{Y3!r{00Ct3qyYc{b@-$K0RW8(00Aikr2zo}j0z|SrGWqeat@^d00Ctdr2zl|W*nsf00Cwqr2zl|btt6)0RWE*00Aj9r2zo}jtVF^rGWqeZa$>}00D1Cr2zl|X-uU700DGTr2zl|X;`HJ00DDer2zo|l?ng>DQcww0RfZ>C~l>J00C%pr2zl|V|=9n00DG@r2zl}Z)s$u0f?mm0RWK-00AkOr2zo}kP0ZArGWqed7`BO00DHWr2zl|X|SaM00CpRr2zl|Z@i@e00C^mr2zl|Wyqxg0RWQ<00Ak~r2zo}k_sr;rGWqeZr-H<00C*{r2zl|VeF*=0RWc@00AlZr2zo}mI^5RrGWqeX9A`H00C|arU3u}X%MCX00D3orU3u}Zycrp00D0zrU3x}nF;^_DK4e~0Rfl_C^Dvj00Ct=00D09rU3u~VQH+U0raK;0RW#000AikrvU)~p$Y&2DGsLr0Rf;2C=#cE00C|orvU%~Zy=`u00C(xrvU%~bS$R<00Cn%rvU%~WjLn+00DA7rvU%~X+)<10Ro;1C}aqyfl8+V00CuCrvU%~Zd|7U00D1ervU&6VsLh6Y;tX5E~NpEr2)>R0rI5*D5e2qrUCk<0cfWI00DGvrvU%~Wss)<0RW>400AkSrvU*0q6#RWr-1+gd8VfU00CjHrvU%~Y_z8V00MJxmZt%_rvU%~I>4s^0Rf~6I?AVk00CvtrvU%~W7www00DB|rvU%~b>yc300D36rvU)~{R;pADfXuU0Rj9ADEg;?00CtHr~v>0V+g1L00C(Zr~v>0b`+=q00Cthr~v>0WFV*k00D0%r~v>0X)LG#00Cq&r~v>0bvUR20RaCC00AjPr~v^1{tGBbsDS_hWlpF800CoGr~v>0a$KkZ00DJkr~v>0Z)m6i00DDur~v>0Wpt0VSuOs00Cu&r~v>0a*U_}0RRCE00AkOr~v^101POcsDS_ha-ygK00CvHr~v>0Zm_5U00CvTr~v>0biAkm00DEtr~v>0X~?Jn00UuTY(A&~lBfaBr~v>0I@G8E0RaLGI^w8-00Cv_r~v>0WALZ}00C+Cr~v>0cKoOT00CtJsQ~~1WC*DN00D0fsQ~~1X%wje00CqgsQ~~1bs(t$0RT4*00Aj1sR022HVr5+seu3iXf~+<00DG9sQ~~1XGEz100C}FsQ~~1Wl*UB00C@PsQ~~1I$Ws%0RcD-I%27T00DAnsQ~~1WpJqh00CxpsQ~~1W_+mu00DJ^sQ~~3b75lervWCZ0f?yq00BCVsR022HwZeMseu3iY@(?F00D5SsQ~~1ZLp~U00V7dX`rJ4{-go6sQ~~1I=ra?0RhbqI?Abm00C^!sR021*98CpdETi30RY+s00AlJsR022*##)ssR82V??R}00D1GssRB2+ywvuDORch0Rh_uC|at400DDgssR82b7-mo00CugssR82a&)Qz00CrrssR82WPqvx00Ci!ssRB2-UR>wDUzxI0Ri0wD3+>$00C#5ssR82ZltOK00C*LssR82aTGtAPLkZ4#>i00D0vs{sH3awMw(00m)eespFSssT`{0gS2v$f^M^0s*%My9OwJtAPLkbcCw`00Cu=s{sH3Ym}=200Co~s{sH3Z=kCI00DERs{sH3aIC8V0RX}V00Akus{sK4!3HS2tAPLkWWuWf00C~ws{sH3Y0#?y00Cmws{sH4WNxyn0o0RX-R00Aj9tN{T5y#^>atbqUlJwB`f00DAFtN{Q4Z%nKK00DGTtN{Q4VOXpI00DAdtN{Q4Wn`=Y00D4ntN{T4zy<&TDR!&@0Rg`TD0-}c00CrxtN{Q4ZiuV_00C)^tN{T4#0CHXDVnSS0Rh7XD4wi=00CsAtN{T4$OZrbDYC2q0RhJbD7LJD00C#btN{Q4Zp5qs00C*rtN{Q4YtXC#00CpxtN{Q4Z``Z_00C^`tN{Q4V(6>^00M4wtgHdt^oi6bL_4G00D3Et^oi6Z1}DL0RT}600AikuK@u8PzfjquYmvoWDc(Z00C(huK@r7Y#grv00ChluK@u7Qwab8DK4)80Rd78C^D~s00DA1uK@r7Wk9b100C}BuK@r7ZcMKM0RUAA00AjjuK@u8R0$|tuYmvoXJW4b00C}luK@r7X>hLr00C=uuK@r7V|=dx00D1;uK@r7Y>2M`00Cl-uK@r7bd;|F00Cv1uK@rFbbfDaVPke_bKb21GOhu1t^uU30o1Mm{;mNiuK`l80idq|00BCtuK@u8RtY-HuYmvoa?-B>00Cv%uK@r7Zs4y000Cv@uK@r7bnLGI00DFIuK@r7Y51=J0|2=Wy$-()00AikumJ-BxDLDyz78l1uz>&pZ4$5n00ChhumJ!8WhAfx00D9;umJ!8bTF_100DD0umJ!8a6GU90RYhs00AjTumJ%9&<-d}uz>&pY*MfR00C@TumJ!9V`W0H0bsBJ0RX!W00Aj*umJ%9x(+CGuz>&pZF;Z)00CiwumJ!8Wr(l=00DB2umJ!8bd<0G00DEFumJ!8aG&pJ;Ja700DB!umJ!8Z_uy-00DH?umJ!8Vcf6*00DC1umJ!8W$3U000D6BumJ%8!wvueDf+Mh0Rh4eDE_d400DFau>k-9V+^qY00CtZu>k-9ZWyrv00C|uu>k-9ZzQn+0RY7g00Aj5u>k=A#11Glv4H>qayqdA00Ct}u>k-9Zb-2K00C}Ju>k=9#|{7iDO#}s0RhGiC|k-9V{EYj00Cuku>k-9Zg{Z)00C}(u>k-9Z-lV{00Co)u>k-9bC9tC00C*1u>k=9$qoPkDWb6f0RhMkD5kN200CsIu>k-9X|%Bc00C^eu>k-9VZgBg0RYPm00Ak?u>k=A$_^;dv4H>qXV$R+00C~^u>k-9Y2>j100C?2u>k-9WAL#700D3Iu>k-9Z2YkS00CkGvH<}A*A4&yDGss$0Rh$yC=#-P00CPvH<`AWwf#Z00CvXvH<`LbbfDRX=HYDa(88LX0QRWumSY20V=TpRIve^u>r=h0Wh)wRI&knvH_g30l=~W00BD2vH<}B*bX}QvVi~rZT_+W00ChJvjG4BWel?c00D9mvjG4BbQrS%00L}t{;vTZvjG4Ba3r$<00CnzvjG4DVRdwJs{xFy0W`A#00BBWvjG4BI!LpD00DGPvjG4BWmK~P010JnXL4zDWMOWg?Etz40Y*XrNO1vtegSle0Xm`q*r@?pvjG4BI$*N_0RgZJI)<}>00Cu;vjG4Ca&45e0bsrW00VDzVVbi6CcXfOz5oCXWn*w;X?1dRb8li{cN&KPq_Y9Wz5x8b04%=%y1xJf!2sC704l=(Si}I7!~o{R0BFSk00BC(vjG7B>jD4)DekiY0Rid)DDty`00CwAvjG4BV*s=P00ChJv;hGC{Q>|1DH5~+0Rj91C>FGV00D0tv;hDCWF)i!0RUnM00Ct%v;hDCV>Gk@00Ch-v;hDCazL~J0RUqN00C!Av;hDCbx^bc00ClFv;hDCWn8oY0RUtO00D1kv;hDCW^A+p00C}tv;hGCWe5NPZho`@00DA>v;hDCVTiN=0RUzQ00DB8v;hDCZ`00Cy=v;hDIbYy9FWn*tfv;ktY0eG|lj=0Rd?UU+%O400C?awE+MDWfZjm00DLywE+MDWgxWy00C?!wE+MDUo5o&00C?=wE+MFa&Kh}v;iu#0XVe*0RZg+00AjXwE+PD0|Nj7DOR-s0RaL7C|b3F00DGhwE+MDa%i;y00CugwE+MDb9A)<00DD)wE+MDVSu#(0Rrp-C|^*ufrhmK00C!=wE+MDb(pmQ0RWZ>00AkawE+PEl?f=QwSfQuXRfsY00CjPwE+MDbiB0z00CdZwE+MDWyrMw00C~!wE+MDY1Fj=00LrWp0xqmwE+MDW#F{|0RZm;00AlRwE+PE?gA+EwSfQuZ~C_*%00DD)w*deFUx2p(00DW1w*deFVT`u{00DB6w*deFa+tRP00Cj1w*deFU!=DI00CsGw*deFGO)J+00CdNw*deFWxTfm00DBsw*deFb;!2?00DH)w*deFc+|H600Cv%w*dhF?*sq=W#+d500DaHw*deFY4EoJ00DFMw*deFU;MWL00DUdxB&nGVFxB&nGWjMG200Ck?xB&qG@dN+?WlFdK00DYVxB&nGX;ioY00DDaxB&nGUtqWa00CuYxB&nGZEUy!00CigxB&qG@&o_@bbh!200C}-xB&nGb%?kD00D1~xB&nHZew`30hG7_00Cc`xB&nGbfmZe00C~QxB&nGWw5vb00C{bxB&nGWxTin00C^mxB&nGWyrVz00CdlxB&nGa@4p100Cv%xB&nGX5hF100Cy^xB&nGb?mqS00Cn1xB&nGU--BI00DIVxB&nGZUngj00ChNxd8wHbP%}#00DCrxd8wHZXCG*00MPyM7RMWxd8zH@B{z>bTYXC00C|`xd8wHbv(HN00D18xd8wHV@SCH00Cc4xd8wHY*e`c00CuMxd8wHc3`;y00CuYxd8wHY;3s!00Ccexd8wHaCo@^00C)!xd8zH^8^3^bc(qF00C}}xd8wHb(FaQ00D2Bxd8wHW1zVK00Cd7xd8wHbga1n00C~Yxd8wHWw^Nk00C{jxd8wHWyHAw00C^uxd8zH^aKC_bk?~600C~=xd8wHb>O)H00D32xd8wHW9+#B00Cd}xd8wHa`?Fc00CwGxd8wHW(2wc00CwSx&Z(Ibr8A%00L!V(76E?x&Z(IUmUst00DU>x&Z(IVJx}<00D9`x&Z(IayYsH00Ch>x&Z(IUqreA00DSPx&Z(IWl*{S00DGXx&Z(Ia$LFr00CuUx&Z(MW^`k1c4W5!;I{!NxdDW^0cg4b00Ccax&Z(Ic!atE00Ci&x&Z(IZIHSF00Cc?x&Z(IY@E6Q00C#Bx&Z(IU#PkP00CvLx&Z(Ia`D9*Zp00C#zx&Z(IZ``^80RZ^|00AlJx&Z+J_yQ>Gx`6-zZ1TDR00C+Gx&Z(IVF0@U0RZ~~00Aisy8!_K`T{5ryMX`!Wfr>u00C?sy8!?JVkEl(00Chty8!?JXfV4000Cn*y8!?JVLZD500Ct}y8!?Ja!9)Y00C}Jy8!_J{{jF3DO$S$0RRC500Ajvy8!_K00Ss!yMX`!aBjN+00C`wy8!?JX?(i@0RsL4C|_Q?fr7gM00DG}y8!?Ja+JFP00Cv1y8!?JbD+Bc0RT!000Akiy8!_KNeU>iyMX`!bhf(z00CpZy8!?JWyHGy00C^uy8!?JX3)C<00Cvzy8!?Ja@@NC00Cd(y8!?JbLhJP00DLGy8!?JZ}htX00C|Ky8!?Jc>uft00C|Wya50KZw$Nv00MJvrn>pt00Cnxya50KX*9e600DA3ya50KbU?fT00Cu2ya53KYX|@VDN?)v0RU|X00Ajnya53LYzQb|ynz4#Z)Us!00Cxhya50KZgji>0RV3Z00Ak0ya53LZU`uZynz4#XNtT500DK9ya50KVwk)E00Cv5ya53KaR>kbDXP2y0ReCbD6YJL00CvRya50KW4ycp00Cjbya50Ka>%>^00U`cbb7o2q`U#nya53MY6vJ_R=k1Kya50KZsNQF00Cj{ya50KaP+(Z0RTG+00Aigy#WCMItnNRy@3D$YYM#q00CnXy#W9LVHmvu0RTP<00Ai^y#WCMJqjo&y@3D$Y%aY400D3|y#W9LZ9KgJ0RTV>00AjTy#WCMKME*Jy@3D$Y*M`e00D4Xy#W9LZD73t00C)cy#W9LUu?Yr00Cuky#W9Lba=f100Cisy#W9LY=pf500D4{y#W9LZIHbI00Cu|y#WCLLJ9x@DWbgr0Rce@D5kxE00CvJy#W9LbhNzz00CjTy#W9LY{0z%00D5uy#W9LZOpv^00Cvvy#W9LblANC0RTh_00AlFy#WCNLkeFg-n{|ny@3D$Z0@}Q00CqAy#W9LWdObb0RTn{00Aisz5xLNMG7bozJUM%Y!z5xIMa*VzK00Cu^z5xIMbeO&Y00DTOz5xIOX>?^my#buP0i?bG0RcP;U#h+V00DHkz5xIMW5B)v00Cvjz5xIMY|Op^00Cywz5xIMW!Sy}01k9yX?JB~Y-V*~ZF6vPKD7brwE+&c0W!7$a<&1$x&h+40S3DPRJ#Efya7zS0s6cF9=!qHz5xLM7XttRXdb@-00Ax{zX1RNX(+z|00D3=zX1RNVKl!10ReReFFL=000Ct{zX1RNZb-iY00C)EzX1RNXH>rd00C}VzX1UNKMeo@XlB0w00Ay)zX1RNX>h**00D4zzX1RNVSK*<0RbZuFM_{;00Cu)zX1RNa*)3P00D27zX1ROWn*B!0i3@900A$ezkvV&X{^5i00D5azX1RNVYt5m0RYSk00D5szX1RNaLB&_00C&uzX1gWLkN%p#{mig3<5eRUoS4`vw;e}faJabzQ2LgzX1RNbK1WF0t4j=;{;?nbRr=Eo)v+FHvs?vc>urx00ChVzySaOau~n?00D9yzySgTS_9$)I$>mV_!NO8zyVky0WdcK00D3+zySaOVL-qE0RYMb00Cu8zySaOV^F{W00CiEzySaPZDvNm0bIZV00M7i`o95UzySdO^9KL{aCX1}00D4%zySaOXn?>00sx5#6cGRcDU84Y0|w|0hzS!BX=HLPC^~wm0IH|}&Zq!}zyXrLfsS~A00DBCzySaOZ@9n#00MJzzQ6$>g8=~mg%JP&a?Zd300CvvzySaOdf31L00C*f0RT-900Akq!2tmQOb{rz!GQn)bH2d=00Cvj!2tjPY0SX^00DH;!2tjPY1qL500DH~!2tjPZsfrM00Cv{!2tjPbnw9e00DCL!2tjPW&FVb00LxoAkP2-!T|sSY;A5J#{hcH00_bX00MPyzQq6%!T|scb97>HaARpFzk00DCx!vO#RWhBD^00DF=!vO#Rc`(BP00Ck)!vO#Ra6H2S00Ch_!vO#TbY*u8^8gIP0Z79E0RY`K@00Crr!vO#RZh*r900Cu&!vO#RWsJiC00C^0!vO#RbeO{d00DHK!vO#RX{5se0RZ0!00Akm!vO&S-UukP!+`(+Zo0z(00Cjb!vO#RX~@F?00Csq!vO#RZq&m800Cv%!vO#RXW+vD00C*{!vO#SY+|az0qny800C|C!vO#RZ~Vgn0s!R*SPlRIDG0;?0s-U*R}Lr+#DM?-WE8{!00D9y!~p;SVI;%>00DO@!~p;SaxlaJ00VV$ZzT5s0>l9}!~p>S-3R~yDN4iv0Rh|yC{DzI00C}P!~p;SVO+!k00C)Y!~p;SWN5?z00C}p!~p;SWpu;=00Cus!~p;SY=Fc800DG{!~p;Sbd1CS00C)|!~p>S;RpZ$DW1du0Ri9$D5AuH00C~O!~p;SVX(vj00C*X!~p;SWW2-y00C~o!~p;SWyr(<00C#t!~p;SY1G6400L}cn8X3v!~p;TZ+YOv0bT|H0RZC&00AlV!~p>T;s_}C#DM?-W&Xqg00DLe#Q^{TZw$o&01IhzcXeiTZE|97Vc5a}PQw8_^Z@+!06fG2>cjyO#R1~@008>{>ihtZ1OWg6IvB+P0RdSKI!48T00DVS#Q^{Ta#Y0u00D1W#Q^{TZD7R#00CuY#Q^~Th6Dfsd2+=800D4z#Q^{TZ+yi800DA>#Q^{Tbcn?P00D1~#Q^{TbCksa00C*5#Q^{TZlJ{h00Cj9#Q^{Tc&x<%00CjL#Q^~ThXeotWWL1#00Cvf#Q^{TbjZa400DB&#Q^{TZ`8#B00D5?#Q^{TaNxxO00DL8#Q^{TbL_NYVsmx8#{t;K0T9Rm0RWT)00DF;$N>NWVJyf200D0@$N>NWY&ggP00v@nX?1R9D#rmv#{pKy0iMSJ8pr`Y$N>NWIz-3;0Rfc+I$p?u00CuW$N>NWaBRo{0RWi<00C`y$N>NWa(u`E00D1;$N>QWr33&0bdJaY00C~2$N>NXZfS_f0hq`E0RW!_00C{N$N>NWa;(S!00D2Z$N>QWs{{Z6biT*|00C~o$N>NXZfUs40m#S!00MJ$p2z{t$N>QWngjp=ZQ{rQ00DC5$N>NWZ|ukc0RW~100DIP$N>NWZv4mr00M4l^2h-K$pHZXpacK`Z4$`=00D9q$pHWXZyd=10RXH700DF;$pHWXZY;?G00M4lBFO=4CbVA7i00Ch}$pHWXZ%oMn00C@L$pHWZb9H72$pJXY0a(ca00A~$$pHZXn*;y>ZF0#000DA#$pHWXZ+yuC0RX2200DG}$pHWXZj8wR00M4lg2@4r$pHZXp#%T{ZKBBm00DBQ$pHWXZ>-4y0RXK800DHk$pHWXZoJ6>00M4lvdIC$$pHWYb9I=>0m#V#0RWr?00C{>$pHWXa^T4U00D32$pHZXs0083bn?jo00D0H$pHWYZfWev0sP4U0RW-|00C_b$^ifYauCV^00D0n$^iiYt^@!9bRx$^ifZZfShV0gTE40RW=}00C{B$^ifYa-hlq00D2N$^iiYuLJ-Abh63;00C~c$^ifZZfUH_0ldlq00MJ$lF9+X$^iiYo&*2^ZPv;G00DB^$^ifYZ{W%S0RXB500DID$^ifYZt%(h00M4l=E?!~$^iiYqyzu~Z3fE$00D9e%K-oZZxG7?0RXTB00DFy%K-oZZXnA600M4l7Rv!9%K-rZw*&wIbT-QY00Ch-%K-oZZ$Qfd00C@9%K-obb9H9?$^k6P0ZhvQ00A~q%K-rZxC8(JbY{x|00CiY%K-oZZ*a>200C@v%K-oZW_-&500A00C~w%mDxaWzft400DH?%mDxabKJ}U00A`O%mDxcF*7o9%mJ><0qD#D00C(3%mDxabo|T#00D3U%>e)bWeCjy00MGkT+9Iu%>e)bIuy+T0Rg=PIv&k|00DF)%>e)bVJyu700C_>%>e)bayZQa0RX=Q00DAD%>e)bWk}5d00DGP%>e)bY*ftw00M7mKFtAI%>e-b-UI*vWNOU;0RZ3x00DV)%>e)bVR+2}00DA-%>e)ba)iwR0Ri6xVT#QG00Cr>%>e-b;RFByWS-3d00d?+GBaS!0dCC!n9TvA%>e)bWvI;o00DBk%>e)bb->L500DHy%>e)bc+AZK0RZa+00DB?%>e)bW!%jH00C{{%>e)dd1YyG$N|#L0qD&E0RWZ+00DIT%>e)basbW&00D0X&H(@cXbjE)0RWc-00DFu&H(@cZXC`500MJq63zi4&H(@cbtujO00BBO&H(`dm;^dF&Vc{{bUw}j00Ch}&H(@cZA{Jq00DAR&H(@cZ&=O&0RZI$00DAj&H(@cWoXU;00Cxh&H(@cW^~R000DJ+&H(@dW@28>0f5c{00DT0&H(@cWsuGR00Cr{&H(@cZk)~m0RX-P00CvF&H(@cWUS5s00D2Z&H(@cZMe<>00DEp&H(@cbHvU800Cvn&H(@ca?s8J00Csy&H(`c)&u|nW#Y~O00DI7&H(@cY3$Ac00DCH&H(`d)C70<&H(@cWd6&0RYtm00Ctf&jA1dbR5qC00C(t&jA1dawyLM00MG%63+oH&jA1dIyBD#0Rh(pIzG>V00DDE&jA1db4p600BCN&jA4e!UQ^u&w&5|XOhnW00C~A&jA1dX`s&m00CsC&jA1dZmiD%00C*T&jA4d!vp{UWxme=00Cpd&jA4d*aQFpa?Z~I00Cvv&jA1dX4uaG00Cy+&jA1db>zd$X00D54(E$JfZJ5yk0RZR(00CvB(E$JfXQI47*bnejs00D0D(E$JfY536r00D3Q(E$Jfa0Jo;00CzT(g6SgZV=J|00C(h(g6SgWE|1~00C|y(g6SgX(-YG00VPyV!F`*=+OZ#(g6Sgax~Hb00Ct}(g6SgWJuBh00Ci6(g6SibYW)1eax&8a00Ct-(*XbhW<1jY00Cw~(*Xbhbx6|z00Cl7(*XbhcvRB?00CuM(*XbhWMI<)0RYbg00DDs(*Xbhb8yoE00Cuo(*XbhV|>#A00Coy(*XbhVTjWK00Cu=(*XbhXOz00DCb)BykiWen5-00CnX)BykiV;Ix{00Chh)BykiWhB%A00D9;)BykibuiQc00DG1)Bykics$er00Ct})Byni(F6bia!%9%00CuE)BykiW?0k#00CxR)Bykib!5~500ClZ)BykiWpLC100C`w)BykiVSLm900DA>)Byni(gXkjY>w0c00C^0)BykoZgy#7bY@}Z(g7^f0jARd{L=wQ)B%Xp0hrVQ00BCl)Bynj(*!!a)PVp2bHdaC00DB!)BykiWzf_C00C*%)Bykia@^Db00DC1)BykiVd&HW00Cm|)BykidGyo)00DCP)BykiZvfQ+00C_V)d2tjWen8;0RY+r00Ctf)d2tjbR5+I00Chl)d2tjbSTvU00DC@)d2tjY&6vY00C(_)d2tjV?fmb00C}B)d2tjWlYrp00DGT)d2tjb6C{@00C%T)d2tjbY#^500D4n)d2tjWpLF20RZL%00DA*)d2tjWq{QI00Cx()d2tjW{lMV00DK9)d2wj=L7%&d7jk)00Cj5)d2tja;Vh-00DBY)d2tkVquuo0kqWt00DTq)d2tjWyIA100DH$)d2tja?sTQ00Cvz)d2twaCLNPVRvS7V{>9{WOnq%0Tjmp?#%(B&H-f40l3cr2+#p$&;cIN0b0@l(9!`C)d6IA00BDU)d2tjIvm!400DC%)&T$kV<^@E00C(()&T$kXf)OV00D41)&T$kVL;Xa00V4ga=VQ00DD;)&T$kb%fRd00D1`)&T$kZIIRh00DWH)&T$kZk*Nu00D2J)&T$kZm8A)00CjH)&T$kWwh1-00MJslvDw_)&T$kVZhb_0RT4&00Ak`)&T+mE)O;eDAd-000DH`)&T$kW8~HW00Cv{)&T$kZ1C0r00Cz9)&T$kW&G9w0RTA)00Aio*8u?mI0`5X*MR^5bQ0GA00C(l*8uZS;00DHa*#Q6nbhOz400DKn*#Q9nL<9f>L00C*r*#Q6nc+lAa0RTk=00DH|*#Q6nY~a}e00DL8*#Q6nVeHuf00Cz5*#Q6nW%$_v0RTn>00CqK+5rFoWeC~<00C-w^00L)iWZMC<+W`OpZ@Ak500DHu+W`OpXUN+D00C~!+W`OpY1G>R00DB^+W`Opbl}?o0RU7400AlN+W`RqQv@jR+kpT9clO%>00D3Q+W`OpWCYv+00C|a+yMXqX%O5200DOv+yMXqZXDbJ00Ctp+yMXqa46gX00w7kZFh5T?$`nT*a4v00pi*L=Gy@-+yMXqIyBq?00BBq+<^cAbX42{00DJc+yMXqaA4d400DGn+yMXqb!^-L00D1u+yMXqAb8vX00Crv+yMXqZiL(c00Ci&+yMXqAduVv00DHC+yMXqb)4J*00D5K+yMXrZ*Fvc0jS&o0RU+R00Aku+yMarXa*>}+<^cAbi&*L00DB!+yMXqZ_wNU0RT`F00DB`+yMXqW#HTa00Cy^+yMXqX6)Pn00DLK+yMaqQ4;_GW&Yd&00CnH-2ngratPf400DIl-2ngrZxr1D0RU1H00D9!-2ngrWhC7J00C|)-2ngrWiZ_V00DG1-2ngrb3EMv00C)2-2njrQxgCIWlr4z00CoC-2ngrX;|F>00DMh-2ngrWn|p}00Crb-2ngrZ*biK00C)s-2ngrWPIHL00DJ^-2nguVsmU^_}l>+-2q750f^lJ00BCV-2ngrI-uQw00D2N-2ngrX{_A=00CsO-2ngtY+`lLsR7p90l3`(010JnXL4zDWMOV}!U1f>0Zi5b2-pFx+yQin0Xm`qzTE*@vjG4BI?UYx0RRX900DCN-2ngrW&GU%00DXe-T?psX$al{00C?c-T?psVHDm000C(l-T?psav?0d(F000AI+-T?psyM*2W00F{^-T?vu4*+rzAdubx00C~6-T?psZ=l|R00C*H-T?psbgbS100CjL-T?psdbr*J00C*f-T?psY{cFH00Cjj-T?psY0%yQ00DB=-T?psW!&BY00Cr3!2tjPAn4u!00C|8-T?psZ}i>)00DIR-T?psa{%7~00DId-vIytV+`K`00AHp-vIytyBOaA00F`t-vI&vXaxBKASB-b00C|)-vIytZ#3V500C(_-vIytbU@z$00Ch}-vIytdQ9H|00C)I-vIytY*^m`00CiM-vIytX=L9400DAp-vIytWpLjC00DD$-vIytWqjWO0RR~e00C`?-vIytWsKhe00DH8-vIytbC}-&00DWP-vIytbEMw^00CvH-vIytY_Q(}00C*X-vIyvb7W@X-T{K&0leP<00AJv-vIytyU^bO00F|*-vI&vDFYS^Al%;p00Cj*-+=%DbnM>&00Ck0-vI#t5dZ)IdH&x400DFY-~j*uX$ar}00DFk-~j*uZWQ1F0RXB900D9!-~j*uWhCGM00DL?-~j*uaxmZl00Ct--~j*ub3EVy00Ck`-~j;unF#;^b57s^00DGT-~j*uZdl*}00CuQ-~j*uZDim900DJs-~j*uXK>&F00DA#-~j*uVSL~L00AI^-~j*uyNKWc00F{|-~j;v^avo7-~j*uZJOW#00Cv9;DG=Ebg19~00DEZ-~j*ud9>gG0RWo|00Cvd-~j*uY{cLJ00Cmk-~j*uVbI_K0RRFJ00DX2-~j*ua^T;Q;^vazx<)00DGL;Q;^vAW-1}00DDW;Q;^vWL)6^00C@b;Q;^vWoY3600C)k;Q;{vIRpR!bb8?d00C)!;Q;^vVT9oU00DA};Q;^vbdccz00AJD;Q;^vWt`yw00C^G;Q;^vVyNK(00CjH;Q;^vY_#D400C^e;Q;^vb->{P0RVIa00DH&;Q;^vY0%*T00Cjv;Q;^va@^qo00DI3;Q;^vAn4%%00Cw0;Q;^vZ1mv)00Cn9;Q;^vX#nB@00DFc;sF2wV+`T}00DIp;sF2wav0(P00DF!;sF2wb0p#c00C|);sF2wZ!qEk0RW^300DG7;sF2wX+Yuu00Ch};sF2wa!ld@00DGT;sF2wAXwr700C`Y;sF2wb!6fJ00C}l;sF5w$Or%dbavta00C)w;sF2wVSwTR00DA_;sF2wbd2Hw00AJ9;sF2wYnb8z00DEJ;sF2wVWi>#0RTY>00CvN;sF2wXSCu000CjT;sF2wbHL&O00DKz;sF2wAk5+c00Cpt;sF2wY1rZc00DE};sF2wVdUZg0RV0Z00DIH;sF2wY4qX&00Ck8;sF2wascB200DFc;{gBxAPnOH00DCn;{gBxbQt3S00C(p;{gBxawOvc00Ctx;{gBxXfWde00C|`;{gExAqxNjbVB0+00C)6;{gBxVNBxz00DAR;{gBxbXem700AIg;{gBxd1T`O00DAp;{gBxVQ}LC00C}x;{gBxZ+znc00C)&;{gBxbco{t00Co;;{gBxX_Vsu0RSrv00DHM;{gBxX{6%;00CjD;{gBxa;e00DV?<$(YJa)jjp00DH000C>R<^cc!W3=W000D2h<^cc!bHL^S00AJz<^cc!aLncb00Csu<^cf!84LgcbKd3w00DI3<^cc!W$5Ms00C?6<^cc!WAx?$00D3M<^cc!a{%W700AHd=K%l#a17@G00CnX=K%l$b#&O~0T|~200AH#=K%l#yC~-Y00F`-=K%o$$p|1c=K%l#XFBJB00C}7=K%l#X-MY*00C=G=K%l#a#ZI500D1W=K%l#cVOoM00DGn=K%l#Wo+jG0RZL*00DV;=K%l#a(w3j00D1;=K%l#ZHVUq00Cu==K%o#R1*LJZ<^-;00C*9=K%l#WTfW-00DKX=K%l-WMy)6X=iS2VffzxF5v;*T00Cvj=m7u$WX$LR00Cjr=m7u$W!UHe00Vb$a(3ter04Y)%GYS9!a1!YO00D3o=>Y%%XdLMQ00Ax{=>Y%%c_`@t00D9?=>Y%%Wi;sl00DJ6=>Y)%D-Hkwa7O6?00D4H=>Y%%Xi(_^00Aym=>Y%%b6n{G00CuU=>Y%%V`%9C00DAt=>Y%%b#&Y%%bAagq00Cu&=>Y)%ND%-5aFXc(00D58=>Y%%Xq@Q*00Azd=>Y%%bExS700CsK=>Y%%ZnWtE00CjT=>Y%%ZNTXP00C{r=>Y%%Z_Mcd0RWK^00D5==>Y%%aNOwu00C&?=>Y%%F6ik200Cs~=>Y%%Z1m{?00DCP=>Y%%Zvg560RXuX00D3e>Hz=&a1iPN00C$g>Hz=&E*$Cs00DC%>Hz=&ZYb&j00C((>Hz=&XEf>o00DJ6>Hz=&Y(VM(00w1oa$|RJ4Cw(t=>d%C0n+IK2I>Ju>Hz@(4g)Vt>VW_Ob7txR00DGv>Hz=&ZglDa00Cus>Hz=&ZGh?l00DJ|>Hz=&XN>9r0RVFb00D5A>Hz=&aGdG^00C&C>Hz=&E~x4O00DEZ>Hz=&bF}IK00CvX>Hz=&W5DVG00MGjlIj7*>Hz@�LNYaMtPp00D5?>Hz=&XyEDr00A!M>Hz=&ZS3j+00Cw4>Hz=&bolB400DFU>Hz@&k`Dj@a0=@I00D3g>j3}(XcX%K00Ax<>j3}(WgzPT00C?!>j3}(bu8-v00Cq&>j3}(WjN~r00C$|>j3})d1D0Y0YvKo0RWc?00D4R>j3}(a9HaB00C%T>j3}(E@bNg00C!e>j3}(VQ}jK0RT-300D4(>j3}(aDeLp00C%*>j3}(E{y8|00DB6>j3}(Wti&$00C&8>j3}(W2EZ=00DHW>j3}(Ww7f30RVjt00D5k>j3}(aKP&U00C&m>j3}(F3jrz00DE->j3}(ZrJMq00D2_>j3}(Y2@nx00DIB>j3}(aPaE^0RSWu00D6P>j3}(Z~*K900C$Q>;V7)E)47e00DUt>;V7)av1CZ00DF!>;V7)b0q8m00C(#>;V7)XE5vm00Ct->;V7=aA9+FW^Zyl=mE^?0ZQuucIyGQ>jC!b0X*yh0Rd(XFGB2r00C`a>;V7)WoYaH00DGv>;V7)b9C$h00DV=>;VA)hX4QpaE9yw00D4{>;V7)Xprmy00AzR>;V7)ZJg`@00DBM>;V7)WvJ`{0RZI&00D5c>;V7)aJcLN00C&e>;V7)F2w8s00Csm>;V7)Wzg&a00DH?>;V7)VchHi00C^`>;V7)W$5ey0RX}W00D6H>;V7)aQN&200C(J>;V7)E(GlX00CtR?EwG*a1iYQ00DUx?EwG*bR6vg00Ctp?EwG*XejLg00Cnz?EwG*ay0D$0RY?%00D47?EwG*a766^00C%9?EwG*E>P_O00CuI?EwG*WL)h500D1e?EwG-a$#=n>;XFM0ch<300A#W+`0o3jR0ReRbFWT;b00DC3?g0P+W$f+&00DOL?g0P+a`^5600CwG?g0P+a|G`J00CkO?*Rb-y8r+Ia2D?Y00D3s?*RY-Xdv$a00Ay0?*RY-axCuw00Ct(?*RY-W;pKw00Cw`?*RY-bwuw000Cl3?*RY-Ur_G>00CrH?*RY-Zd~sH00CiQ?*RY-ZD{WS00C`o?*RY-F4VsP00DD)?*RY-Z-DOs00Cl#?*RY;Z*_F<0gUef0RRyJ00D5E?*RY-aG>u200C&G?*RY-F0AhX00CsO?*Rb-X9fTPaK7&W00D5q?*RY-XvpsY00Az}?*RY-dDQO#00DB^?*RY-bl~p+00DF6?*RY-Y3%O-00C$6?*RY-W%%y_0RZO)00D3W@Bsh;a0u`L00C$Y@Bsh;E)?(q00Cth@Bsh;Y#{If00Ckq@Bsh;VJz?g00U`qbhz&U{_g=Y@Bsk00C!8@c{qQ9T00C%L@&Nz=a9r{M00CiQ@&Nz=a%l1a00L=eI`RQ-@&Nz=Uv%;T00Cuw@&Nz=aD?&!00DW5@&Nz=bdd4^00Cu|@&Nz=Xq@r^00Cp7@&Nz=a;WkF0RYhn00D5c@&Nz=aJcdT00C&e@&Nz=F2wQy00C^u@&Nz=Z_x4q00D2-@&N$=<_Z7-aN_a-00D63@&Nz=XzcO<00A!Y@&Nz=dHC`H00DIV@&Nz=X$12D00DFg^8o+>ZV>YU0RScw00D3u^8o+>a3J#m00C$w^8o+>E-do_00C$+^8o+>b2#$>00Ch>^8o+^VQ^(=uJQrg@&Oj}0Yviw0RjI6FG}-)00DVi^8o+>bY$}Z00C)g^8o+>ba3+l00C}x^8o<>s0IK5aDwvz00D4@^8o+>XpHj#00AzN^8o+>W0>;+00C*9^8o+>ZKU%700CjD^8o+>Zm{zK00DWn^8o<><^})(aKiHe00D5u^8o+>Xw35g00A!2^8o+>WZ3fo00C^?^8o+>a^&*?00D36^8o<>UkLyKaQ5>700D6N^8o+>XaMv900Axr^Z@_?bPV(X00C|i^Z@_?X&CeY00D9y^Z@_?a3u5r00Ctx^Z@_?bujb+00C?^^Z@|?&F@^8q~c0h;sy$n*gk^#K6^kOway^??8Zb5ivI00CoK^#K6@Y5)KMaAx%Z00D4n^#K3@XmIrb00Ay`^#K3@WPJ4j00DA>^#K3@VTkns00D1~^#K3@VwCj(00DWL^#K3@WuWx|0RXE800D5U^#K3@aIp0O00C&W^#K3@F1+;t00DQx^#K3@Z^-ol00Csq^#K3@Zq)Sw00C**^#K6@=>`A+aOU*^00D67^#K3@Xz=v`00A!c^#K3@Wc>9300ChF_5lC^a0vDR00CtV_5lC^Z4~wa00Chd_5lC^E{4DX00D9)_5lC^Z!Go!00DC{_5lC^aya$@00DJA_5lC{YjD00C_V_W=L_X$%00Cu&_W=L_WQ_L#00DB6_W=L_Zj%#`Xai_W`8$0UG!LTKEBi_yGX{^baqH_<;ZcY^L}D00CjH_yGU`ZnXFT00DBk_yGU`Wx)6W00DHy_yGU`c+B_#0RWu`00D5=_yGU`aNPI-00C&?_yGU`F6j6H00D09_yGU`Z}j*900C+G_yGU`a{&1P00D9a`2hd{WeoWN00DLq`2hd{ZW#Fi00D0v`2hd{V00DAB`2hd{bV&ID0RT1#00D4R`2hd{a9H^P00C%T`2hd{E@b%u00DDq`2hd{ba43r00C)s`2hd{a(wv#00Cu!`2hd{Xo&d%00C}}`2hg{6ASiPjB`vGeE0hs#%0Ri|3FP{5>00DEv`vCv}bj00DA(`~d&~Wq|wv00DM}`~d&~a*X@|00Cu^`~d(1V{&sC`~hD40hs&&0RYbo00D5U`~d&~aIpLV00C&W`~d(0UoM{f0lfSH00Cvf`~d&~aLoJx00MG(-unU4`~d*~n+X5`aN_&{00D63`~d&~Xzcs}00A!Y`~d&~bol%M00CqE`~d&~Wd!{J00C?Y{Q&?0W)S@W00Ctd{Q&_0h!Fq*a3cKy00D3&{Q&?0Xe|8!00AyC{Q&?0ZaDn`00D14{Q&?0b42|C00C)A{Q&?0a!~yN00CiE{Q&?0a9sTX00C`c{Q&?0Z)p7i00d=pa%0l?0oeQj9Q^@q{Q&_1gb^=v{eb`hZif8<00D1~{Q&?0X_Wl|00DHG{Q&?0W1#&300CvD{Q&?0Y^?nO00CyQ{Q&?0Ww`wT0RUYA00D5s{Q&?0aLD}u00C&u{Q&?0F4X-200Cm!{Q&?0V&MG&00Cj<{Q&_05d#1LaPs{D00D6J{Q&?0X#D*F00Axn{s901a|r$c00C?c{s901X%zke00DFw{s931g9QKqa3=l%00D3+{s901XfXZ(00AyG{s901Wjy`?00C@5{s901bx8gJ00DDO{s901a8&*Q00CiI{s931!3Y2WaAy7i00D4n{s901XmI`k00Ay`{s901Wqket00C}-{s901VTk?#00C@{{s931ybJ&VaGL%B00D5G{s901Xr%rD00Azl{s901c(DEf00D2d{s9310uBHHaKiop00D5u{s901Xw3cr00A!2{s901bJ+d?00C~^{s901Z{+>~00C+0{s901bnyNG00Cq6{s901W&HjD00DCX{{a92atQwc00CtV{{a92bQJ#q00C|q{{a97VRd70VrlIC0U-VXVEzG={sFxH0U-YY0Rb=*FDCzi00C`4{{a92Z%F?E0RXrG00D4R{{a92a9IBV00C%T{{a92E@b}!00Cuc{{a92V{rcg00C)s{{a92c6|Q<00Cu!{{a92WQhL(00Cc){{a92a+Lo800Cv1{{a92WT5{600C~M{{a92Wvu@J0RTP&00D5g{{a92aJ>Hk00C&i{{a92F3A4@00C^y{{a92Y1ID#00DH`{{a93a&@x*0pR}u0Rg=XFXsP&00L!fPX7V${{aC2!T|sQZ~_1V00D3Y00IC3Xbb=X00Ax%00IC3Z5RLo00Chh00IC3Wh4Ls00D9;00IC3bT9w{00DD000IC3UpxQ;00DAB00IC3Wk>)500CxB00IC3W>f$I00DJc00IF3GXwwuaAp7k00D4n00IC3Xm9`m00Ay`00IC3b9?{-00Crz00IC3a)xJz00DH)00IC3bJPF=00Cdx00IC3WZ(b-00DC500IC3Ve9|`00Ct300IC3ZukHK0RXB700D3W0RjL4a0mec00C$Y0RjL4E))R*00C_p0RjL4VITnl00Ctt0RjL5VRHTe0xSUn00DF|0RjO4@&^C`a6$nB00D4D0RjL4XiNbD00Ayi0RjL4Wmo|M00DMh0RjL4Z)5=i0RTM-00D4t0RjL4aC89z00C%v0RjL4E`R|700DD`0RjL4bBqB300Cu^0RjL4ZkPcA00C~E0RjL4VWa^900C*L0RjL4WUv7O00C~c0RjO4V+sHPaKZrs00D5u0RjL4Xv_fu00A!20RjL4W!M1%00DL00RjL4Y~%p~0RUwR00D6D0RjL4aP$EJ00C(F0RjL4E&u`o00D9a0s;U5Zwvwg00DFo0s;U5V;BMg00LoU>Hz{C0s;U5b|eA<00Cbv0s;U5c{Bn700C|~0s;X5z6$^Wa7F?G00D4H0s;U5Xix$I00Aym0s;U5a9jcc00CiQ0s;U5ZD;}l00Cca0s;U5Wpn}p00D4%0s;U5d4K`}0RTG;00D4}0s;U5aF7B500C&00s;U5E}Q}a00C~I0s;U5Z>RzS00C*P0s;U5bhH8j00CpV0s;U5ZomQp00DKz0s;X5NDu%4aMA(-00D5;0s;U5Xxst<00A!I0s;U5bm#&C00D6B0s;X5V-NrVaQXrQ00D6R0s;U5XaoZS00Axv0|Ed6a1a9m00ChZ0|Ed6Z5#sv00C(t0|Ed6VkiRw00Cbv0|Ed6WHbW;00Ct>0|Ed6azFzD00Cu20|Ed6WK07B00DAR0|Ed6Z&(8Y00C}Z0|EdFVrO%0Wnpw?Z*^b*0-6800C#>0|Ed6XXpb00RS!z00D6H0|Ed6aQFiP00C(J0|Ed6E(8Pu00C?Y1Ofm7We@}c00DLu1Ofm8Z)NTS0vrSa0RVvy00D3;1Ofm7a4-Y{00C$=1Ofm7E<6MR00DDC1Ofm7V@L!700C)E1Ofm7a#REY00DGb1Ofm7WncsX0RY4g00D4p1Ofm7aBu_y00C%r1Ofm7E_?(600C!$1Ofm7ZioZ|00C)^1Ofm7W0V8}00Ci|1Ofm7a-akP00V4obRq--W&{GJ1Ofm7FRTQD00C^e1Ofp7Q3C)0aK;1z00D5y1Ofm7XwU=#00A!61Ofm7bKC?100DF21Ofm7W#|L~00Cp}1Ofm7Z}bEL0RVpv00D3S1p)v8a0CSc00C$U1p)v8E)WF*00C?k1p)v8ZyW^z00MGv`UC1p)v8Y2XC{00Cs?1p)v8b?gNK00Ck01p)y9Qv)yf1%d$p@ecq2a0Uhf0RcY^a0&(j00C$a1_A&9E*J&^00C(p1_A&AY;gVs0we|k0RZ>|00D3`1_A&9a5x4600C$|1_A&9E<^?b00C`E1_A&9Wl#nJ00DGX1_A&9b6f@j0RU(Y00D4l1_A&9aBKzw00C%n1_A&9E_en400C`&1_A&9VT1+(00Cu+1_A&9a*zfB00Mb*Vg>@11_A&9bDRbO0RVmu00D5U1_A&9aIgjf00C&W1_A&AUoNHw0=xzS00Cvf1_A&9Y|I7%00C*z1_A*9e+K{oaNY(200D5~1_A&9Xy^t400A!U1_A&9W%LFD00DOT1_A&9X#fWT00C$Q2Lb>AV+;oZ00D9m2Lb>AVHgJj00Cbf2Lb>AWF!Xy00D9;2Lb>AVK4^*00Cq+2Lb>AZafD900Ch_2Lb>AbVvsR0RR^a00D4R2Lb>Aa99Td00C%T2Lb>AE@TG+00Cuc2Lb>Ac5nv*00C)s2Lb>AXnY3(00Coy2Lb>Aa)<{40RZ<700D562Lb>AaF_=I00C&82Lb>AE~Ezn00CvH2Lb>AcCZHm00C*X2Lb>AXuJmk00Cpd2Lb>Aa>xe)00Cjn2Lb>AU(^Qz00Cs$2Lb>AW#9(_00Cs?2Lb>AWb6k500Cw42Lb>AV)zFF00C|O2Lb>DW^-X>*aiYl2Lg@<0t5&G0Rd00C|~2?78CX+Q}A0RS!t00D4J2?78Ca8L;X00C%L2?78CE?fx$00DAh2?78CWoQWk00DY#2?78CX>}e00DBI3IYHDWuyuM00C~Q3IYHDWv~hY00DHi3IYHDbG!-y00C*j3IYHEb8LbN0>}yi00Cdl3IYHDaM%h000Cp(3IYKDEC~PsaOw&I00D6B3IYHDX!HsK00A!g3IYHDa{vnh00DCb3jzQEWef`f00D9m3jzQEWEcwq00Cqk3jzTEW(oiSa4HJ|00D3=3jzQEXfz7~00AyK3jzQEb3h9M00C@93jzQEX-o?O0RS%%00D4V3jzQEa9j%l00C%X3jzQEE@%q^00DGv3jzQEWpoPy00C=y3jzQEV}J_+00D1?3jzQEbBqfD00Cc;3jzQEaF`1M00MMmQVRl}3jzQGbYXSm3IZex0;CH900A$q3xWUvbi4}!00Cvf3jzQMWodF}ZFFH|ZeaBRWcC5R{Q>y@0ki`GiUk5H1_DS50>}#j0RUDA00Cw63jzQEWB3aK00CkC3jzQEas&(l0RUGB00CzZ3<3ZFbrcK&00Cke3<3ZFWgrX!0RUJC00D0-3<3ZFW-tr_00C|`3<3cFSqK0DZbA$K00DAF3<3ZFVN47H0RUPE00DAX3<3ZFZ(Ixl00DAh3<3ZFa%c{00DH03<3ZFX^;#800DBA3<3cFTnGRGW}*xN00CyE3<3ZLbYy9FWn*s&3<4$$0z3=?QVara3<8`C0;~)I00BC(3<3fGUkG6c00Al13<3iJUI<_aT?jfT&>=Yh@(f+`IH00L!hFbx7uKmh^(qz(%c00Ajh4FUoJqYeraZz$|a0bC7&00DGj4FUiGV{i=u00DJ&4FUiGa(oQ}00DG@4FUiGbBGNB00C}}4FUiGZ)0Ra2}00D3$4gvrHa3~G}00C$&4gvrHE;J4T00Ch-4gvrHX+RDF00DGH4gvrHa!d{a00CuE4gvuHY6AcPa9$1q00D4f4gvrHXlM=s00Ay;4gvrHWpoY#00DD)4gvrHY=8~|00DJ|4gvrHaEuND00M4pSPlY`4gvuH{Qv*~aH0+Z00D5O4gvrHXsiwb00Azt4gvrHdAJS&00DHq4gvrHX~Yf!00Cpl4gvrHZ_o|`00C^)4gvrHW!w$|0RXK600D654gvrHaO@5O00C(74gvrHF8B@t00CwG4gvrHa|90p00C?Y4*~!Ibr25%00D3o4*~!IZ5$5*00MSt;tm2L4*~!IUnma(00D9`4*~!IVK@&000C@14*~!Ibwm#W00C!84*~%IA_V{ea8?fj00D4X4*~!IXkZTl00Ay$4*~!IZfp+%00D1u4*~!IX?PC;00DG<4*~!IV}uU^00Cu+4*~!Ia*z)K00DBA4*~!IZ=4ST00Cp74*~!IU#JfP00CsK4*~!IWwZ|h00DHm4*~!IVZaXp00C^q4*~!Ib<7U}00C{%4*~!Ib=VIA00Cp(4*~!JZevgn0^|<@0RZ&~00D6H4*~!IaQF`b00C(J4*~!IE(8z)00C?Y5CQ-JVGs}k00C(h5CQ-JavTr>00Ctp5CQ-JbSMx400Chx5CQ-JZ8Q)900Cb*5CQ-Jb3hOR00Co05CQ-JX-p6T00DDS5CQ-Jc~}qv00C%T5CQ=JWC;KPaB2_&00D4r5CQ-JXmk()00Ay~5CQ-JWq=R@00Co$5CQ-Ja*PlH00D235CQ=J0SW*CaGnqX00D5K5CQ-JXs8eZ00Azp5CQ-JWwa0i00DKn5CQ-JaljA)00DBw5CQ-JZ_E$^0RV*y00D5=5CQ-JaNH0A00C&?5CQ-JF6a;f00DXK5CQ-Jbo3Ac00C+G5CQ-JV*n8X00D0X5dr`KYzz?s00CtZ5dr}Ka}EFja2^o?00D3!5dr`KXebc^00Ay85dr`Kb2JeG00DD45dr`KVL%ZA00C`A5dr`KUrZ4K00CxF5dr`KZ&(om00CcK5dr`Ka%2$#00Cuc5dr`KbZ`*@00C}x5dr`KWqc6=0RT!600D4_5dr`KaEuWG00C%{5dr`KE|?Jl00DEJ5dr`KbEFXh00CjD5dr`RX<=|?barEHm<|H!4+3Nm0+Gh7Dp8g#ly|gc2_(wh@Bn5rO~$VR=ri0K(+}00eY*Z*~F_0(`9is;vO#a00C@D69NDMa8MHh00CuI69NDMY+Mrp00D1e69NDMb7&I+00C}p69NDMZ*&s^00Coq69NDMI)D=b0s}GxKn5>5a3B+ch7*EN69NDMWsDO700C^C69NPTB?{yO&IEA~b2?>W@E!qZ7J;500elkx00DBU69NDMWyBK#00Cyo69NDMX3!G?00DK@69NDMV%!q~00DI369NDMZs-#N0s^rPjSe~}j8B0`OMw6Zbo3Jf00C(N6aoMNVF(lg00D9i6aoMQbRaHY6chsJ;Q{>l0XF&p00Cth6aoMNY%CN400Ck$6aoMNX*d)D00DG96aoMNV?-1J00MPoN)!Ub<^Ti$=>uO2ItSMc00Ajl6aoYR=mTC0IS1AaC}b3Z00DPu6aoMNWq1?<00C)!6aoMQVRCk3?h^t~6as`40*K}S00VDyb)*vliWCBZi~s=uuLb}CaHx00C^q6aoMNZ_E?|00Cyw6aoMNY1kA300C~^6aoMNVdNA700C|46aoMPa9?c=7XbaSG)O9u5r)b`6XSC~R^r6@pIn0C@EP00DC}6#@VOZe$e#00Lua1Qh~m6#@YO=>-4*aC#L200D4*6#@VOXoM9400AzF6#@VOa*!1Q00Cu|6#@VOY@8JW00C^G6#@YO5(WSPbFLKv00CvP6#@VOZnzZ!00C*f6#@VOY{V4;00Cvn6#@VOWY84?00C*%6#@VOb=(yK00C#>6#@VOAm|kW00D096#@VOZ}b%c00C+G6#@VObO06t00DId76JePVhk1n00M7ms1*Vd76JeRVRB_~6#^I*0-$>V0|5LA9|gk>00Aj576JnT`wAWf!VV~9I2MAUbO8VXbUqdW00Co876JePWmFad0szJZvJ3zLDPR@?0s_Sau?#3_W)_0{&Hw-bZfq6;00D1$76JePX@C|200DG{76JePX^a*E0RkisC}oIyfa<{k00DHE76JePa-R<00Coi7XknQWq20?00DA-7XkqQ@&y0^DT)^Y0Riy^D2^9`00C~47XknQX`B}V00C#B7XknQb*L8t00C^S7XknQaI_Z!00CvX7XknQXTTQ%00Cjf7XknQZOj(}00C*z7XknQY1kJ60RU?b00AlF7XkqRY7Qvq7lHr*ZtfQX00C+C7XknQXZ#le00DIZ7y330zwCX00DA*7y&00D0b83F+S_6Pt0a26Q?00D3s83F(SXdoE^00Ay083F(Scq|zL00D0@83F(UV|HTP7y=L(0yr500RgZEFFqN900DDM83F(SWmFjg00D4X83F(SVPF{o00C%b83F(SU+@$H00DGz83F(SV|WC0RT7=00Akm8Ug_UHxVeb8iD`;Zn_!*00C*j8Ug?TXUG}?00DK*8Ug?TY}6V800D5?8Ug?TbKn{R00D018Ug?TZ|oWZ00C+88Ug?TbNCtp00C+K8Ug?TYy=wu00C?Y8v+0UZx9;-00Cnb8v+0UIvg7U0t7h`zY8yPI&hvEg2+n%A{&C*8Ug?Tb0`}E00C}38v+0UZ$ujc00C)A8v+3UV*>yIa8?@v00D4X8v+0UXkZ%x00Ay$8v+0UZfqL@00C)o8v+0UXLuU|00DJ=8v+0UY=j#E00D4{8v+3VhY>H38-f4JHU00C^~8v+0UaO@ib00DFI8v+0UZ}=Mm00C|O8v+0UdITH-00C(V90C9VXAm3$00D9q90C9VWgHv=00Cqo90C9VX(${500C?+90C9VY&0AK00D1090C9VV?Z1N00BBi90CCW_Xj#m9D)D=b5a}v00D1W90C9VZD1S%00DYt90C9VX>1$<00C!m90CCa0|#F^AZIST8v?vcfOs4N5F7%a83F(Sa()~F00Lik;28p_O#lD^XPg`Y00C~M90C9WWoeci0<0VY00MJlP#XfW90C9WX=S_|0tnFn0s{pG2L>)_D6;SY2*&^b+<*W9ZqOV800C{{90C9XZ)|m(7y`x|0_Yq900we!ZEkF2Obr6C4FcE_0=5Q9a{&PW3IG5Ba26c`00D3s9RdIWXdoQ|00Ay09RdIWb1WSK00Ch#9RdIWb~qgZ00C}39RdIWVMHAQ0RXE400D4N9RdIWa8w-v00C%P9RdIWE?^x300DGn9RdIWb8H;~00C)o9RdIWY9RdIWU)&u600C^`9RdIWVdxzK00DIF9RdIWZuA`j00D3M9RdIWdH@~*00C(R9s&RXats~<00D0j9s&UXngsv>a2_5400D3!9s&RXXeb^600Ay89s&RXWi%cF00DYB9s&RXX+RzV00DDG9s&RXUrZhX00C@L9s&RXWmp~p00DSj9s&RXX=EM(00D4n9s&RXUvM4*00D4z9s&RXWqck200Cu!9s&UX>IMJ-aE=}V00D549s&RXXqX-X00AzZ9s&RXXrvwj00CpF9s&RXbg&)*00CvT9s&RXa=ab_00DHu9s&RXbI2Y700Cdl9s&RXY}6hC00Cjz9s&RXW8fYF00C*{9s&RXbnG4i00DCH9s&RXW%wQf0RTh@00D3W9|8aYa0nj)00C$Y9|8aYE)*XE00DFw9|8aYZXh2500Ctt9|8aYZ7d%G00Ct(9|8dY=Li4+a6TUb00D499|8aYXh9|8aYZ_FP800C*z9|8aYbl4vP00Cj%9|8aYa^xQZ00Cd>9|8aYbnqVn00Cq69|8aYW&9rk00D3UAOZjZa|j>;00ChRAOZjZUlbq$00CthAOZjZb|4@E00C(xAOZjZbSxkO00Ch#AOZmZP7eS9a6TXc00D49AOZjZXhN600C?sAp!saa3moD00DCAp!ybg9Tmz00D4{Ap!saaF8Ja00C&0Ap!yej|VyqE;?hJAp!t9fud0W00Cv9Ap!saY_uT)00DKnAp!sbb78o00D01Ap!saY3v~a00C$6Ap!sab@(9y00C_NAp!saa0DU(0RS}w00D3iA_4#ba1k0Rcq_FG?bU00DAPA_4#bWmqBt00DYlA_4#bX=EY-00DApA_4#bWpE+_00DG%A_4#bb9^EK00CiwA_4#ba)=@V0RsF8FJB5Gf{r2r00DE9A_4#baG)Xr00Cj9A_4#bZLA^!00CdJA_4#bceo+~00D2lA_4#bWW*u@00CjjA_4#bXwV`800DE>A_4&bb_M_eXW}9P00Cjdcm^ndBZ2?{ZiXWQ00C)^BLV;cXOtrX00DKHBLV;cY@j0o00D5OBLV;cbF3o*00D5aBLV;cVYnj#00C{jBLV;ccf=zC00D2xBLV;cWY8l500CjvBLV;cXxt+L00DF2BLV;cWauLT00Cw0BLV;cWb`8f00Ck8BLV;cV*n%q00DCbBmw{ea$$BO0t_Sq0RVRf00CzlBmw{dVIU*|00DF+Bmw{db1WnR00D3^Bmw{dVK^iL00C`2Bmw{dcSIxt00D1GBmw{dWKbjm00CiEBmw{dXj~)$00DDiBmw{dWN0J;00CugBmw{dWOO6~00CioBmw{dV}K+A00DD`Bmw{dVT>dK00Co?Bmw{dZR{00CrzCISEfWsoKU00Cr{CISEfVVouc0RY1c00D5QCISEfaI7W*00C&SCISEgX)dZR0JtUs00DBoCISEfWymH100Lulq9y{)CISHfDFpxlaNZ^Y00D5~CISEfXy_&a00A!UCISEfW%MQj00DOTCISEfX#ghz00DFcCjtNgV+q00C!GCjtNgbyz0?00L!fDklP7CjtQgt_J`CaBe3800D4vCjtNgXm}?A00Az3CjtNgV}vIH00C)=CjtNgXpkoY00D58CjtNgVVoxd00DBMCjtNgXQ(Fv00D2VCjtNgXtXB+00DHmCjtNga=<470RZI-00D5!CjtNgaL^|L00C&$CjtNgF5D*q00D2}CjtNgbm%7n00Cd_CjtNgbMz+y00DRUCjtNgVE`xs00D9aC;|Zh91;Kla1tm200D3oC;|WhXdEa400Ax{C;|WhVJIj900D9?C;|WhWi%)P00C_}C;|WhVL&JX00eMvWMgC}0>&o-3@8FdC;|Zh{s;g8DPAZ70RjC8C}Jpr00C}jC;|WhX>ce400C!qC;|Whb$loS00C@*C;|WhaEK@Z00Ci+C;|Wha+D|n00Cv1C;|WhZJ;Ou00Cj9C;|WkVQ_k5fKULsPypso0IVni00BC(C;|fn{|KZ9RTD2da4t+Jg2X6-h$sRgC;|WhVag~100DC1C;|WhW#}jZ00nMvY;$ddAp*uB0)oB()FuM%C;|Zh5C8xHa0)2`00D3gDFOfiXcQ>|00AxIDuMt3WezF=00DCvDgpolWp8QvDFPrW0%Uvv0RWZ&00Cz-DgpojVK^!R00DG9Dgpojb3`fv00Ci2DgpojY)~o!00DGXDgpojVO%N#00DPmDgpokZ)IpI0+uHM00CrfDgpojVR$M600U@YZ+?~dWfUs{0s#636#)PNDI_Zb0s;936agqID}n$4axg0b00Ct>D*^xkWcJO}^*XPPSl00Cj1D*^xkbfhZ+00DBUD*^xkWw0v(00CyUD*^xkX1pr`00DKvD*^xkV#q530RZR-00C#zD*^xkVc07I00DH~D*^xka^x!l00Cs`D*_M>Yyngf7ZCdf1_|R3Zvln{p%9)A+yV~^0}h@EP!UZCb8=*2C}wbUV`+A0XkmmZ0^%wH9xDP;D*}8gf+8gW=q3SvC;^Ns0+J~K6e0RX5A00C!EECK)lZd5D+00C)QECK)lc3><500CiUECK)lb8IXE00AI!ECK)lWOytB00C}(ECK)lVT3FK00AJ1ECK)lXOJuc00C~6ECK)mWoh;+0-P)Y00DHOECK)lVXQ0y00U)dZ?Y@`kPHF}cL4zduK*}tZ$deNUJ(K=QUCw}a>gtI00CvzECK)lblfZg00C~|ECK)vb#Gy4Y;t9HV{LPE!2$dn0`w>XW+?(DDgwAH0_ZFPZqEUB&jD(S095z^0RVas00Ai+Edl`nc@QWdErI|6ZYC`P00C((Edl@mXEZGW00DJ6Edl@mY(Omn00D4DEdl@mc}y(=00DGTEdl@mX;>`+00DMhEdl@mVPq`=00DApEdl`md=LNuDRwOa0RejuD0(e|00C}*Edl@mX^1TX00C!?Edl@mb(Adv00C^8Edl@maG)&$00DBQEdl@mWvnd%00DNgEdl@mY`84~00D2lEdl@mbHptI00DE#Edl@mW6&)E00C*%Edl@mbKETg00DX8Edl@mXy`2h00L)la4iDvEdl@mI`l0900BDwErI|6c?2#300DFgE&>1nX%H>~00DLuE&>1nVH_?300D9$E&>4nED-1nX+SOl00C!4E&>1nbxbY-00C@LE&>1na9Az^00DDeE&>1nV`MG@00C)gE&>1nb8s#K00DV+E&>1nXnZaL00L)lC@unmE&>1nI*2X;00d!TZ8|st09pb7CIkSIE`k67bC@my00CpFE&>1nX|OH=00DEhE&>1ndAu$H00d=kY-oZ20LB3T<^cf0E&>4n9S8scDcUXq0RbEcDBdoD00C~~E&>1nY3wcn00C$6E&>1nb@(m<00C_NE&>1na0D*`0RnOWI&)+NfC?`H00D0hF9HAoZ5%HG00DX;F9HAoX(%rO01IbxcXn-KWN>U~axO0dhz0=A1^@~N05}H#Vg~?{2mr_k0Qd+1b_oE~2><{AIy5f=0R(stI&^7dVlRR~3jmG_0JaMN00DDoF9HAoZ+tHT00C`+F9HAodWbIq00U`aa*i(o#ts1J4gdfFI#d{f00DHOF9HAoW2i3z00CvLF9HAoaz%835!N0CXAv)EWRt8vq6{f|MHodK>_39RL6UX$&v|00D1kDgpojWI!+i00Ch}FaiJpXiP8y00DDSFaiJpWmqr*00DGfFaiJpVPr4@00CucFaiJpa&RyL0RWc(00C!wFaiJpVSq3K00DG{FaiJpbBr(o00DB6FaiJpWtcDm00DHKFaiJpbEGf=00CjDFaiJpW3Vs+00DQlFaiJpZ@e%900CseFaiJpVaPB700C&uFaiJpbJQ>b00Cv%FaiJpcHl4q00DC5FaiJpW$Z8l00DFIFaiJpW%w`x0RWf)00CzNF#-SqVF)n-00DFkF#-Sqa}+TG00ChdF#-SqY#=cL00DF+F#-SqVJtBM00DP0F#-SqZ#Xdm00Cq^F#-SqVMH+k00C%9F#-Sqb5Jn?00D1SF#-SqbX+k400DPmF#-SqVQ4V|00DAtF#-Vqng9R+DS9yi0Rfo+D1I@500C}%00C^CF#-SqaHKH;00DEVF#-SqVX!d*00C^aF#-Sqbi6SF00CjbF#-SqcgQgU00D2#F#-SqWYjSN00CjzF#-SqXy7pd00d)lWOH^f0{$=pbTIG6DbrdO$J)00C)6G6Dbra!fJ;00CuEG6DbrbXYP100DDeG6DbrVPrA_00DApG6Dbrb8s>O00CikG6DbrY%0RX5700AkaGXentrwAyhGlBpCZmu%|00C*XGXeksXS_2400DKvGXeksY{)YL00D5$GXeksa?~>d00Cv%GXeksWZ*Lb00CjLXC^cP00ChtGy(wtWCs8NDK<0$0RdwNC^|HP00C}5Gy(ttX-G5z00C!CGy(ttbyPG000C@TGy(tubZ{^<0$?-(00C}hGy(ttWpFeC00CuoGy(tta(pxb00CoyGy(ttbBHto00DH4Gy(ttX_Pbq00C^8Gy(ttaG*2-00DERGy(ttI;=DT00BC(G=cyDZn!i800CvbGy(ttWyCZB00DB!Gy(ttW6(4L00DE>Gy(ttblfxo00C*@Gy(ttZ0Ixs0RTV^00C$8Gy(ttVfZux00DIVGy(ttZv-_000ChNH39$ua}YHG00DCrH39$uZyYrO00DF&H39$ucPKRi00ChxH39$uax^sp0RTb`00AjLH39(vK@BKGHG%*EZb~%*00C)IH39$uXIM1?00DJgH39$uY-BY800D4nH39$uZ*VmN00CikH39$ub9^-d00LxlIyC}A$@00C|sHv#|wX(TrS00CzzHv#|wbuc#q00C?^Hv#|wa6C5x00C%1Hv#|wbVxS>00D4LHv#|wWmGo;00CrLHv#|wa$q+C00CuYHv#|wWNbGA00C}tHv#|wWq3CN00U!Wa+Wp%3^xLPHv#|wI)pa@00BCZH-Z2GXqYzw00DHKHv$0w>J9(_XR0>>00CjHHv$0w><$0{DY`cT0Rig{D84s>00C~qHv#|wY0NhQ00C#xHv#|wb=Wro00C^?Hv#|xba1pc0^~OW00C#}Hv#|wZuB<-00C+GHv#|wWB@n<00ChJI066xXbd<400DCnI066xWEeOC00CtlI066xawIqc00D9;I066xWiU7b00Cw;I066xWjr_n00Cq|I066xI!HJI00BBqID!BHXH+->00C}VI066xX<#@400CrXI066xVQe@800C%nI066xb9guc00AI=I066xWP~^Z00Cu+I066xa*#Lz00DBAI066xWt=zy00MAkq&EVhI066xWvDm;00BCxC4v9}a=17G00CvbI066xdc-&a00C*rI066xa?m&e00CvzI066xblf-s00DF2I066xVdyvl00DCDI066yIv~a*g7i2700DFQI066xa0EF500ChNIRXFyZ4fyE00AHtIRXFycN{qa00D0zIRXFyWGFcT00ChxIRXFyXf!zj00DD4IRXFyAV4_+00Cr1IRXFyWlT8&00CrDIRXFyVOTi=00CoOIRXFyW2`6w00BB`IRXFyI&e9H00CikIRXFya(p=g00Cu!IRXFzb8Tcf0*E;R00Ci+IRXIya|ZwcDV{k30ReIcD55!n00C~OIRXFyX|Op000C#VIRXFyb-XzO00C^mIRXFyaL73V00C&uIRXFybJRHk00Cv%IRXFyZQwZq00DC5IRXFyW$ZZu00Ct3IRXFyZumI@00CwGIRXFyas)a800BA*IsyOzIuJU700C$gIsyOza~wJX00CtpIsyRz&j$bjDK0t!0RhejC^9;N00C||IsyOzX+Syx00C!4IsyOzbxb+}00C@LIsyOza9BD500DAdIsyOzWn?-600DYxIsyOzX>d9M00DA#IsyOzWqdjU00DG@IsyOzbBHb5x00BD6I)VTJa?m;g00CvzIsyOzdfYk!00C*@IsyOza_Bk&00Cw0IsyOzbo4p`00DFQIsyOzVE{V<00D9aI|2X!XU;1E00CtZI|2X!bQn7V00ChhI|2X!Wh6TS00D9;I|2a!JqQ2+XEr+m00Ch-I|2X!bU-@-00DAFI|2X!WlTE)00CxFI|2X!W>`A{00DJgI|2X!Vq`l400C!eI|2X!Z*V&T00DG%I|2X!cYHen00CiwI|2X!a)>(u0RTP-00C!|I|2X!VVFAt00DHKI|2X!a-=%~00CvHI|2X!X0ST~00CyUI|2X!b-X(Q00CmcI|2X!XUIDO00D2#I|2X!bksWn00Cv%I|2X!df+<(00C*{I|2X!a_l<-00Cw4I|2X!boe_000DFUI|2X!VFWw^0RTV<00AiwJOTj$KL{ukJc0lLZW=rS00C(tJOTg#XDB=Z00DI_JOTg#Y&1Lq00D41JOTg#azH!+00Cu2JOTg#W=uQ+00CxFJOTg#byz$C00ClNJOTg&V`Oq?FgpT{I|2$k0%SY_00BB`JOTg$AUX^?0(?Az00DA>JOTg#WsE!m00Cx_JOTg#W|%wz00DKLJOTg#Vx&9*00AwkJOTg#Xz(in00CvTJOTg#bi6zQ00CjbJOTg#Wym}N00DB&JOTj#=?DM;XWBdh00Cj%JOTg#bmTk&00DC9JOTg#Wbix!00C(BJOTg#Z~Qz000DFYJpup$cL+TK00ChRJpup$auhuR0RZa=00Ai=Jpus%>If(#J%RuMZYn(j00C(-Jpup$XE;3q00DJAJpup$Y(zZ*00D4HJpup$a!@@200CrHJpup&V`OO5JOUa$0$e=;00BB;Jpup$I&eLL00DA#Jpup$WPCjW0RRIE00C!+Jpup$VT?Tj0RROG00AkOJpus%1PUmeJ%RuMZlXN`00C*LJpup$XRtj200DKjJpup$Y`i@J00MMyl05>#Jpup$XUIJQ00C~&Jpup$Y1lmi00D5`Jpup$aO6D#00Cj@Jpup$ZSXw;00Cw8Jpup$Zu~t000D0TJ^}y%bO=5I00BA>jU00C!uJ^}y%b$~ts00C@BJ^}y%W28O;00C*LJ^}y%aIiiC00DBgJ^}y%WxPHD00CseJ^}y%Zpc0Y00CvrJ^}y%a@0No00BDMJ^}y%I^aHn00DC5J^}y%W$Zoz00C?AJ^}y%WB5J-00C+KJ^}#%bq)XlDGEOV0ReOlC=Ne@00C|kKLP*&X&gTS00CzrKLP*&btpdq00C?+KLP*&a5O&x00DD4KLP*&Y(PH(00Cu2KLP*&cuYS600D1OKLP*&c33|G00DAdKLP*&Wn@1B00CrbKLP*&Zg4*W00CuoKLP*&a(q7m00BCJKLP*&I*31l00DE3KLP*&Y?MC&00Cv1KLP*&c%VN500D2NKLP;&h!6k)XR<#600CjPKLP*&bi6+T00DHuKLP*&Wyn7Q00C#tKLP*&a@0Qp00CjzKLP*&bl^V%00DC5KLP*&W$Zr!00Ct3KLP*&Zuma}00CwGKLP*&as)sE00CtRKmq^(dJsSY00C(hKmq{(ix2<-DI!1u0Rf5-C?-IH00C|+Kmq^(X*56r00Cz@Kmq^(bwEG@00C@9Kmq^(a7;h~00DGTKmq^(WmrH000C!SKmq^(a%4aP00CiYKmq^(bZ|fd00DA#Kmq^(Wqd#a00CrzKmq^)b8Z|!0*F8Y00Cu=Kmq{(i4Xt*XP!U;00Cj5Kmq^(bf`cA00DHaKmq^(Wwby700C#ZKmq^(a=<_W00CjfKmq^(bj&~k00DB+Kmq^(W!OLh00Cs)Kmq^(Zsb4$00Cv{Kmq^(a_~R`00D3IKmq^(bo@X900DObK>`2)VF*D200D9iK>`2*a%7l50u(_400BB0K>`2)IwV1Y00DF=K>`2)WiUYk00Cz`2)ay&r-00Ch_K>`2*c66*i0!Tpu00M9z1U~{!K>`2)a#%qE00CuUK>`2)WN1MG00C}pK>`2)WpqIT0RT`B00Ak0K>`5*PY)=BL4p7QZi+zy00C)|K>`2)XP7|(00DKLK>`2)Y@|T~00D5SK>`2)bFe`I00DHiK>`2)XuLrJ00C#hK>`2)X~;nW00C^yK>`2)I@Cb|00BDML4p7QbKpS&00DI7K>`2)XzW1(00C$6K>`2)Y4||`0RXcQ00CzNLIMB*VF*G30RXiS00Ai!LIME+v=As5LV^GRZXQAc00C(xLIMB*XDmVj00DI}LIMB*Y&b#!00MMy4nhJxLIMB*ZA3x>00D1KLIMB*Z&X4800C@TLIMB*Vqii700BB?LIMB*I&4CM00C`sLIMB*Z+Joi00D1)LIMB*Y=lAr019(tV{K<>baHHBMm7SnI0BeC0w_8Husi~SJpx=l0(wCL{y_qYLIMB*I*>vF00%m7ZFXgJWV%9vSRVicB>;*g07fPNEGYoSDF6Tga==0Y00Cv*LIMB*WaL5u00D05LIMB-Wp82dLIR8`0PZUQ0RUSL00AikLjnN-S`H`(LxKPSZVp2N00C(hLjnK+XB0RSfj00Ak$LjnN-CIu+OLxKPSZpuRf00C*zLjnK+XV^mm00DL0LjnK+Y~(`%00D67LjnK+W$;4+00D0HLjnK+W&A?|00CnHL;?T3FS00C!mL;?T-b$CPq00C@%L;?T-aD+qx00DH0L;?T-b&x~?00D58L;?T-Zk$8{01InpZDV3^YGG(~X%0F7wmJZ0I{=b90Ny(Q-aG(sJphzF0MtDITs{DzL;?T-I;cbf0R>3`I(1`VV%9{0z&-$~KmZ&>0KP;300DH|L;?T-b@W6600MAj`a}Z$L;wK*!3zKZDGEgb0Rg}ZC=Nw}00C|kMFIc;X&glY00CzrMFIc;btpvw00C?+MFIc;a5O~%00C(_MFIc;bwEV|00C!4MFIc;ZA?W100C)IMFIc;I#@*l00BB)MS=hUZe&FQ00D1mMFIc;X>dgX00DG%MFIc;VSGgb00DA>MFIc;XNW}t00Cu=MFIc;bd*H`00C~AMFIc;X`n>{00n7cWpp4gMF3t!0DwgRz(xS3MFIc;X{<#800DKvMFIf;KM4QZFM@@NB~kv0MJH)00C{*MgjlT0Rim@D6U6>00C~aM*;u=X}m`Q00C#hM*;u=b;w5o00C^yM*;u=aMVWv00DB^M*;u=Z{SA)00DI7M*;u=W9&x)00Cw4M*;u=aQH_800DFUM*;u=ZUjgI00C(VNCE%>a}Y=Z00CzfNCE%>ZX8Gg00C(tNCE%>bSOvy00DF^NCE%>Wi&_v00DD4NCE%>IzUJQ00BBiNP++Xa!g1900D1ONCE%>bXZ6N00CoONCE%>Wn@SK00D4nNCE%>b8tuk00C}xNCE%>X?#cm00AI^NCE%>bBIU+00C!?NCE%>Zj?v@00C*5NCE%>bf8EA00L}uq(=g#NCE%>Wvoa70RZ*`00AkyNCE)?^#drtNP++XZpKIg00C*vNCE%>XVgdn00DK{NCE%>Y~V-&00D63NCE%>a_mR~00D3ENCE%>bofXD00CqENCE%>WdunA00D3cNdf=?a}Y@a00C|mNdf=?X&gxc00DU-Ndf=?bSOyz00C((Ndf=?bTml<00C|~Ndf=?Wk5*+00BBiNdf=?I!sA|00DARNdf=?Z&*nJ00DGfNdf=?V`NDJ00CucNdf=?aBxWi00DD$Ndf=?ZhT1s00C)&Ndf=?Ac#o<00DW9Ndf=?bd*T~00C*5Ndf=?bf8HB0RSZp00AkiNdf@@Bn>FANrC_YZnjAR00C*fNdf=?XT(VY00DK%Ndf=?Y|u#p00D5;Ndf=?bKFS+00Cp-Ndf=?Y3NA;00DIFNdf=?bM#3900C+GNdf=?bO1^M00ChJN&)}@bPP%Y00DCnN&)}@a~Mhj00CnjN&)}@Wh6=h00BBGN&)}@IxtFt00DD0N&)}@V?0U%00C)2N&)}@bVy1900DDON&)}@X;exA00DGbN&)}@VPHxE00DGnN&)}@b8Jci00AI!N&)}@b9hPu00M4frbz;RN&)}@I))R100Cu=N&)}@Y?Mj@00D2BN&)}@bD&BB00BBo9D)D=bF4}N00D2ZN&)}@ZMaGT00DZwN&)}@X~aqb00C#pN&)}@Akazz00DB=N&)}@W!y>v00Cs;N&)}@Y3ND<00C_7N&)}^ZfvGX0`y7(00D3MN&*1@&;$00C?+O9B7^a5PH-00Ch-O9B7^azIN000Cu2O9B7^ZA?o700CiAO9B7^V^~W900C!SO9B7^b!1Bd00ClZO9B7^WpGOZ00CrnO9B7^I($n400BCJOM(CaVTelt00DB2O9B7^Wt2+-00C{9O9B7^VW3L_00CpBO9B7^AgoIQ00C#RO9B7^b+}6c00CmYO9B7^WyDJY0RVyq00Ak`O9BA_fd(klOM(CaZrV!%00C*@O9B7^XXr};00DLGO9B7^Z1hV400D6NO9B7^ZvadJ00C_VOacG_dJIeg00C(dOacG_XBbQZ00C_tOacG_awJRw00D0*OacG_W-v?w00DD0OacG_Zaho^00Ch_OacG_a!5=900DGPOacG_I#f&o00BB$Oo9LbZ(vLU00C`gOacG_dTdMr00C)oOacG_XLw8k00AI=OacG_ZG=n$00DA}OacG_Z;(s^00Cx}OacG_bDT^900C~IOacG_VW><30RY+#00AkqOacJ`*$ybUOo9LbZoW(c00C*nOacG_XUt3j00DK1f00DR!O#%P`Zy-$q00CkqO#%P`Y%EOz00D0@O#%P`Z#Yc?00DG9O#%P`Iz&wZ00BBmO@aUccu-9O00D1SO#%P{b7JI70$fc300C@bO#%P`Z){Bh00MGvu1o@QO#%S`QwRV7DS}M`0Rd77D27df00C}{O#%P`X_QR@00C#3O#%P`b)ZcG00C^KO#%P`aI8%N00DBcO#%P`Z@5hY00DHqO#%P`W5i7Y00CvnO#%P`aL`Qx00DE>O#%P`Zrn`*00C*@O#%P`Wav!-00C_7O#%P`a`a6C00D3MO#%P`cK}WT00BA%P67Y{It)&N00D9mP67Y{Zx~Jj00DF!P67Y{V-X@00D58P67Y{Y@AL400Cv9P67Y{Zm3QI00CjHP67Y{aI{VW00DElP67Y{W57-V00C*nP67Y{a?DNw00DH;P67Y{W!O#v00C{@P67Y{I^<3Q00BDcPJ#ddZ17G300Cw8P67Y{Zv0LH00ChFPXYh|a0pKV00AHlPXYh|a}-Yk00CnfPXYh|X&_Gm00D9)PXYh|bSzH-00Ct(PXYk|MhyS~DLzjE0Rcq~C_+zy00C}DPXYh|X;4oB00C!KPXYh|bzDyZ00C@bPXYh|aA;2g00C@nPXYh|Z*)%r00D1$PXYh|bbwC+00Cu&PXYh|bBs>{00DK9PXYh|VVF+>00D5GPXYh|d8AJQ00CjDPXYh|Y_LxP00D5ePXYh|I=oK;00BC}Pl5meWyntg00DE(PXYh|b<|G+00CjzPXYh|aNth@00AK8PXYh|dF)RD00Ck0PXYh|Z1_(C00?tsV`Ox9ZE&_o0)$Ee1WN+SO9FUJ0%lGEI8OrpPXYh|Is{Mx00BBCP=Wvgb7Cw|0$57`00C?=Pyzr0Z*FotPy!fA04_=Z00UuiZ*E8c2uA`!Pyzq~bUMgO03sWL00DDePyzq}ZfH;f00D1qPyzq}X>?Em00MJldQbwuO#lD^X@F1y00C@@Pyzr0ZESA1O8}5i0@_ai00wn$a$#s?mP-JZPy$|10LD=O>`?$rQUCz}5(oeRDZWqw0Ra&RD8f*J00C~uPyzq}Y0yvt00C##Pyzq}b=*(_00C^`Pyzq}aOhA100DFEPyzq}bo5XH00C_JPyzq}bpTNU00ChJQ33z~W(-jR00CtZQ33z~WEfEb00D9yQ33z~Wh7Ao00CqwQ33z~ZZJ^-00Ct-Q33$~`Un64DMC>K0Rj04C`M6&00C}HQ33z~X;e`H00C!OQ33z~bzo5f00C@fQ33z~aBNWm00DDyQ33z~ba+t$00C@%Q33z~b%ap@00Ci&Q33z~W{^<=00Cu|Q33!0a%4PF0-R9-00BCpQ33z~I;>HG00DEdQ33z~bhuFh00C^iQ33z~b;MBu00LoU%25KwQvd)0Y-Wy90MJna00d=nVQJb?0^C#pqE!I2SpWe56$k(UWcE=400Ck8Q33z~WdKqF0RR>V00CtTQUU-0bP!Sk00C(hQUU-0avV|u00MG%22uhdQUU-0VJK1p00DF|QUU-0WjIm-0RR^W00Cq~QUU-0VMtN}00CuAQUU=07zh9XWm-}K00DGfQUU-0X=G9Y00DApQUU=08VCRZDRxo<0Rb5ZD0)(Y00C}*QUU-0X^2t+00C!?QUU-0b(B&900C^8QUU=2y%2CHpi%+=Tz~)sZE|;WK2icyQUY*N0;W;|00DHeQUU-0WyDef00DE#QUU-0bI?)(01IJra${*`Y;|{ZXx35!@>>APTmULv0J2>G+FbxvUI5Tu0484mdS3w2UjP6BI^0qM0R`<4X<}n^IviR6P+9?00DDCQvv`5a&vBVWAs@7NK*nxX8^ot0B~sl0RSWg00AjvQvv}2BLygEQ-S~iZf;Wo00C)sQvv`1XM9rv00DJ^Qvv`1Y=~0=00D50Qvv`1aFkO500Cv1Qvv`1bf8lL00DERQvv`1WUNyH00CvPQvv`1c(_vn00C*fQvv`1X2eqh00BD6Qvv`1I?z*s00D5;Qvv`1W!zH&00DI3Qvv`1bLdk700AKGQvv`1W%N@500C|KQvv`1X#i9L00DFcR0044b0B02YXA&X0zPX100CqYR0042Wgt`n00MYyCR75RYybfO{R993DK=CB0Rj93C^}Sv00C}5R0042X-HH800C!CR0042byQRW00C@TR0042a9~sd00CiUR0042a%@xr00CukR0042ZFp1y00CisR0042V}w)!00Cu+R0042WspxBYR08N!0@!W<0RVvx00AldR0073fDR}CRe}HkZU$8X00C(ZRRRD3XB1Te00DIxRRRD3Y#>zv00D3&RRRD3cPv!`00D0@RRRD3WH?m<00C}3RRRD3X+%{500DPORRRD3I#5*t00e1paykxg05)#`YHt8mRe}HkcU)Bh00D1qRRRD3WOP*m00C}#RRRD3X@FG%0RXKA00AkCRRRG4tOh8MRe}HkZkAO700C*9RRRD3XQWjE00DKXRRRD3Y_L@V00D5eRRRD3bG%go00C^mRRRD3Wyn*s+00C_BRRRD3We8RR00DRoRssM5Z)Fr#0up`z02Od&b#ilQbYo;;ab<62cXnuMY;9u5E&`M<0y;1P_Cf+gL;_ky0#Hx_q)-CnQ36g=0-|XEBx(TOY5?w30)|xr8dd_}egGDL03Lz>G=cy`h5!HoIwV#C0RRF300D4-RssM4aD-L@00C%aPC$D00D6FRssM4X!uqF00A!kRssM4ZUk2X00D0bR{{V5X%JTe00DFsR{{V6cw^{R0vuNY00AzZ5&{4LZY);<00D0@R{{V5X*gE`00DG9R{{V5VMJE~00C}FR{{V5X;4=J00ClFR{{V5ZCqCZ00D1eR{{Y5qYD55aBf!u00D4vR{{V5Xn0ow00Az3R{{V5bc9y|00DK1R{{V5aFAC500C~6R{{Y56bt|XaH3ZN00D5OR{{V5XslNP00AztR{{V5Zn#$h00C*fR{{V5XT(Kwl00DGXSpon7Wn5VT00C!WSpon7a%fos00CicSpoq70T2KIaC%t+00D4*Spon7XoOh;00AzFSpon7Zjf0500C*1Spon7XPj9A00DKPSpon7Y^YfR00U%na5`B6bXfwfSpoq8=LIjcS%LroX~J0o00DK%Spon8VQ0`-0?=6k00M4p23P{tSpoq72LJ#8aOznC00D6BSpon7X!KbE00A!gSpon7X8>9P00C|WS^@w8X$)Ed00D3kS^@w8a2Q$w00ChhS^@w8Z6sO(00CbrS^@w8WiVO-00C|`S^@w8Z#-H80RW{300D4FS^@w8a7-qbWU3W00CuITLJ(9XIxtX00DAhTLJ(AZ(+(>0%%(T0RR#J00D4#TLJ(9aC}<=00C%%TLJ(9E{IzK00C}}TLJ(9X_Q+600C#3TLJ(9b)Z`U0RSxs00D5UTLJ(9aIjkf00C&WTLJ(9F1%X;00CvfTLJ(9bjVu*00DH)TLJ(9Wz<^&00C^;TLJ(AY+=0BXAoTi00CqcT>=0BX&hYw00D9$T>=0Db8up`TmtS~0w`Sq0Riv^FD_kz00DA5T>=3B4FdoHa7tYQ00D4LT>=0BXjEMS00AyqT>=0Ba$sEo00CuYT>=0BbZlJ$00DDyT>=0BVR&5v00CouT>=0BUxZx(00DH0T>=0BZjfC900C*1T>=3BbOrzcaH3rT00D5OT>=0BXslfV00AztT>=0BZn#|n00C*fT>=0BXT)6s00DK%T>=0CZ)}`h0?=Io0RV*t00D5|T>=0BaO7PA00C&~T>=0BF7RCf00DCLT>=0BW&B+N00DFYUIG9Ca|m7n00ChRUIG9CV-#Kj00CbbUIG9CbRb>=00D0%UIG9Ca4cQ|0RXE900D3~UIG9Ca6DcD00C%1UIG9CE=XPi00DANUIG9CWmH}Q00DGbUIG9Cb6{Qq00CiUUIG9CV{Bdm00CceUIG9CYt500DHCUIG9CW1L00CjrUIG9FaC2m1)?ETJUIMgU0@z*x0RevxFWz2)0RR>Q00D6LUIG9CaQt2Z00C$MUjhIDE(l)&00C|eUjhIDX%t@q00CzjUjhIDbs%2?00C?!UjhLDr3e54a57&400D3|UjhIDXgps600AySUjhIDa!6kS00CuAUjhIDdQ@Km00C)QUjhIDa$sKq00CuYUjhIDbZlP&00DDyUjhIDVR&Bx00DA-UjhIDUxZ%*00DD~UjhIDVUS+}00C^4UjhIDbevxT00Cj5UjhIDU#MRK00DQdUjhIDZ?s00DG@U;+REVTfP?00Cc)U;+REca&fP00D2BU;+REWT0RI00Cj9U;+REXsloY00MAxRA2(KU;+UG5)5B28ejsrV1fVvbHZQ(00CjnU;+REY}8-^00DH`U;+REVc=i_00MJg@LmGuU;+REckEyS00L!iL|p>*U;+REWc*+P00ChJVFCdFHv|9ya1vnx00D3oVFCaFXdGbz00Ax{VFCaFZzy2`00ChxVFCaFb2MQB0RUnU00D47VFCaFa71AO00C%9VFCaFE>K|t00C}RVFCaFX8%00CphVFCaFbIf4^00CdpVFCaFbl71600C*WfVgdmHN)azGVuAnxZaQKD00Ct}VgdjGWk_NI00DANVgdjGV^m@S00DDaVgdjGUtnSa00DGnVgdjGX>4Kw00C@rVgdjIXmfB3VFHq20(fEq0RXxH00D4}VgdjGaFAjG00C&0VgdjGE}UWl00DBMVgdjGWvF5T00C>RVgdjGW3*xd0RUVH00D5oVgdjGaKvH)00C&qVgdjGF3@5E00C~+VgdjGY20E000C#>VgdjGb?9OO00L=jx?%$EVgdjGaP(pV0Rg81FaBbJ00D9YV*&sHWej5i00C2w00CuoV*&sHa(rU~00DA>V*&sHWr$+}00Cx>V*&sHWt3wA0RYts00D5IV*&sHaHL}b00C&KV*&sHF0f+)00C~cV*&sHX}n_s00C#hV*&sHb;x4^00C^yV*&sIWN?~e0@Pyy0Rg@MFWO^*00C#@V*&sHZtP<%00C$kWdZ;JE+AzB00C|$WdZ;JX)I*|00Cz*WdZ;JbvR`L00C@1WdZ;KWN->)0z_p30Rc%7FG^*C00C%JWdZ;JbX;Wu00L%k(qsZ+WdZ;JWoTsr0RY1R00D4#WdZ;JaC~I~00C%%WdZ;JE{J6U00C}}WdZ;JX_RFG00C#3WdZ;Jb)aPe00C^KWdZ>JX#@ZPaI$3r00D5eWdZ;JXuM?t00Az-WdZ;Ja>!)@00CsqWdZ;KaA>S$0@P&!0Rd|RFWO~-00DC3WdZ;JWb9=E0RR#M00D6LWdZ;JaQtNg00C$MW&!{KE(m4<00C?cW&!{KVH9Qp00C|qW&!{KZy;s@00C(xW&!{KbS!2900Cn%W&!{KWjJO600DA7W&!{KX+&lM0RXfJ00D4NW&!{Ka8zaj00C%PW&!{KE?{N?00DGnW&!{KZfs@(00C)oW&!~KJ`(@|aDHY200D4q3N@fDGW&-490z78|0RdG8FG6R600DDUX955LbX;cw00C%XX955LXJ}^v00C)kX955LU)&-B00CrrX955LWq@Y_00Cr%X955LVT@-200Co?X958MRTD2vD1rb1VV-9K00DBQX955LWvpic00MJum}dgAX955LVYp`k0RU1100D5wX955LaLi`{00C&yX955LF4$)R00C~^X955LY2;@D00C#}X955Lb?|2b00C_FX958L!v_EXZ~|xo00D3YXaWEMXbflq00Ax%XaWEMau{d=00CtlXaWEMdL(E900C(#XaWEMaxiED00Ct-XaWEMbUbJR00DDCXaWEMVMu5K00DANXaWEMUsPxU00DAZXaWEMWngFm00CxZXaWEMW^8Bz00DJ!XaWEMVt8l*00CcqXaWENaA*8y0)%J+0Rc1(FN$b_00DB8XaWEMWt?aN00DZUXaWEMX{cxd00DBYXaWEMWwdAl00DHmXaWEMbHHc<00CjfXaWEMa?EG~0RS%v00D5=XaWEMaNKAD00C&?XaWEMF6d|i00D09XaWEMY4m6U00C$EXaWEMbpUAs00C?UX#xQNr3wH6a1v<(00D3oX#xNNXdGz*00Ax{X#xNNawus600Ct#X#xNNW;AI600Cw?X#xNNbwFtX00Ck~X#xNNUrcEN00MAl3~2&VX#xQPHUwWU(r5x$X@UR&a$;!$00CugX#xNNW^`!+00CxtX#xNNb%1FC00Cl#X#xNNUyNx20RUA400D5AX#xNNaGYrZ00C&CX#xNNE~se&00C~UX#xNNX|!nq00C#ZX#xNNb--x?0RZR*00D5!X#xNNaL{Q200C&$X#xNNF5GDX00C^`X#xNNZ|G?P00L}p#%TiXX#xQNt_1)AaQ2D00C$=Y61WOE<9=i00DSHY61WOWk_lQ00DGPY61WOa#U&p00CuMY61WQaBX(<{AaC&P300D4*YXSfPXoPD500AzFYXSfPZjfsN00D27YXSfPX`E{U00DHOYXSfPX{c)g00DEZYXSiPAq4;daJp*(00D5mYXSfPXvAv*00Az_YXSfPZqRE200C*%YXSfPXWVN700DL4YXSfQZ)~({0_bZ300CbtDFOfiWcX_W00C_NYXSfPX#{Kn00C$UYytrQaR&eaa29L=00D3sYytoQXdr9?00Ay0YytoQbS!KF00C|?YytoQWjJgC00DA7YytoQVMJ^K0RY7e00D4NYytoQa8zsp00C%PYytoQE?{f|00CrXYytoQY;0@-00DAxYytoQZ+L7100MA#N^AmtYytoQUxaJ|00D1~YytoQbd+oY00Cc`YytoQY@loc00Cj9YytoQW2|ff00D2ZYytrQ@CX0_aK3B;00D5qYytoQXvk~=00Az}YytoQWz=i}00C^;YytoQVc={600Cp>YytrQW)T1ZaPn*d00D6JYytoQX#8vf00AxnZ2|xRZU}7x00D0fZ2|xRX%uY&00DFwZ2|xRVIXY+00DF+Z2|xRZ!B#B00nSkY;$t%YXT5#0=R4f>}&!uZ2|!S(giO#ZGr#+ZBA_h00DAVZ2|xRZ(MBx00CxVZ2|xRb7*Y>00C}pZ2|xRVRUT*0RYYq00D4-Z2|xRaD;6F00C%1l00DBqZ2|xRZ^&%|00DH)Z2|xRW7KT|00Cv%Z2|xRaNunM00DF6Z2|xRZtQIW00C+8Z2|xRU-)eT00DFUZ2|xRX9R8n00C|aZUO)SX%KD#00DFsZUO-S_5=U{a3XF300D3&ZUO)SXe@3500AyCZUO)SZa8iN00C(}ZUO)SXGCrS00DJMZUO)SY*20j0RZ<100D4ZZUO)SaA0l%00C%bZUO)SE^KZB00C}tZUO)SZ+LD300C)!ZUO)SbcAjK00Co)ZUO)SWsq(H00C^4ZUO)SWt?sT00MAxR&D~KZUO-TEe|iKZh`;-ZnACy00D2hZUO)SX~1p*00DHyZUO)SW6W*>00CvvZUO)TbZi`M0@!W>00Cv*ZUO-TKn5=$6M_H%W$tbQ00C_FZUO)SZ~Sfo00DCXZvp@TU%VRv00D9iZvp@TWfX4$00CqgZvp@TX&`R`00C?!Zvp@UZfpo|0xWL=00D0@Zvp`TtO5W5a6)ea00D4DZvp@TXiRSc00AyiZvp@TZdh*u00C)UZvp@TXJl^z00DJsZvp@TY;bP^0RUhG00D4(Zvp@TaDZ0RTD(00D5saRLAVaL92200C&uaRLAVF4S=X00C~=aRLAVY2a}J00C#_aRLAVb?k8h00C_BaRLAVaQJZo0RgE7FaB|Y00DCZasmJWV+?Wv00C(dasmJWbQp3100DCzasmJWX(Vz200DF=asmJWVK8z600DG1asmJWb3Aea00Cb@asmJWb4YRm00M4fzHtIhasmMW!3+Qaa9(l(00D4fasmJWXlQZ*00Ay;asmJWZgg@200C)wasmJWXMl1700DJ|asmJWY>aXO00D54asmMXKL#(Da)JN>Y@Tug00CvDasmJWZme400DB=asmJWblh?R00CvSXXApA&00DIta{>SXY#eg}00D3!a{>VYIS4N(bAkW?WiE3900DD0a{>SXbv$zd00Ch_a{>SXa7c3k00Cc4a{>SXc~o-(0RRyU00D4da{>SXaAb1=00C%fa{>SXE^u=K00C}xa{>SXX?$}600C!$a{>SYVRc$_0*G@000C@{a{>VXWC{QQaGrAl00D5Ka{>SXXsB}n00Azpa{>SXZnSd(00C*ba{>SXXTWm;00DKza{>SXY|L{400D5)a{>VYZ3!>fbAkW?Vcv5B00DC5a{>SXW$beT00C|Ca{>SXVfb?b00CqEa{>SXUj%dl00CzTbOHbYbr5s{00CkabOHbYWgK(@00?tqba!QKaAfFi0z7X5f^Y&NaRO9w0_buAm~#RmbOHeZCj&1ibbE?v0RU$J00D5&bOHbYaMW}H00C&)bOHbYF5q+m00D01bOHbYY3y_Y00C$6bOHbYb@+4w00C_NbOHeY&jbpikaaA^c}0yuR70RgiKFFtjG00Cu4bpikZXHazl00CiEbpikZZCrH%00Lua#&iN=bpinaW&kf}b%Fo^Z>SXl00DA(bpikZbbxgN00C}>bpikZZ;W*U0RU+b00D5AbpikZaGZ4l00C&CbpikZE~s?^00C~UbpikZX|#0$00C#ZbpikZb-;B300C^qbpikaV{npn0?c&+0Re^wFVb~_00Cj#bpikZa^!Ua00Cv{bpikZZSZvh00Ck4bpikZWBhdj00CbDb^-taWe9cx00CtVb^-taaujv~00Cwib^-taFCcb;00DC*b^-taY%F#H00C(-b^-tbX>@XR0yuU80RRpF00D4Fb^-taa7=ar00C%Hb^-taE?9N~00DDeb^-taZ)A1?00C`kb^-tadT@3E00C)sb^-wah5!HoaDsLM00D4@b^-taXpD9O00AzNb^-tabeMJm00Cv5b^-taXQXxl00DBUb^-taVX$@r0RRIK00D5kb^-taaKLr~00C&mb^-taF3ffU00C~&b^-taY1noG00C#-b^-tab>wye00C_3b^-tcXLN9Ub^^9`0`PVM0RaF7FZOnV00DCZcLD$bZwz+=00C_hcLD$bdKh;C00C(pcLD(bk^le!a4L5K00D3=cLD$bXf$^M00AyKcLD$bWk7cV00C!4cLD$bWK4Gg00C)IcLD$ba#(i)00ClNcLD(bI|u*)aB6n~00D4rcLD$bXmoc100LhwWOo93cLD$bWq@}A00DH0cLD$bbdYxf00Cu|cLD$bY@Bxj0RUnH00D5QcLD$baIAL%00C&ScLD$bF1U9B00C~kcLD$bX~cH|00C#pcLD$bb`Z00Cu2cme|(00C#dcme9Z00D63cme(|datL_>00VGsXWVxJn0NvXc>)0eeGe}bd4d1|b0T>H00C?&c>(|dWiWXH00DS5c>(|dZ#;Pd00A$y5rO~#b4Ymt00DGPc>(|dZd7>!00CuMc>(|dZeV!=00D1ic>(|daBO)300C`sc>(|dZ+LkE0RU_R00D4>c>(|daEN&V00C%@c>(|dE|hr!00DWLc>(|dbf9?x00C*Hc>(|dcC2{<00CjLc>(|da=3W{0RSWs00D5sc>(|daL9QA00C&uc>(|dF4TDf00C#(c>(|dZs2(W00C*{c>(|daO`;k00C|Cc>(|dVfc9h00L)ZzIg)vc>(|dF9dpm00DCjdIA6eWfXb>00CnfdIA6eav*vF00DI-dIA6eZ!CHO00DC{dIA6eWjJ~Q0RW;400D4BdIA6ea7cOr00C%DdIA6eE>wB~00CuMdIA6eY+!l<00CrXdIA6eZftr200DJ!dIA6eVt9H200CcqdIA6ebA);V00Co)dIA6eX^?sX00DEBdIA6ed7OFz0RUwV00D5QdIA6eaIAU)00C&SdIA9eAQJ!qaK3s100D5qdIA6eXvlg300Az}dIA6edDMCW00DH`dIA6eY2bPS00DO9dIA6eVeEPW00DCHdIA6eXZU&o00A%ldV&A~E_1kg0t9;k00C|adjbFfX%u?`00CzjdjbFfbs&2J00L-iqIv=*djbIfzzhHZa5j4a00D41djbFfXh3@c00AyWdjbFfZcKXu00C)IdjbFfXIOgz00DJgdjbFfY-D=^00D4ndjbFfFK~N;00DA#djbFfWqf-A00DM_djbFfY>0aT00D1~djbFiV{&kFet7~udIBta0+f3K0Rc%6FPeLT00DEXdjbFfW3+n$00C*bdjbFfbHIB700DW%djbIfU;_XFaMF7M00D5;djbFfXxw`O00A!IdjbFfW$1eX00Cs~djbFfb@Y1z00C_JdjbFfWdM8v00L-o%zFX`d;$RhzY8y(8iD`;a~6C800C|ud;$OgZzOyI00C(#d;$Ogb1-}Y00C(>d;$OgY&?7d00C@5d;$OgZ%BLs0RW5v00D4Rd;$Oga9Df-00C%Td;$OgE@XTH00DDqd;$OgXK;K100C}xd;$OgX?%PF00DG@d;$OgbclQc00Cu=d;$RgVFLgGaGHDq00D5Gd;$OgXrz1s00Azld;$OgZm@g;00C*Xd;$OgXS{p@00DKvd;$OgY{+~900MJxlzaltd;$Rhk_#`?e1ZT0bKZOc00C#_d;$OgZtQ#l00C+8d;$OgbohJ%00DIVd;$RgC<6cia0-0_00D3geF6XhXcT<{00AxwL200C}VeF6XhX<&T<00C!aeF6Xhb!>eC00C@reF6ahSP1|DaDIIP00D4200D4ZegXgiaA1A{00C%begXgiE^K}R00C}tegXgiX?T7D00C!yegXgib%cHb00C@@egXjiAPWEiaF%`o00D5CegXgiXrO)q00AzhegXgiWvqSz00C^WegXgiX}Ep@0RUtX00D5segXgiaL9fF00C&uegXgiF4TSk00C~=egXgiZ{U6c00DF6egXgjW@^5E0_=VQ0Rg`VFY00d!hVr^D_0+4Y00DH0e*ypjWsrXY00DEBe*ysj>;?bM6100C}RfC2ykX00C@Pf&u^mZ(M=`0RVjv00DVuf&u^mbZmkG00C)of&u^mc6fpU00Cisf&u^ma)g2c00MJoVuAvSf&u^mAdrFr00Fz2f&u^m!k~fz0Rb%$Af|!>00DEXf`R}6W3++-00C*bf&u^mbHIWE00DW%f&u^mXv~5F0RZ3%00DB?f&u^mW!!=S00Da9f&u^mY3PCi00DCDf&u^mW%Pmq00DIRf&u^ma{z+^00ChJg8~2natwn40Rfu;AQFQD00DCtg8~2nVIYG700C?!g8~2nbS#4c00Ch#g8~5nsSE%DAagi_0zQKR00DPGg8~5nsR#f8a#Di=00M7iOoIYeg8~2nWL$#+00CiUg8~5nWd{HOZgPVH00Cuog8~2nWqgAI00DA>g8~2nV~B$S00DE3g8~2nbd-Yv00C*5g8~2nY@mYz0RTe{00C~Sg8~2nZ?J;`00C*Xg8~2nbG(BB00DKvg8~2nY{-KG00Cppg8~2nW7LBJ00D2>g8~2nAmD=n00DI7g8~2nZtQ~s00Cw4g8~2nY50Qz00CnDg8~2nZ3Kh@00ChNgaQBoAP|HC00CtdgaQBoV;qD600ChlgaQBoa43WV00DC@gaQBoAT)#m00C|~gaQBoWk7@i00Cu2gaQBoa!iB*00U@nV{C&0rh@`fgaQEo#{d8UXl8^000DGrgaQEo?G69|XLf`F00C}#gaQBoX@G9iI00Cvjg#rKpdd!6a00C*zg#rKpa@d6e00Cv*g#rKpbmWBs00DFAg#rKpVeo|l00DCLg#rNqK?orHg#rKpasq||00CtRh5`TqW)Ow~00Cweh5`TqbsUBQ00Ckmh5`TqEhvTp0RZd>00D9|h5`TqWH^Qb0RRRH00C!2h5`TqZb*g#00C)Eh5`Tqa8!l@00D4Xh5`TqVPJ*=00C`gh5`TqAZ&&L00Cukh5`TqZg_?Q00D1)h5`Wqjtc+*a*Bom00Cu=h5`TqYm|lp00Co~h5`TqX`qGz0RVOm00DEXh5`TqY_Ns`00CvTh5`Tqc)W%J00D2ph5`Wqj1T|;bk2qX00Cvvh5`TqXV``U00DB|h5`TqVdRDa00MS&$c6&yh5`Tra3H3J0`P_c00DCPh5`TqWdw%;00CqQhXMcrZV-n800CtdhXMfrQ4atCb0UWV00DF+hXMcrXe@^U00Cz*hXMcrX*h=h0RXlT00C`8hXMcrZ%Bs%00D1KhXMcrY*dE=019(tV{K<>baHHBScC%7gaW380=$I+E`|a=h603!0vv||K8FHYhXMcrAYg|A00Fy-hXMcr!jOjo0Rg56AeM&$00DBGhk^hBWu%7!00CsGhXMcrZm@>}00CvThXMist^$Gy00DHuhXMcrb;yST00D5$hXMfrKnVZ=W!i@V00C#-hXMfr!V3TaZt8~u00D3AhXMcrY4nEz00DIRhXMcrVE~8%00D9ahynlsXAFn}00CtZhynlsbQp*N00C|uhynlsX(WgO0RajRAS#Fg00C(*hynlsbvTFu00LoWiUI%uZ-|Nl00Cx>iUI%ubCik#00C~AiUI%uVW5fv0RYSo00DTciUI%uZ?K9200CmQiUI%uY`lsB00D2piUI%va&M-J0?3L20RU7800DB?iUI%uZ`_Ik00DI3iUI%uW9W(k00Cw0iUI%uaP*1-00DFQiUI%uZUBn{00C(Rivj=vAPkEF00CqYivj=vY#56I00D9yivj=vZzPKX0RW~800C?;ivj=vWi*Qd00C|~ivj=vVL*!l00D4Divj=vAWVw_00DDSivj=vV_1s<00C)Uivj=va%77F00DGrivj=vWpIlE0RTr000Cuuivj=vbAXEi00DJ|ivj=vVT_9c00D54ivj=vAef5+00DWPivj=vVWf)!00C^Oivj=$b7f;>ba!oV=!gQ6i2@Fa0#u3u&WZvmivo6w00RR{d00C_Ti~;}watMq900D0fi~;}wW)zG900DCvi~;}wZXk>T00Chpi~;}xZ*u;N0xXOI0Ra9400Ch;00CiAi~;}wV_1v=00AIgi~;}wWn_#300Cuci~<1wB?SNhaCVFW00Cusi~;}wbbyQk00DD`i~;}wAdHLx00Cu^i~;}wZJ3M#00C*9i~;}wbfk;|00AJXi~;}wWU!0^00CvTi~;}wc)W}P00MGpaEt=Ni~<4xjRF7yZ((qa0*s9U00Co?jRF7xAe@Z?00FzAjRF7x!l;b`0s(^y300AHhjsgGyWe|=600C?kjsgGyVjPYF00ChljsgGybSRDj00CnzjsgGyWi*Zg00C?|jsgGyWT`v?F5bD)m`00DHSj{*PzY^;w000DKfj{*PzVYrV100Cycj{*PzWyFsH0szPf9tZ#dbI^|h00D2-j{*PzZQPFn00Da9j{*PzY3Ppv0RY4d00DFKj{*PzZ}^V_00CnDj{*Pzbp((C00CnPkOBY!AP|rO00D0nkOBY!Y#fjR00C?wkOBY!WhjsW0RVyy00DP2kOBY!Z#a+w00Cq^kOBY!ZbXm*00C)AkOBb!IS~K>b5@W700C}VkOBY!Z(xuD00C)ckOBY!b8L_T00C)okOBY!Y?|DWp#F8WM^o1W72{GyoUl#hypT<0?3R46paEpjRL-n0^*GVnvVj?j{@$G0xpmOP>=$OkOBY!Adrv(00FzskOBb!dJxCa6Twg*BG00Ai;kpck$_X9diNrC_YayF3y00D14kpch#bVQK?00Co4kpch#Wl)g<00D4Tkpch#b6k-E00C}dkpch#X=srG00wkzX=i0`NUs2{)ByC<05a78YSjSV)c^niI&_f&6blgm!3UfL%mM!dvj)Uk>i_})g8|J5C<>>500DFAkpch#W%Q8(00Mbwl#v4Zkpch#bO4e90|1}^f&iib00Aiwk^%q%d1>|#0GxpV00M7l9uWX`mH_|)aB13s0alg)01b3wZ)I$4b8cyHWNUUFk^(4_0!9%4bP)h*fdR^a0Wy*T$dv&ImH{f30g{#h%3=ZNVgUdFIy{mB0s@x{lM6a1J`#YI5r6;za(I#g00Cu&k^%q$WQ>vm00C^0k^%q$X_%4%00DKLk^%<=iwmOwNDL|sp8$aXp#Ug4Vq+MRf^w3Aq>=*8mH_|)d1{6;^8*tSUqzvW*@B=djTnlCkHwQrnc?$gu6%ED>+zlNIC~4G_f~o-m00(Dubzx*llLC;F0@{-Tv_JtcX955LZJOYL00Ct_lmY+&bVQT_00DDKlmY+&c~F!B00m`lb98YU-~mYB0ala(*5Cp1-~j*uAY7CJ00FyllmY<(CJj0;N`e3ZbAFTp00Co$lmY+&X^fNt00DH8lmY+&bC{F@00C*9lmY+&bflC500CjDlmY+&bg+~H00P2uc$5ORlmY|=`vhnMP7sg>Ixiq!b6~=OAoYQ~l!8KX0uo9B00DExlmY<(4*(#L-T?psZt9c*00D3ElmY+&Y50_a00DIVlmY+&VFZ-|00DXml>z_(X%LkH00C?kl>z_(VH}kL00C(tl>z_(awwGo00Ct#l>z|)Xapc6-vIytZaS3$00D18l>z_(X-JiV00DGPl>z_(VN{g@00DYhl>z_(X<(HC00C@fl>z_(VQiHG00C)ol>z_(a(I;j00Cuwl>z_(bA*)w00Cu+l>z_)b7VA?0+5vg00AJDl>z_(yP%Z<00F|Ll>z|)DFYy^l>z_(VX~D100DHmm4W~PVZfCF0RapHAfDs_00C~yl>z_(Z`75700C**l>z_(bl{Z&00Cp>l>z_(W$cv#00C_Bl>z_(X84r?00CwGl>z_(d3@yo00D9emVy8QbP$#T00CtdmI43)Z5);Y00CtpmI43)Y$%oj00Ct#mI43)XFBHr00C|~mVy8QX+V|&00C=8mI43)a!i&200D1OmI43)cUYDJ00DGfmI43)Wn`8D00d-mbZ*9#0tA)QX1eXFxmjZ5=0(h4KE|3D6mjVC*AfT5500FzgmjVC*!pN5b0RhDaAkLQp00Cvxmx2HRZrqmw00C*@mjVC*XXuv#00D09mjVC+V`Zq80`!*x00AKSmjVC*y9Ag500F`Zm;wO-oeLlkn1TQSa~7Ba00Ctlm;wL+Y$TWh00D3+m;wL+Z7`Su00L!l!1w`hg#Z8oZ(+Vk0AL>i0RS2d00DDQm;wL+WmK2~00DDam;wL+X<(QF00CoWm;wL+a%`9a00m)maAjjQm;yYQ0!Ekua+m@zVE_dHE&$UGei8Hud@Iw-W+fIQiN00DC3m;wL+W%QT=00DIRm;wL+X#kl500D9anF0a^kq;ySa(5_mFL2(N0t}e~`i6iWjRNH8fil?u00DFonF0U-ZZMew00Ct-nF0a;BMSlo00DGDnF0U-Zb+E|00DJQnF0U-Z&aBA0stfn0|Ej7Pz*y000AjxnF0aM-mngMG_Pc1qlEFDZZHk1p!796%a%c6A%OmD9V|F00CvtnF0U-W8j$r00DC5nF0U-b?lh}00D3EnF0U-bNHD800L=cwDbV}nF0s^iwqbGYz)y2(+yP%+zg2f00AiungR+1EeoX$iVPPEYYfm0(hXD#+YE>dY;q`ObddA_1eyXMnt~#g06LWb00CttngRd;b5NQB00LohR+<803<3lIJ`bG?d<-xK00AjxngRv^JrA4=dkilIeG7jKC~%sB00DV+ngRdUs0|1Q)IR+F800AldngRm>j0rdf6ACBz>&X?&al00DG{oB{v=X^fl#0Rb`*Xkq~X0R_|rY+o*Eb0Pr%gk1t)W&&J20hpWu00DHMoB{v=Zn&HR00L)a#ykKpc>w?cY{Z-b0RScg00D5+oB{v=aM+vz00C&;oB{v=F65j700D67oB{y?X$*BJ@SFnH|9}Gke-6Xb_zO00Ax*odN&>Y#f~e00nbtY;bRqoC3a_0?wQQ_M8GDodN*@uN0#=;@0Rcx1I>Jwa00CueodN&>b99{o00DJ+odN&>VSt?i00D4@odN*_q6%LqAaG7|0-&dXjGY3WPXYh}Zh2yz0+O8qJOBm(DgzM=6bu0nVgsWH0}x>lWe#TmVFNi0AqB?>!vUBHOA%EA8VO<$tp~seat;I#5&*pbtO8~STnU*Astm#mJ`;2Xzzp^TF9{nAf)RreX%J)zfDh&c4hE$M!3;VGV*@S(Ul2wJ)e312&JR)pJp&d4H3R?waIl>M00D3+o&o>?XfU1v0|Z1300Q~}Iw&qLg1dn9x_}(&0seY|0stBVZVmteWmKL500DJco&o>?Wni8H00DJoo&o~}OAy8Z4gxN7C~;plo&r3c0-(NtY@Pyk^Z@_?ZgQRi00C)^o&o>?XOx}-00Lokrkw(so&p8{xC+7%tq~OodH{R?00Akgo&p93w+g`#tPvCmc>sF=C}MSFV{K))o`M3~05JamX8!<+{{XK40N!{300C&eo&o>@baNW;0O+0q00M4pZ14aE_W=k1PYy{A9ub5P91$u3Z4aUX00Aiip8^U2P7X*89T9^N8xbi1Y!9IVqz3K=C={Q900Cqgp8@~@Wi+1x00DD4p8@~{b9QWWa6q2|dOQI7djhPP0g9{u0|RCTRt8uGE;=aI1OlptfsBQL00DDcp8@~@b8w#m00Cuop8^2@8VLXaaDtx#00D4@p8@~@XpEl%00AzNp8@~@ZkV3}00C*9p8@~@XQZD300DKXp8@~@Y_OjK0RS2j00D5kp8@~@aKN7e00C&mp8@~@F3g_-00DB+p8@~@W!Rqr00C#-p8@~@VdS3z00D05p8@~@Vep><00MArwx0s_p8^2@PznG6DF&bd0Rc}6C<>s000D9kpaK8^Wf-6W00CznpaK8^VI-ge00C|)paK8^VKATq00C__paK8^bUdH}00Cn{paK8^Wk{d`00C-FpaK8^Z&aWH00DAZpaKE_R0>iG00AjxpaKE`QwmWEC~TmD00C}tpaK8^WqhCl00D4M00CpJp#lH_WwfCJ00C;cp#lH_Z@{4f00DBwp#lH_aLl0s00BDEp#lO0dJcdGX)kR$aF9>{{GWnyp#s>Uf})`U00DH~p#lH_WB8#000CwGp#lH{V{mGGp8`h40R*A~00U`dZ}^@9MxO!-q5=c}uMZ9msR>&V00Ai`q5=g0t`7|ks0msTLkuV|qJjVcbT*;_00C}Bq5=Q|b7f()@BmDr0uEvT0suP*EeHSsaA2YW00D4jq5=Q`Xl$Ya0RTx200Aj@q5=T{NDU}_qJjVcZi1o$00C)=q5=Q`XON--00DKDq5=Q`Y@DJ300D5Kq5=Q`a;TyL00D2Vq5=Q`bhM%Z00C*bq5=Q`WWb^V00Cvjq5=Q`Wz3=i00DH;q5=Q`bl9Q-00Cv*q5=Q`Y~-Q>00Cj@q5=Q`aPXo600C_Fq5=Q`W&EN700DRcqXGZ{ZwR9T00DLmqXGZ{IuxS<0Rc)4IvS&b00D9!qXGZ{Zz!Vz00DF^qXGZ{X*8n(00Cq=qXGZ{Wk90>0t6QX6$D=>E+Axg0^)Rla-sr8qXGZ{WlW<200DGjqXGZ{bZDaj00CugqXGf~rVptCZzx)10Q``F00C%vqXGZ~a%^;SQlbKMqXLMd0@fP=00M1dG!O!KdIACoEfGl&ATMEJZC^TbaHfKSntOsc0svY9044+gprZnkE`r1@0$45r00DEVqXGZ{W7MMp00C**qXGZ{bKs)_00Mbw=A!}xZU6!Trvj7*FE0LKf}COk00DCLqXGZ{Wdx)G00CWw00Ai$qyhp0H4mKuD03X7f-JTG0s*uN+ypwj7=Zu*axkO<00Ct>qyhi|WjG4qyhi|Y;dFk00Cusqyho~xd`k8IvN;(00DA_qyhi|Wssx-00C{5qyhi|X`G}200DHOqyhl}a1dmuqyhi|Wv-+G00C~cqyhi|X}qKY00L|-!lVL>=m7u$Wyqug00m=icyM+Qqyi$O0)V6f(xd_o7XSbVWp8YCa$#s`PMiWLodTeq0`8sy7@`7>qXO)s0@$Pi1^}Q47yxStt_v9kECc`nbP%Ni00Chhr2+u~7z{3Y5CQ-JWh$it00eD!V`U_z0xHA-GNl62kpKV!c5(;+063)r0|H?O1qTNQIw&khfj&cl00DGVr2+r}X=J4W00CiYr2+r}a&V;r00VR&E_S5?P~iap`vC(25eFRyx)F0Ie5C?%LxBJRWQwH%00C^8r2+y084lzEIw*~S00C{Lr2+r}Ww50J00DHir2+r}bG)Sj0s?^%a}hcyjE;d)je!6GZOEkp00Cjvr2+r}W!$9#00DC1r2+r~d33_10_ddz0s@N)feJb(Y;1sDYk&X&W%#8600CzPrUC!~WDKSP00C(drUC!~au}up0swvvAPWEia3rPz00D3+rUC!~XfUP%0tK`W00DDfVlF!Fr2?h~0v@IUHl_mlk%0gMWo&djrUF0~0r2es00MMy@@fE%Qvv`1aAc+e00CugrUC!~babWy0RbfiI?z*s00D4-rUC!~Wr(H%00DH4rUC!~bCjk600AJHrUC!~WuT@400C{LrUC!~X{@FK00DHerUC#0b7XXZ0`h1pwv`2Lo3D&#I01k*0U~<=00DBar~&{1Wyq)k00Cysr~&{1X4I$x00DK{r~&{1V&JF(00Cv@r~&{1ZS1H50RjF5I;d2F00Ck6r~&{1asa6U00CtNsR952Z49Xb00ChVsR952V;HFd00MAhU{nH(ZU6uQVI-*n00D9?sR952Wi+V*00C_}sR952VL+(@00baoUt%7q0!FC<0(JtFApigYWlX6800eJgWof3U0`jN=Ua10x0{{aAf(XL|&kH(bb8apifp9?qfI$JcK>+{)Wps9_0t`3+0RevqWhh$!00C^6sR954a${*Q8Uc=}0-&h^0Ra0100DEfsR952W4NgT0RTh|00DEvsR952Zpf(u00C*vsR952XVj?z00DK{sR952Y~ZN^0RS@&00DFCsR952Z}6!C00Ct7sR952Vf?8A00D9WssaE3WC*GP0RU$a00DCpssaE3Wf-ag00C(pssaE3awMt(00LoU4ypnwssaE3bug*|00U)kalWYn=BWZYssaE3AV8`D00FyBssaE3!c?jP0Rg85AX=(|00CuSssaE3WN4}a00C)kssaE3b#$r%00C!ussaE3Ab_d@00Cu&ssaE3a*V1100DK9ssaE3beO6F0sx{2O$q=3aHOgN00D5SssaE3Xt1gR00AzxssaE3a=fYn0syQE^bP<4Dafh<0s^ZF^A2Sw!m0w!s)7IkXw<3#00Cp-ssaE5Wnpxjk^!Eo0_ds&00?hsb#h^IWo$~N0!pU>j;8`-sRE{{0vree?y3Sf$N>WaqXLlvlL9&@W00DG5s{#N4VL+<_00C}Bs{#N4X-umE00ClBs{#N4ZCI-U00D1as{#Q5Sp+&x+<^cAbZV;t00DJ!s{#N4aCoZ%00DGs{#N4Y2d2@00DI7s{#N5cw@w?0_>{-1PQJJf(c0h4+Aecbz>l5VsI|pSAy0=g1|liWUB(Gs{-tO5c6QwhZm00AjBtO5%HQVGNk0|2oL9|&s@ehhgJpalgGvj!-0JgkE5EC2ujazd;E00CuUtO5i8{F00DAFtpW%DYzl`A90q6#Y6|%Y+6;vZ00AjdtpWuALlO`WK@tuS0|@{DDQc|(1pz`54-h~S4G;neD0Z!a00CuutpWf6V~ni=00DB6tpWf6b(pOJ00D2FtpWf6bEK^T00CvHtpWo8Rt!%I%MAblDYmTw1pz7xq779HP7BHnD88+N00DHwtpWf6Y}Bm+00DK{tpWf6Vc@L-00Cy^tpWf6W$dj20{~bIQ47rt00AlZtpWuBD+{9yR}4@K%nc|2u7Usoc?PZm00D3ot^xo7Zyc@y0{~hKQwz@x00Ai|t^x%CEDNL!SqxGO&J8Fqu7UsoWj3w?00DMJt^xo7Z%nQN2nTBlh7219X9{Tw_zBqzgbXNRa%5v|b!4rAz*00L!c+O7halmG<*LIko4Y!HA9vIb#@T>t<9Wa_R000C+Gt^xo7YyhtU00LoU2Co8)fB*slaS>?|Iw&@5fqH9!00DFsuL1x8X(X=#00ChtuL1x8axkv~0R(FiE+BL$WcdLM;{i6W0;Fq!00DD6uL1x8bWpDX00C)MuL1x8a$K(h00CuUuL1xIaBg&Eb82LEXl7|JtO97P0wS#fOsxWvt^y#x0N}0y46g!cuL3X(0^Xeg0|3ebzy}Bn00AkSuL1-C0}ROmzXt~lD5S4~00C^OuL1x8Y`Cui00DKruL1x9ba^Ud0M?@b0swst-v$5yDb%k50s(vt-UcYzuYv#pbl|T700D05uL1x8W$>>800D0HuL1x8Z~U(U00D3UumS)9Z3wUe00D0fumS=Ae+}UV00Ai)umS=BehuITC?K$c00C|$umS)9Z!oX|00C(>umS)9bUd&E00Ch_umS)AY;#Dk0_dUu00CuAumS)AX>azG0ltU<0Sl23Y;JR9V{&g~bSPoS!U4pu0?MxflCc03umV`H0#Zrt@CXkl;W5&;Mk0qUm#00L}v_7(wxsQ~~BbaP~BW@BP@aA9)d4*^E80(KJt5)=Va6al^#0aUR9!WRJ?8387#0bCgY00BB)u>u1DHwfShr2;yPv4Q~sodqs#4gvrHWuCDD00DERu>t@AY^<>Y0RTG$00Akuu>t`BIs_=Zv4Q{rZo;tw00C*ru>t@AXV9?%00DK@u>t@AY}~N|0RXKB00D65u>t@AaO|-H00C(7u>t@AF8Hwm00D0Pu>t@AX#}zY00CzTvH}1Bbr7-w00C?kvH}1Ba2&D%0RlM=a4+Jq0wS`400D9+vH}1DWnptPvI0z90J1j#00DG5vH}1Ba!9fQ00V4wZ<4VBvateAvH}4C!V5ZHMS=hUZep?m00D1mvH}1BX>hUv00DG%vH}1BVSKUz00DA>vH}1BXNa-_00Cu=vH}1Bbd<6J00C~AvH}1BX`r$K0tX5Y=LKnEWppnfa4w@G0@Shs0s_Ja&IKvat&?`r~;r1YXEZtE_5gevjWy*02;G`AOO7s;|=o-qyZ)e0TRa&(-Pkj>k_5`zXJmjYYTM?CdB=)d0@`*8m~`*#N)>00AjHv;qqP$N~H?Iw(quftHGa00DC1v;qJDW$?5D00DaTv;qJDY5cST00C?QwE_SEVFl00DU>wE_SEax}F900LxTTC@T>wE_YFyAPfV00DDKwE_SHZf$g7K(zv*rT~yq0Z_F90sy=W_6Pt0aA>sx00D4rwE_SEXmqs#0|ogDtpFzzD0414VKg!-7ytkPZJf0N00D2NwE_SEbgZ=k00ek-baH^T0@MQlvb6%fG64ku=MM-2SOL)p#0vlca>}&=00CvzwE_SEX56&`00Cy=wE_SEb?CJM00Cm|wE_SEW%RWI00C|KwE_SEVF0!Q00MGh2DSo18vz3V3IkdJ$_oGiau&7%00CtlwgLbFYb3S;00CnvwgLbFX)v||0sut=N&^4^WjwY500DABwgLbFbx5`X00DGPwgLbFcvQ9m00CuMwgLhG=?~Kg00DAlwgLbFWNfwq00d@mbZ88=0yee+V73BswgLbFYk0N-0R(LkW^{Kb_Ba3@IRG+#0px3e00L=c*x~_@wgLbGV{?kO0;IMA0s(0Q+XQ3?9svLWWw^Ei00DHuwgLbFVaT=u00DH)wgLbIb7f|4)V2an9RY;W0gloE00Cs$wgLbFZtS)K0t1TyG!Z&3V#=q02J`{y%>V!abojOc00C|aw*mkGX%M#p00D9qw*mkGa2&S+00VMnbb>GdbU6T=IRF3xWpX070w}iv00L!UXoLU=LIMB-bY^fsw*s_;06szj00C`Ew*mkGZ&HNd9sn{Aj}o&I!4k0%01KZCpaF0Mwg}q`r4pkIsRQK$?*sD@G6q`VF%OOsvJ$`&uo3?Xo(!J>Zv?dn+6$x-q70}5XT`wSBe#0}aF8w+*=C=$4W00C|oxB>tHXf`!~g~Y_X*(%tHVTiZ_00Cu=xB>tHa+J6N0RbfobegyV1Oqq?P!swKBm-Y_Iy?XZptu5Jseu3ia;Ufh00CvbxB>tHX2iGx0s@r-i32()%1MEwM}YtVa?rQ}0|3(sj05Bc00AlFxB>$L(h7?M;|FCZ-natnxPkxyWb(KI00C?QxdH(J?FMr`bpZeYZVtHu00D0nxdH$IbR4+?00d@fV|2>60tmSRlpp{ixdH_MC;}yXy$ApSa5}jH00D4DxdH$IXiT{R00J&^Qn>>BegXgiWmvfa00C!WxdH$IWN5hp00C)kxdH$PX>Va{Wp#3SR<#1SwF0iT0>-xjXt)9>xdL>#0wl))1OU@00C*vxdH$IXVkd@00Cv%xdH+L^$zb2Iw)+7fTWCo00DC5xdH$IW%RiM00C(FxdH$IV*t7W00DFcx&iZa$zoSAY*1apoaiL?184ag1*84;JE^HiU8*70X&NUl;D9vi~th40#c5E00C_nx&ilv>00LoUz`6q1x&iVO00C+0x&i00D3=y8-|Kb2PgG00C|~y8-|KX+XOI1PGo7Tn=Lmk_%riE_5JiI&k=H0@QqhWPAeVG5|)q0t!e1hC_lbLjnK+b4+ll2LQDL`w`s(-vc2Jrx8{V00Akyy8;3LF$<{;00Ak|y8;3MFbk*+DA>D#00DH~y8-|KZ0NfJ00DLGy8-|KVf4EK00CzDy8-|KWdOVa0su1$s|^4FDGa;<0s%4$stqU-yn+A$c^JF`00D3!yaE6LZz#M10su7&tqlMHDKxwS0s%A&tPLnSyn+A$Wk9?F00DMNyaE6LZ&17f00U%WZ3esoF1!L(yaE6LbX>dw00DApyaE6LWpKO#00U%mboeX*cDw?PGXMYrbZ(eX0erjy00LoU_A3EirU3y0V+<&B`2THrV&*TbYm!KW^!a=c5`QNY;9$fy8^bm0?fODio61@D*=?e0?fPu7`*~8y#hMD0!+OEj->%$y#j!}0=B&Z1pq7n@(Fqg*A9FU00Aioz5)dTD**8cc?s4Idl4va6uyG`!T|sQYZ|@+00MJmZbt%!H2?qsIyAll0|bBrd=4!SI&d#8KE8rDM*^sBf^2RA00C}9z5)ONZ(P0t00C)Yz5)ONbZEW;00Coez5)ONWpus*00U%mbfl~S>TLin*Z=?pa&%>EZUVakyuAW0z5;r_0)V~(0|R9M9RMEyIw&qk@qkF~fD{1&00C{Jz5)ONVYt2m0|4p?0|Dy_00Ak)z5)OOV|FC@0qpky0s{6B@DMsE@M?ivYJmU&blkoI00C+0z5)ONVeq~J00DCLz5)ONbo{;o00C|SzXAXOZwS8v00C(ZzXAXOa}>V<00D9uzXAXOWgx!-00DL;zXAXOZY;k700D0@zXAgW=?MY>>Ix`yUoIeH%)Wxc+X2$P0>1YF{^J2SzXAXOXFk6I0stWcwhjORWn{ks00M4gUcUlrzXAXPWof>?0&u?q0su7vT?POFDTKcQ0suP#Wd;BNDUiPc0s%S#WCkdfzk&b(WSqYO0s}MxTn2S0WjewDiob%UzXAXObgaJu00MJi)Bpk)2Lb~Ee+h31aS1voyz+o<@qhpUZO*>}00Cj%zXAXOW#qpC00DC9zXAXObnw3d0s>+YOc6RLl%IhNoq+%WW&FPa00DLizybgPX%N5y00C$gzybgPV;sN&00D9$zybjT=MG+00C)wzybgPV}QT{00C}>zybgQaB?1G0hU_;00nYnVP$W6zXCMw09wETjKBhtzybjQXaFy8dx8J~a_0s*87Q4>1Kr-1+gWz4_=00CpxzybgPa@@cI00V4wX2!q*;=lqFg8%{n_5kVxI&cwz00DINzybgPZUDgo00C(R!2$pQZw$c#00D3k!2$pQXBfc(00C|u!2$pQX(Yh{00Cqw!2$pQZZN?D0s`L;*$+A>Rx*HMF@OL8Wjw(G00C!8!2$pQWKh8Z00C)M!2$pRX>vBf0$jlY0|N5~=mgpdIw+tLfdVmr00Cue!2$pQXMDi|00Ciw!2$pQbcn$M0|7+_=>#SVIxG@_00Cu`!2$pQZlJ*e00C*H!2$pQY^=co00CvP!2$pQaJaz&00L=jzQF>>GXenv*a~ncbIvmY_%MJXF#rGoa?Zg500Cv*!2$pQWaPmD00Cj@!2$pQXz;-T00DFM!2$pQI{d)`1P7@I+zRjp*a|N$VsmghC@x)skX!;{!2*uK0>r@r0>Xm$Fn|C7atOi#0Ri9&I=C`|00D9|!U6yRWjw+H00DYJ!U6yRX-L8X00DAN!U6yRWmLif00DGb!U6yRb6~;(00CiU!U6yRa%{o^0Ro!La5{3NF#>`wfZoCa00DF4!U6yRVf4ZR00C_J!U6yRbO6Hw0t2ZGe-AG@aNb^mh%!vX*Say-KV00Ct}!vX*SbV$Pj00DDO!vX*SVN}Bc00DAZ!vX;V5)5B2E?~m~xL|^6U;+REb7sQ=00Cik!vX*SY<$B400DG@!vX*SVTi*500tmob6;a^oWcSI!vYM$0*=E1-Y@`&RsaA2ca*~d00L!iF2Vw?!vX*TWN@^@0$LdY0|G%0$pJh9C_3!IfYO|R00DH!!vX*SY1qR800DL0!vX*Tabx7e0u*`y00Cs`!vX*SZ1lqd0Rf8yZj4z000DFW!~y^Vb#iz5!vYAz0`61*00LoezQY0z!~zij{SF-ufB?b@01=}RlLZ6@n+$jis{{2BE(R6{b_xUymJR>`DJH}MBLe&m91nj0!3zHnq7jk>0|uH5cMPfn^bsuv6$f<+0}Yi9Lj$-E>JOU+5EEbtNCV0Tz6>A(dj?zs7X~T>wGKWJ0Rl%1C}K*)f)a!Q00CuC!~z5Wu@4Xqs|j5Z00Akc!~z8Yun!LostH^XL<}gf#DV|;XST!w00C~s!~y^TY0Sg|00C^$!~y^VdSY#$!~)pF0&;f%0|R9T`v95;I&^TdG=eZR0$?-(00D07!~y^TWdOwj00CtN#R32Uaty@+00CnX#R35WN)azEFk*tJVFCaFZXU$~00Ctx#R32UWiZ7800D9~#R32UV?4zI00DDC#R32Wb6;c_#R5ph0$Nr800DGP#R32UXM2Q~@Y-u$_S7#R32UZs^4V00D3I#R32UY5c_k00DFY#sUBVVF<2n91sf$00AjR#sUHX8xRT!C``tJ00C}N#sUBYa&C8HFvbEl#sXZ%0{R6200nbjE^J|TEC3o_0?cLtm@NQEEdT%kbaci700nGeZ)jy=#R6i+0*b~0ggOD#fM70w00DHS#sUBVZ@9(+0s=4z-2`)F9uNQ?Gywnta&yGS0$w-(00Cvv#sUBVY~02I00D5~#sUcd?*)nq3I!+;j}hJvE)zNvVF~~NDelGs2?6c}i3$k?ClQVj-487jITK(CC<4cV00CtP#{vKWY#_%100C(x#{vKWW-P}700D0@#{vTY&=7_Stq=eKDL%&n0|U00C(l$N~TXXCTM|00DI-$N~TXY%ItE00D3^$N~TXayZBW00D14$N~TXbVSGk00C)A$N~TXWKhTg00CuI$N~TXWn9Pt00C}d$N~TXWoXC(00Coe$N~TXb9Bf800BCB$N~WY$Ok%r$btX?a)!tP00D1~$N~TXbd<;f00C*5$N~TXWT40b00CvD$N~fi}ca$O2Z#0*-wG00CvP$N~TXZrsQM0s@By#t%9!DmZ}7YytoQW$4HP00C_F$N~WZy9_!mew=_B>j3}(Wdg|p00C?c$pQcYbri`000Cqg$pQcYWgy7{0Rck|I+8Vl00C|+$pQcYZ#2mQ00C(_$pQcYb3n-g00DJI$pQcYY)r`l00CoC$pQcYV_3-o00D1a$pQcYAY{n`00DGr$pQcYZg9y000Cuo$pQcYX?)2700Clx$pQcYZHUPN00Ci+$pQcYAe6}h00Cv1$pQcYW1z_b00Cj9$pQcYaIDD!00DEd$pQfaR1Y9$xXA)21^@s7ZobI^00Cvn$pQcYWzfk200m`fVQ6yV$N~m30sP1UCdmTU$pQlezz^mJmj^E{a5{Qnf+Ar8YBd7XIe-8GZ}Q0k00ChN$^rra`~_|d00Ai$$^rrb`vq+bC>+Xy00Ctp$^rlZb1cdN00Ch#$^rlZayZHY0swFf{sjO5DMZQw0s(If{RJpW%7Op^Wl+ij00DMd$^rlZZ(zy-00Mb+Fv9_~c>w_g(hOy7Vrf3g0%pnrY{~+*k^le!aCXW900Ci&$^rlnd1Z8OXlZb4a$#d@b9Z%`x&n^A0-V4C=)eLT!~)*L0+7Z6zQzJ}9RX&?0^G?0>?HsY$^wwe0-8Jl8vvjXq6NGM2N1vl$r9BP;S%i<1pvGYr~$(R2NFmJRtE|V91XPw=MDD_AqZ{|f(&~P&jVu)00Ak~$^sh!pAex1y9WjkzXHe-)Dqwl>=Fb3y9=iQ!UF~pM+a302@M+!v84sNiz6QY#NePJvv;_bGDNf4*83N7`CJb5z9|^qz{1Oxo%n_Rbxd$W+o)H}hy8^%i1QO&8^bHsfoDsbSzz#?WhzPR9Ob1#A3=JL)>ka!200Ak)%K{YvGz@zL$`aNR;u7u>sR1|%fds?@&;tk(YzuY^DF;gjSqBRZ9S!OY`VA=X%YqdEHw=CR%@WxXC4GkX+><#=4C{oOV00BN&%mNVr&l1}b=MwW0t^vsd)dLL@aSMA3E(cHtUI!2jA`R~i{|x{EDUQqn5dqE;+7jjx@)E59$OF^^3=(h)dJ8QFPX}EG4-Fv=?hXD8D6-6g00Aqw%mM%cVPYm_09g9~1pvMWN(Wd6=?(b}00AlR%mM`gy$4ALR|n_~_zfuh%z^*`Jp#=F00uoOEh``)h|2=@%L0hZ0^rO7=F9>T%>n=cav04500D0@%>n=cbU4id00Ch>%>oDjR0^XH)eBMz;Q|y6uL)rh00AjV%>oDmQwpLF)C*Ax-~tm4t_fffD0gjK&4L!(0WyyP00MGuM9l(X%>n=dVRMG90MhFL00C}_%>n=cZn}hR0cc}J`yfED4y;C65@c^=zs$Sst9!hE&?xeC}L^a?t#k90zAWja>D?e;s5{wbY;+r0Md&900MGk-pvB~%>n=cWdzOw00DLm&H?}daum)200Cth&H?}db0E$F2LKNf6ayjyo&bCX`2e&I00DF?&H?}dWjxLT0RdbHb3)Dn00Cx5&H@7fZ346m;0FK!DOSz`0|9ITvkcz{C|=Hj00CxX&H?}dX>iU000DV+&H?}fY+-VI&H@m`07S$900Lt!mTCZgCjtNgW01}Q00C*5&H?}dXrRsl00D5O&H?}dVXV#q00DBc&H?}dXSmJ+00D2l&H?}dXvEF}0s!6zwhRCPDbUUW0s-9zwG1fM&Vm2|a@@`W00Cv@&H?}fbZKPD&H|z;0PM~J00MGpGME4=Mgao=yAiw*J`Ml@WeU#%00DIp&jJ7eY#7f100Chh&jJ7gW^{G{&jLc203^=>00BBG&jJGiy%9eS$P6etvXg;0&w>B}bUx1l00DJQ&jJ7ea8%C%00DGb&jJ7laAIb5bZ&BWzRdzA&H_-*0^m6T%EJJH&I0nz0$|Sq0ReUnI*31l00DD|&jJ7eY>>|a00Cu|&jJ7ec%07y00D2J&jJAfj1W2`L4p7Qbgs_=00CvT&jJ7eXS~k>00DBs&jJ7eVaU${00Y8ybdZMvsLuk<&jJAgV+n9NJU0TSDS!Y0XyVTT00DIF&jJDhf(88$Iw-U-fwX#o00CwC&jJ7eV+ha!00C(Z&;kGhaCT<&&jJ+C0t`_C00Cth&;kGgVQvN=0LVT900Ct#&;kGkb7Nv=aB=`104N>+XdVEr9suqh065SB00BBa&;kMijtfr%I&fIff{Z=_00DAd&;kGfWo*y_00C=q&;kGfV|dU400LoY>Ky=n&;kPknh1mlh6rgoD1;vX{vv>^AbvU{00Ru+{a5{Fb&;oQLfZ`+o00C&Y&;kGfbI8yF00Cvr&;kGgXLD>N06ISc00C^;&;kGfW#rHT00DUF&;kGfZ}89p0RznkWIAwgC;$Q}fJ{IF00DIT&;kGfWem{*00Czb(E0|Gn=Gzl^ZIw&;wfNJ-E00CsY(E}f(SiU0dGgT$00C_N(Ej`rSIs-!!O#{>flMg6mb$4xNZ+32k(SnN60{HF#tkD9p(E{Gl0t(Us+=KxDg#iEoWDwE<0{}S;HUKyP00Ajj(gFhkI1DuaHvlML(t-d1b7s;400Cuk(gFYha(L1L00C)!(gFYhb%fFa1OyBN_yJ1_gb_L~ATG++fpq0_@U)00Cw4(gFYhb^y}?3IH<#Wep(`O#v$mg$1?+9S%we3=04ODGbvB3IQ?#WDOt^OaUqkgax$)91ckc3kxVB(}Dm3a&!jM0w~i00svVH4*>uHDNNG>0s~kJ4gn}-a#GWRY<2+zKmq^(WmwY!00DYx(*gznPZCoS8v+*sO%hQO00Aj>(*gklgbgn!E(CglIH7=6=>Y};P7+cQ8UhvqOcGEMD076;d%501(Xp2m)>aa1tjFcL8+)ZW1LB5D6$`5Y&P))B*$m1_g-?hyke*00Aj-)B*$p1qFx=hXJS(C}wng)PiE;0Dj{D1^^=he-eQbAp(06eG&ixDVWp(00VDwd3>$_s;&Uw;s5{yW^{ICRIUK5)B*(K04C!A00BC>)B*_ufC^s(A_9IAfD#}AdJ=pR%?5KQI)c;!rqqJW)Pev3Zqn2O00D3E)B*qkWocN{0{GMd00DIV)B*qkVPy!_0>TLZ3jmoC+6VsuBoMp>z6DqiZ4H+aA`lM=00Ai&)dBzlVP?qK0Iv7|00Ct-)dC9wm=f6s{sAKpy9K=kR}gFsmJ%Tl4hbl7Fx7%U)dBzkWk%Hk00DMp)dBzkZ*0{90su<_;s*c$DR|Wa0s%?_;Rh&w)q(&4WrWoN00C@{)dBzkX_VCh00C&4)dB$mtqgZ4pw$Ao&W*>!~}2#00CuU)&c+lWN6j`00D1q)&c?ni4oZZWJEFn00Cus)&c+lbcEId00Ci&)&c+lbdc5p00V7vX>`^CmevC1I|2X!a-7xz00CvH)&c+lbg;T_0`e+=0sy)XhX()wbL`dv00DLK)&c+lY53Lx00nMzb9rP~)&ley0Jhcw;MM~E)&c_nIRexVxC{URDH_)T0|Gb#(+{@{C}|?sg6zNm00C|&*8%|ohyywDQMRM0s;R8=L{%r*Ma~8Z*+IaiveQS0(92`010Jbb#FK^XESLc)&d0A0yx(Ke%Aun$N_B00V2!+R?GqJ8~_0V9TG1tf?9(5Spon7XR_A<00C~k*8%_mX~fq800D5y*8%_maM0HR00Cjv*8%_mZQR!a0t2iCm#Jpup$XXw`g00D0L*8%_mX#m&)00D3Y*a83na17W200ChV*a86o1`0Y9K7s%NXCBxB00C|$*a83nX)M?R00D3^*a83na5&fk00Ch>*a83nZA91t00UobAmY~o7}x?z*a83nWl-1x0tDL*Cj&1!AaE#jf+kRcVh6Vr5=R0D?*YtV#fc*a8Mi03=HQ00BCR*a8Ct%n#lR)&(yvI&i#if{bqhq}YNKO#%P`c&gX}00D2p*a83ob7ExJ0?60`00C^y*a8Cp-USa5+XesuDc;xu0|DIy4ief1DCXFL00C$0*a83nZur;&00C+K*a83nas=4|00DFg*#ZCpZ*sO900*#ZIp{R#3600AjF*#ZL#{0Z?4Jq~VfbaQZWY+_+3XI|I>*w_Mgt^g3(0v6cWkT8l00UuVc`(`nPTB%cUjPCEF$&%UWIC(|0n`qG00CrT+5!RtI1b}2mur|0Z0vj00DV++5!LpVTjrS00DB2+5!Lpa+KNv0tAo%-vl~gWOSkoftuO^APND7H30wtWT4st0s@5x;RHHlAP#|I3jqKDWW3q}0tWd6VhJ%ab7o;PaM}X4+5$`v0AS4l9@GKK+5!LpWzgCJ00DCD+5!Lqb!GJ00^V~000MMk`q}~*6aWPPDgeq;>0Rb-!Aa><}00DV0+X4UqayZ)p00DG9+X4UqWklNo00C`E+X4UtY&tJxAlm|Tg@LRDf>7H60RycHE@>#1>;Vj+0?@3000C`i+X4Uqb?}@500D4*+X4XqfDZrxaEjXk00D50+X4UqXq4Lm00AzV+X4UqZlK!&00C*H+X4UqXRO--00DKf+X4UrZ)}9y0=U}(00D5m+X4Xr#RxCR+kyZAa?aZV00Cvz+X4Uqa@^Yj00D2}+X4UqZ0Oqp00D6B+X4Uqc=X!>00CwC+X4UqUjW00C@L+yVgrWDo!Wa9-R300D4f+yVdrXlUF500Ay;+yVdra&+7R00Cus+yVdrXMo%S00C!)+yVdrb&T8s00Cl>+yVdrWtiLo00MAiSlj}h+yVgs4+bx!+=2iBa<1G000CvT+yVdrXT01300C#h+yVdrb;#TT00Cmo+yVdrWz^gP00CbD$N~TXW#HTb00D01+yVdrW$fGn00Cq2+yVgrX$}AZaQ@r^00D3U-2wmsXb9Z`00Axz-2wmsZWP@D00C(l-2wmsXCU1I00DI--2wmsY%JXZ00D3^-2wpt>jp14-GTrCaz5Px00D1C-2wmsbWGg>00C)I-2wmsWLVt-00CuQ-2wmsUu4|^00Cuc-2wmsba34Q00DG%-2wmsWqjQN00C@*-2wmsVTj!V00D50-2wmsUzFVf00C^8-2wmsWuV;x00DTW-2wmsZ>-${0ReyqFZ`c^00DHk-2wmsW5C@400Cvj-2wmsYRugN00D2(-2wmsa@gGh0RcG00D3Q-2wmsa0K2000C_Z-U0vyVPtc5aA_Xg0@~aH_}l`r-2&d-0ubH;00D5~u>t@AaxmTk00Ct--U0vtbUfYy00DAB-U0vtZ%Ez(00D4L-U0vtZB*U@0RS5c00Ajr-U0yu8VV?6-hu!DZff2F00C)o-U0vtXL#NM00DJ=-U0vtY=qtd00D4{-U0vta**Bv00Cu|-U0vta-7}*00D2J-U0vtY^dG>00D5W-U0vtc(mRE00CvX-U0vtbim#M00Cvj-U0vtbIjfX00DE--U0vuX<=I40@&UH00BDQ-U0vtI_Tbl00DCD-U0vtW%S+x00DCP-U0vtZvfu{00C?U-vR&ua17r900DRs-vR&uWf7;00C~M-vR&uZ>-+}00L!ca^C{7-vR&ubhzIF00Cpd-vR&uWys$G00C^y-vR&uWz^pS00JO$9^V4m-vR&ubl~3t00Cv{-vR&ubMW5+00DFM-vR*u5Cs4MDFWaE0RayMCvX%yfB00Czj-~s>vbs*pZ00C?!-~s>va4g^g00D9`-~s>vWjNph00Cz{-~s>vXGGuv00DJM-~s>vVo=}$00CuI-~s>vWL)3^00BB;-~s>vI%wd600DAt-~s>vWpv;I00C!u-~s>vXMo@W00DJ|-~s>vVvOJd00Cu^-~s>vI)KQ600DBI-~s>vZ=~P?00DHW-~s>vX|Uh|00CsS-~s>vWxU`500AJv-~s>vWys(H00C~!-~s>vWz^sT00Cp#-~s^wTM9Zrp@IMba^~Oy00Cw0-~s>vXY}9#00Ck8-~s>vZUEr|00ChJ;Q{~xZ8{9$0@$H~00DFo;Q{~wV;tcE00Ctp;Q{~wYAE3X00D0<;Q{~wIvS&b00DA3;Q{~wZ$RM!00DGH;Q{~wX-we)00CrD;Q{~wWmw??00AIg;Q{~wWn|$300DGr;Q{~wba3GU00Cuo;Q{~wY<%GY00MGhG~oh*;Q{~zVPtb~{NDnY-~!;_0*K)P00BCZ;Q|5xJOmsH00DBU;Q{~wWw7A_00DBg;Q{~wZ@l3G00C^m;Q{~waLC~T00DT;;Q{~wWz^vU00AJ{;Q{~wbl~9v00Cv@;Q{~wbL`;)00DFI;Q|2w5d{DNa{l2000CtJ;sO8xX9(f~00CzX;sO8xbrj+P00Cke;sO8xWgy}L0RYGc00D9=;sO8xZ!qEl00DG1;sO8xX*}Wr00Cq|;sO8xWk})z00AIQ;sO8xWmMt<00C}V;sO8xWnkh000CoW;sOBxN(}%3a&qDV00D1y;sO8xbbR6h00C)&;sO8xWQgJd00Cu=;sO8xAe7<)00Cv1;sO8xbfDq_00DHS;sO8xWvt=?00C^W;sOBxdJX^qbiU#O00Cpd;sO8xWys;{pNzmjmDt00DAF;{pZ%*#qkXvjh1N+XL+b00Ajd;{pZ(*aPYVvIF=L+5_wZWhhMJ0$}5U00MJ#K;r^t;{pH#cx-ZW1ls~u+X8so0(|2F1OUVch5+0N`VRmBaG2u)00D5K;{pHyXsF`?0s)l)J`5;`sek|hbhP6F00C~k;{pHyb;RQW00D2x;{pW;tOpMYn+1^v1p+Q(VQnucbaSrb0?^|E@Tmaqv;ag~f?l|Q&@}^--dcgohyZ~hD0jQpU1q0X-#1Y03$`QyBE;=Ye1p*+6fz*eA00C>D{^SDo@c|5_faK?Z00D9c!~y^TZyeySpfh7Z*t5N0H9g{01jevX?1R9aAS0LXlHL^D#rmR00C*PJR_{DZu3d0s_Y#vlpMU@Xa@6Gl00Cv<|6$|MQl?2KL9|N2Kdwv;Z7yU47BM-MtEjE8~XhJgS9Y?S5#00D2J<^li#Z>Z)10tA%>Ujr{XX>ec#f=-Enxa9$^<^li#WVGf200Loi%H{&Rf&c&kWzgmV00MGl+U5ctZU6!S2Mg;2I>HZu0|D#`hYRNlI_`jh00D6H<^li#Z2;#200ChJ=K=r$bPVSL0RsmSa&su^<^mGu0)~8n00Ctf=K=r$Z7Amg0|HhFLJ39*Iw;Jqftam<00D9|=K=r$Wklx!00C}F=K=r$Wl-k=00DGX=K=r$b6n>F00C)Y=K=%**bcZ3ybit&Iw<(Efef&L00C`o=K=r$VSwiX00Cu&=K=r$a*XE!00DH8=K=r(Uu+0z|j^+a3<^nF~0|Vpy&dan*s2j0sNr>00BCx=mG%)w+nM9X~c;DWX6E1-~a#tWzOgV00D5`=mG!%dF1E<4+tp(1pyWe84~^qpb>)r3=EqH6aZxjsS6VZCIm(dASgO7Uvz0Mj_87#=z_@Tf+h-rB3T0J=mK(|dXEx~q00C}3=>h-&X+-G)00D4H=>h-(bZs!{0#NA!0stNpZvX%RDPZXW00L-pN-+WuH39$wWN>uEHUbJ%0L(xF00DA#=>h-&WrXPh00Cr*=>h-&Zjk8$00Cu|=>h-+b8=&6Xl&^Moaq9RBm!zX0`@!t00M7vqUi!^F987pTn}?7S}p->2Y>(pWy0wK00M4v&glZ+7XSbOY1HWg00Lih?k57kQ~&}C9TRQ4LcF0)8C=-suA5=>n(+0Nw`x0tf&s2modX03sLw00DRI=>h-&VIb-P2LMbH{{!>^nGMSfD+H-G=OB4PB^8uI*$_y$B%LOPr>Vg0PWkTu#00DDW>H+`(Z(QmE00D4f>H+`(ZD{HO00MGvIt2i3>H+}*z5p*S+GBz`V*&sHXMXAe00C}_>H+`(X^`py00Cr{>H+`(VVvp$00C&C>H+`(bExV90t3_tnFl&_aC}pMv^N6eHv#|wXSC`900C~s>H+`(Y0T;Z00Csu>H+`(Vc6;d00C&;>H+})?G8FlID!BHXX@$#00D0D>H+`(Y53{_00CtF>H+`(VFc>}00C$U>jD4)a}etS00UohAg<~HjD4)WE|@P00Ctx>jD4)axm)x00D9~>jDA*ISm^O00D49>jD4)a7gO{00C%D>jD4)E>!CR00C}V>jD4)X<+LD00C!a>jD4)b!_Vb00C@r>jD4*aCCU<0-|IB1OpQY`v^i0D-SwwFRW35Y*7M!>w*FRq7DfY00AkU>jDA-p$-TWZzx_$0i^4K00DHW>jD4)W4P-A00DKr>jD4)a>VNb00DH$>jD4)bI|Jo00C~+>jD4)Z`|tw0Rlw?b7P3>0^;ie00DI9>jD4)Z1n2_00DLS>jD4*Wnnz)0s!m+00MGvkTwEb8UX+YV`Oq=cW!17>;eoo0)96F&KUs|8UZRA0XiB100BB0>;eJ-qypLmWWXE&00Ct_>;eD*bV%$100Ci6>;eD*bX4pD0RcY@b6V^I00C@Z>;eD*X=v;M00Coe>;eD*ZglJd00Cus>;eD*bb#yv2MEUiWC2MLX$i;+l?NLGI&(2IGG;F>IP8Lk>;iJk0j|se=*$858v#mXg6w1h00C%>>;eD+bY;Bk0_wg10s>J8M+iD7yxo9`+<*W9dCcqr00DB^>;eD*bl~g)00DF6>;eD*Y3%F*00C$6>;eD*W%%p@0s{*M^#wX8a)8``UfO{E>;eD*Wd!X400C?k?E(M+VjS%P00Chl?E(V>F$qoqPyr}(FM^$bDD47}@qqvVWiIUk00DDC?E(S;$q&c@I?CRF00CuA?E(M+ZCLFB00C)U?E(M+bY$%U00CiY?E(M+ba3qg3IL%Gq!3#Y8W0Hyi3J7@p$StF-vR&uDSYh$3IU)GqYzpW84w5why?`>pb1hD-U29+?ScRSd6?}200M7yvh4ygN&x@?a=7gR0s&|Q`2!#%-+=%DZpiHd00D2(?E(M+Y1r)o00DH~?E(S=O%p*AE;=Z52m(r*frgra0Ra*Pa_a2@00LoURYitYkfO9HM50t9pd&h7%Fn}7fTXVmTj00DLO?g9V;WNaQn0H7iO00?7daBggKVqtXZ0tV~?!t4S_?E-e~0y6Fb{O$q*?*ak==L@6&DEdEv00Cz%?*ae>E?;bO2xbCuUIHdo0CZUZ00C@1?*ahsSgScr3qIN00Aj#?*aq?s1FGaqzP6LD0J_F00DV=?*ae;a)|E&00L=mWbXow?*ae;bd>J`00Cp3?*ae;Wu)%{0ss>Q@CpC{bFl9M00CvT?*ae;aJ=sV00DWz?*ae;bja@l00DB&?*ae;Wz_Ei00MSy+V28>u>k-AZ(-o?0*HtK00Luh>hA*DF98Aq01l=NIw*o^fxKpc00DIV?*ae;X$lJfz|-v9ssV|efa00C)&@B#n00&`mWodJ7c~a~Sdh00Chh@&W(>WhC+f00C?&@&W(>Wiavr00MAw^6>&T@&W(>bUg9`00DDG@&W(?b9J=w0!;D(1OkNsa{zS!cK|vlo)mxt4}bsxbX@WR00DDu@&W(>X>{@e00L}udh!Cu6aWALcYyK&00Ci&@&W(>a**-@0Ru)4V{kf16#yh50{9hx00DEH@&W(>VXX2300DNg@&W(>Zn*LS00LoezVZTg761YOj|7(l00LojZW;j2@&W+@`UE;~C>wyZ7XknQW!~}v00C#}@&W(>Ves+-00C|G@&W@5g9{7>W&kf_V`XA)ZD~3nYj$X8b%K`i0>ttHt{DL2835Gs0@NA+{PF?@FoLd)f|MHodK>_39RLRai3Fbr7XWGrtqT|iD+B-mWj^x)00C!C^8x|@js%tj00DGb^8x??a$xfU00D1i^8x?^VQ6Jk^8#%10l77E@F;1E{>i2#BJE(+obH4Xp)DS-0=4g@v=2LzD;jtM#j6$;%D-w;*^MU{YbolcE00C|S^a20@bqMqV1OVs)W&|P%vkCwKDHQYq1Oev)WdtD#vI;03^nw5Za3u5s00M7e4)g*t^a20^ZDMHm0Vo3k00LrP#`XY0^a20@WK8q|00CuI^a20@a$NKR00CuU^a20@WN7pP00DAt^a2F{brLKPa}p{L6A1tTDSGq*1p#ytD-d!LDG(9~D2DWc00Cu;^a20@be!}800Cj5^a20^Y-gzS0+iLyRW_JRNbWiIvt00Cz@_5uO}bO-kjFD^P}YJv`G0uVZa00L-pM)m@@fdK&lrVBdiPJ#ddY-08T00Cuc_5uI_ZgBPj00Cik_5uI_aD4Ux0|u`L2oLxUUm$QgC@#Ko0)qAev`zvvg@K%dfjk5P0Rs9Cb0~=R0JhH1^}E06#!-lstXhbCjYOw04xUp0sw{t?*{+@d0_Vf00D4j_W}R`Z*2Dh00DAx_W}R`ba?jy00D1)_W}R`bA00Ch__yPa{a!B|B0RylHbRaHH_yUsR0n+*b0Rf)}E|?Jl00L`sRQLj9_yPd}&ImeRo~wYYAOZjZXm_yPa{VUYL&00C*1_yPa{a-8@A0|G@4BM3nTV`YN)0;2c=00?++YjbpRXKtqV0@n8eCintu_yVZ-0+>tyUNZsep8^8{3lRwsNCY}4R@#BAe1QM~W!m@x00DIB_yPa{Vet3@00Lulv~dCU_yPh1905ZFb2@Zo&OZQJ*@2eX0W@*}00C|W`2qj|Zyfmo00DF&`2qj|bSU`(00DI_`2qk2b7F90VQu{Q0yOyo6gvPuI{?<%0m^a#00Ct>`2qp}nGe?j00Ajl`2qp~m=D$hC}8=500DGn`2qj}b8b}m0&w{P0|FTlK?K1MWhg{*0qT5#00DD=`2qj|a*+7~00Cu|`2qj|X`J~200CyA`2qj}X=SMS0!DZO0sy8C4HEzXDY*Fp0s^HD3=?lC)Jp-r`GNoebj0}r00Cpt`2qj|b=dg=00DB|`2qj|bmaL000DFA`2qj|Zt(d600D3I`2qn2;s`D%W^`jx0Rs5Mfu@xJzLfy{`2qj|WdiyF00VVoc6Rv!uK5BQ`T_t4Woctb|0FDa)whI6RF9HDqasYEWO!@+31%LnnZ*uwq00C`&`T_s}dW8A{0sw>y6951KaFF@}00D58`T_s}Xq@^20|grd83c(2E@LQgU!wW~W^@2@bbzvS0Ni*200CsE`T_y~AQNl@00D5y`T_s}aM1b!00C&$`T_z2eGsM)E;?}B`U3tff<`R@00DX8`T_s}boBZH00C+G`T_v~^#nQ`)`0*4a|ZhY00CnT`vL#~X%zbc00C$k`vL$0c5ndu0wDVW00L=Y#QFjz`vL+4^9a2RIxlZ+x;TO6|A8z{0CxBR8vu=Yh05&uL00L!UkYxbSGynns$O2Lj00AkY`vL+3#{y9hbaN=WWdQ1B0I2(d00LulbUp!QGynhsWNxne0>JwM00MGhfG`1kVE_OEcyBy-001-q00U`nbqEpx-unV@`2Ya`cn|;qWcK?400CwC`vL#~bO8JU00D9a`~m<0VGR5N00DFo`~m<0a~S*r00AH#`~m<0XC(Xr00C|)`~m<1d1-tS0Wkam00Loe-aP?&eE|RiY+-dEKLMUU0rpq`8w-pQF#rG)c?6;ouoAu!n-BsMHVJPwq`~s}k0HQPi1^`(Dj{t-RFbd=fHx2*+DZKmw1_4+DjsSxPFAC!dHV!Dt{DJ@hbI|+(00D5~`~m<0Vd(q<00C|8`~m<0aP<5F00C+G`~m?3jt^~fC;|2WoZWe0yO;s00DG5{Q>|1VMP4`00DAJ{Q>|1Wl;SB0t3ehFcUg2Wh_F0CjWta<^cc!ZCw2V00VSxZ&>^SR{a8Q{Q?348Ua28b98Dy07TdU00C}-{Q>|1Z;<^000DHC{Q>|1be#PH00DKP{Q?338v#EAbf(w=00DEZ{Q>|2X=S+m0*pZb00DTu{Q>|2b#8Dv04#L@00D2#{Q?34hY%kTIw;(AftG!N00Cv*{Q>|1bnN{C00Ck0{Q>|1bol)O0|p}jB>|5MVqqv_E_0~;0?7RWQaXUx{Q~y&0sj3000CqK{sI62VI=+n00D3+{sI63Wo{sI95HUwWUE{OgDSZRVHX#xNNa*qB200Cv5{sI62W~BZC00CyI{sI62b+G;d00CmQ{sIC5%L|qVa5`8z0$vV)00DBs{sI62WzhZt00DZ|{sI62Y25w-00DC1{sI62W$69_00DIF{sI62bM*cK00Ck8{sIC6pazo%I&yHX41fUt0y;bb00D9a{{jF3Wf=bg00Cwm{{jF3W+eXt00DI>{{jI4&<8roI)VTJayI`000Ct_{{jF3dPM&M00C)A{{jF3a!~&Q00CuI{{jF3bX@-e00DDi{{jF3VQBvX00DAt{{jI5K?oo^bpHZ;Jc0lLa(e#)00Cu&{{jF3W{m#=00Cx_{{jF3b(sGG00Cm2{{jFBX>x33VPAD(EsFXAF#7^J`vP?R0zm!(y#4}|00J=o0;K-}0svwI5&!@JaM1q(00D5;{{jF3Xx#q-00A!I{{jF3Zs`9400C+4{{jF3XY~I900DLS{{jF4UoK>K0&=1P00CtN00RI4bPxao00DFs00RI4WgGwl00C?w00RI5Y+(QZ11JCk00J&wqWS{dcme+RTnaiUo^ybJa)1BWW|00C^00RsR5ZM}x1_LS&3=a|y77q>&5Dz*iVr+bXYcc_IS?00Chx0|Nj7ax?=200DA30|Np9mI%B7DCQx600DGH0|Nj7ZcqaQ00DJY0|Nj7Z(IWd1OjIS<^+%k%mg|pSQmk|A%Fk@a%cks00Cus0|Nj7W`F|&00Cx(0|Nj7b&LZ800v=iV`XA4Km!BN4*+5V1DGQLk^=)gY61WOc$fnN0RhzsU(Ox^00C^c0|Nj7VZZ|e00Cph0|Nj8Wofbl1Iz;h00DH;0|Np9?F#r0bhP#X0RiE4Gf(K764}ns|ytdCf97E;=s`ZvajN18Q#oyxIZ0^#N8@f_i|000DPc1Oos9Z)to41E9|V00Crz1Oo;DVFH5!3<@I-Ujl&w00AkI1Oo>FU;=^y3ko6*UIKsu1_CIc1cLwpbfyFY00MPzx j#Q+EZln_}0e*y{$Ar4mpeFByc00Ak=1Ooy9jsuVm00AlD1OoyAjRTJkDCh)(00DCD1Oos8Z}Pa00DCX1_J;AZU_bg00D0f1_J;AV-yAh00Cth1_J;Ab|3}=00D0%1_J;BVQG*_0X9+r0|3zq5C;qg00AjH1_J{D&?rWJ(4D00C@P1_J;AWn2aW00C)Y1_KBQlMq+}egX*!AP!and;*maZzyDAZDMA0cEAJ!+ysMI1p~qb11tsuG6n-^1_Krn06J~~00C%j1_J;CWNvgw1Oto&1EdB62>{v?rZ|VjE0|JEvbp&?=Iw=10fFkpN00CtD1_J;AatsFp00ChV2Lk{Bbr=T&00LoU4jTdTUH}UR*$|QqBLL10cMhCvIYP|=YRkKWXcBv00C_N2Lk{Bas&ti0{~$LOb=rQ00Aiw2m=EFUxC2ss;mY2LlQS126~!0|A!;l>)U7C_F!a1q2xZpbbC-qXs7pVsmA5l=T5j2m@Yp0Xk&?00MbsSO^1r9s&RYWodK>17L;$0s^-IjR86+@~eOhsDJHoK00Cug2?GEDWPAw&00D1;2?GKG843pqIw(ZBfF8Gi00Cu=2?GEDWSj{D00D2J2?GEDZm0qUFJoqOWO8m{E;=YW?twlL0on)y{0IXc2?J;e1BeL&-U$OD=>f93fS$R400Mbwn0fIw-J0fmA|)00C@93IhNEa8wEd00C`U3IhQFDGO;}3IhNEW@ZWl0tn>=*#&QHIw*B^cP?%U1GvrsMyrABse!mN0lYH-z%v2*3IYHEb8mDC0|24`00VPjY?=xKhS&f$q5uE^WuyuN5&+Z(HV~B({Q)2l)(3O}*at=sasjvnx&^BdlM*x#9uN%)L=XT0DYyy)1OWC583ptT7X<(TDdY+R1OfF57zOhR76mBo3WERvbo2@X00C(N3j+WFVF(KY1OOcc`U)Eb_zD04DHIC>1OXfc`3f2Z_X;Q;3xfawWh4s&00D3^3j+WIZ*qBI%)|f=3j;U{13ZTT00L}nz}f(Oq5uE^Z%_*Z00L!UOe6r(Z2=PpZ2{8j)dzC{*9S!qaRIjlxdo~bk`glz9S{r&LlAN(bYf#>cCrcs-U@?03j^{|0a^(f00Cmk3j+lU1P2=k?GO$Hy%1?)V{|V%aAhDaC>&Y|00DA}3vOvw*n;zwE{XQq-KC14TAsybS4c000Cu24FdoHb4(2b00DDS4Fd!MeGE+uOAJX2Iw+U{f%yD@00DAd4FdoHZ*UC*00DG%4FdoHV|)z*1Og5d_7eCK`Vu-QS_FZ{0f7JkWrz&}00DKH4FdoHY@iJT00L!Uf(-+v4FdrK*9Bo;c32GqE&>9q4FdoKXL(^`1PueW4FevH09+RU0sw{(FaZDoDcB7I1OkN+F9BNvT>~yC)>Z=E4TAsybL0&J0|9vmbqInGC}2c@00DFS4FdoIX=U~e0|*WS0ssjCG7|s+a~KW-00LoU9u5Qe^#Bq8lMFZy3I^y$4g_`#>kJVKkPM~+?h$he6AP3KY$$Rh4g*vUgDCa@0RqwlZ*o{70LXR$0sx-|#|r=fZflktZ00DE(4g&xIbl?sH00D014g&xIW$X?E00C|C4g&xIb@&bg0{~wVjRlJZ00Aik4+8@LIT9NVI}!i^DH0C@1Oh4!I1(BTIubf4*wKI*4}$;!Xdn**00D3^4+8)JVK@&100DA74+8@RUJ{H2iUnyXUoLZJFwg)D4})~_0R-&ys`j3&w;4w0Thma00DC@5CZ@Lb8tiu1H7&Q00LiQs1E`(X#fBLWK<9X00CuQ5CZ@KbYu_%00CiY5CZ@KY;X_*00DJ&5CZ@KZF~>|00L!oN)Q8r5CZ@LE_41?0y0DZ00C~25CZ@Lc5i4<0Gtp500C*D5CZ@LV|0iR1FR4O0sv4G`U?O7a=Z`&00Cvf5CZ@KX2=i&00Cys5CZ@Kb<_|800d%lY+>3E0~*}{NZkR5-2ngrI^Ylk0|EjJQxp6PIw<0(f%>O`00CwA5CZ@KV+aug00C(Z5d#1Lb`%i<00Cth5d#7OkP(UzIw*K(fP`m&00Ctt5d#1LXEYH500Cq=5d#1LX+RMJ00DAF5d#7TR1^CPFJn4nUt%s0fP&zp0rC)oAQ1!91p-VF1MGhS00D1O5d#1LX><_-00LxmdJzML*8ua1F#MQ^bZ5P!~iG|1FR(gvJeB-+yQ_Q1NH&{0s=e(ECV_yG=hOhe}Mo2a>x+_0RcJx<`1OUts%L#-Es}KMIDbx}J0Rg!XAX1J300C#@5(5AMZtM~R1P99y$_axCst{&!C}}QbZO#${0)hbE5`*#*11?+w0$Tw7T>t<9WcU&T00n1bZ((lw5d&5d14JqS9uotQZ2$rTQ4duHFFJ5SXM);6f~r9R00DD469WJNbW9Ti00C%H69WPPQWF3SD4eK)00DAd69WMPN(m@sey)LN69WJNZf+9;00L!UdJ_XaUH||Abbu2B00VAkbI5)HSQ7(^69WVQF#}%+F9Tr+00AkU69WbVFaur)E(2f)T?mE?C^{~v6NAtUf&>Ht00C^S69WJNWyli)1pqe(o00CzL6axSQc5Y_Q69Who1E?GT00VS&c~ETt)}R7-7XSbSZ)s&=btDr5kP`zA6ayR-17d>!3Idl8F#$6HH32sPM*+?YEDrS#T?r^@ragdC2><{AWk3`I0Ri9+Y+e)t00CrV6axYPISa8300Aj-6axYQI18{1D0mcu00DG<6axSOY={&C00DK56axSOVU!dD00Cy26axSOWuO!T0suP;vkd?NDXbI&0s%S;vJEJ*6oUW(dAJk<00D5q6axSOZ^#q_0suV=wG99PDby4L0s%Y=v<)cQ6oUW(W#AM800DOD6axSOZ}1cY00U%WZKf0h&J+Xo6axSObo>+p00D9e6$1bPWe^nu00DCr6$1bPZX6W@0sub?w+#RRDJT^K0s%e?whbsQ6@vf)Wi%B700DD86$1bPVMG-J00DAJ6$1bQX>Ukh0lw=100DDW6$1bPWndKp3IK@`pAwi5trEKunh=K)of4}Oxe@>YDQp!33JHi3o)VW3tP;8snGl8&oD!-MxDsh)a%5v|C~IgU6$4Ne17;NiXifpbP5~TG0fH5Sz+V6|^8o+@ZgXsG6a$DA1LQve00whrVq;`zGJXJfegL?B0MtAJ8a)DBJpup$I?xpZ1O)5|MgwaDk_Rt3E^yjqg6b86!es(VJpup$a_|)c2LX!*4h)_MXbG$f76vH2eS10s+D1OS%}N)we0ND}}7DL@tj1_F!?KNFS>NfVR}M-y)-w&4Iu7J~o*Yfu&g00VMwb_^Z@W)=e?2><{CWOQXV+5v(q0Lm8t00m)WWp8Q16$1(u12z@|Y!(B076SnRVF6^!R{#J3a-J3g2mreS{}ChynFuEikqJEp7zzLZDXbO)2m`tU{t+VwmNXXmZlW0ep7>0szYd(F_0qWdIlh00L=YM&SSwcmW0go(6{xF%en`iVwyM00C?k7y|$SVI&v>00C_(7y|$UFD_|r?SWA30Y;nv00Ct-7y|$WZgg^FcLo>(3>X727z0EY1Dt>X00(7Zbz*aGcOn-9j28pw7X!S<0rnRIN*DvScL4wbY;zi}0h+J@00D4*7y|$SV~7|700d!nb##WR0cLpsD69dF7y|$qV`Xq=X<~D4a&%;Bb!}&McWZHBY-nzNdhRR&dYc07qyqe^0{pWAdbt9Y$^vH30*u!Jw&wz%@B&iu0;u%@F8Tth{{kQc13Cx;eh33V3ImD}11b~)h!z827z30T1LjZwV@&{$O#szR0QgM+B~AcuP5^UG0HjU;&`tpHP5=~705eYjR8IhqPXOLe0R2w@8&Cj0Pyks_0H{y^(@+5aPyjSh0AW!8j!^)-Q2_o?04q`eSyBLpQUJJ80J~BE^ilx$QUEzq06kLxg;M~DQvlCX0MkHH|5gA4R{%v<07+K>j8_1VR{+ab0MAzd7gzurSO8yG0ApAHtXKfBSODx;0Pt7{yh!0H$34&|LujT>vj$0Fhn*m0keVUI5u%0PIawO;_aUjPtb02E*Vc3=Q{U;wIM0IgsE;$Q&gU;rm!04retYheIyVF0FK0L@_l=wSd%VgOKL0Fhz4oCu0C;V*rU`0J&oT_hSJ2V*n&%0G4C`3uOR(WdQYM0QqGAC1wCoW&nU@0Ip^L>1F`!W&k;706k{_d1nBnX8_q}0NrN*5oiDvXaG}a09R-Lm1qE&XaLP<0MTdw2x$NeX#i1a099!KnrQ%@X#nGC0Ox4{D{25QY5-ws0Dx)$uxbFwY5*8(08(oJe`^4+YXIGA02OQid29gPYyd}X084EEX>9TUojZvZWC0B&ypa&G{;Zvek<0RC?P0&oC9Z~#Sc0EBP=h;RVNZ~)A301R;e5ODxdaR5|t0F-e6m~jBuaRA(L0331vAaVd-asXp;0G@IHqH+M+asc0Q03mY#C366Ta{!2Q0NZl_2y_5ObO3a80K9Yn_H+OubpT;?0DN@-taSj`bpQl*06TU7KXw3ub^w`n0N-{15qAJUcK~g70Gf9I!FK@pcL4o&08DrQPrR00JeDmx_JNrdH^hX0AYFnlzITidI0x&0Q!0WEqeeldjNTR0DXG^w|fA)djR%(0Q!3XH+%p)d;o)d0Ec`4(|iEed;lbU04RL`ZG8Z7eE`*c0NH&2J$?W|egLI@0I7Ze4SxU;e*i~+07`!Vf`0&oe*nXO0LOm-4S)af&i$30NjEA6oUXug8+Vm0I-7qhyVw04jcf5kpNVY0EdwPyO99ykpLc&08Wwsj*khY0C$xDs+9oUl>ic!07;erftCQWmH_9L02`M8P?rFPmjJt$0PmLoB$xnKm;i^E0KJ$1`j`MWnE-T|0I`_>vx_MHG3o&YkQ0C1iFbe;gHo&c<#0OOtj=biu^p8!dp0DYeTt)Bn`pa3zT0AQd1ke~pupa9sQ00^M~3!wl;p#Vyu0D++Zg`ohwp#Z_5005!@1fl>`q5xQ;0Gpx!pP~TRq5#{X02-qJ9-{zhqX2EA0HLD*q@w`tqX6=w041aVD5L;bqySr_0F$Hum!tsJqyXBa02ZYH8l?bTr2t{20H37*qon}Yr2yNd01Ku74yFJ;rT{^v0CJ`Pb*2ELrU0g<0N$nm;-&x{rvM?R0Dq?dgQoz#rvSpI0Q{!_0H^>vr~p5x0C}hYeW(Djr~tL70Pm;(^QZtssQ^f+0C1@Qbg2NGsQ{p<0LZBT%&7nassIP709C30S*iezssNIz0OP6v=c)i7s{kXb0CcMWc&h-gs{pjC01B)C4y*u6tN>4}0I;k8w5$O9tN;M505h!sH?06~tpIba0I972t*rq1tpNV508Op{QLX@ot^kX!0Nt(t;jRE0uK*se09CI5S+4-6uK=sB0N}3xf_k0KKsQ!Lb1Ju>kn704}lsGO_?0E)K&$hQE@w*U{g028bU^!xd1A<04}-!WV!%ox&WWL0HeA9+`0hZx&RZq02aFdSi1mRy8xQI0G_)5(YpWuyZ{5d0A0KQVY~pNya1=X0Oq^^>bw9ky#O`60C&9rd%Xb4y#UU=03W^pBfbDQz5r&v0BODenZ5v=z5wCA04BcxD!%}4zW{T;0JpyYyT1VczW@Wk07$?9Ouzt?zyO%Q0OG&^=D+|d!2mA70C~XxeZc_1!2rd<01?6f6~X{(!T@i=0Kvil#lisU!T<-u07b(9eZv5>!vN>Q02#ypQ^Wvu!~mhh0Mx_)1H}MB#Q0O!a66v+TW$pD1O0HMhM(8&Py$p8$>08+{TamoOq$^fOx0NTm`-pT+D%K#C}09VTZTgw2C%K(zg0N%?0;>!R&%m6~n0ENr|iOc}P%m5+H06fhAYs~d-h00YhdFU|mC&H$Fq0Km=w1MB&;ZfU058!1ThRcE(E!-d06fwFK+*tu(g1zZ0J_ou=F$KX(*Qox0EW{5w$lLD(*PjU0B6(yztjNi)BqRN06^6Man%5Z)d0!W0QJ=XBGv#{)&Pdq0Jqiv=+*!j*8oV@0DIQ}rPl!I*8m&X0A$zzXxIRj*Z`T>0L$0_&e#AE*#Irs0GinVp4kA&*#P$004Lf2RN4TZ+5pPh0212(7TW+y+W>sq0Ds#6vfBW*+W`980RGzmKimLA+yI2!0EpZG%iI9Z+yLy{0R7wmE8PHD-2jN)0KDA*zuf@--2ejK09W1sTiyV)-T=7X0QlYj{N4aZ-vCSB0Fd7Rl-~f#-vG|v00ZCv2jBof-~dJ70EOTHiQoX+-~iv?03YE1BjEsC;Q(Oa0Gr_epWy)1;Q-j-01e^*5#j(&;s8?O0F>eYnBoB2;sD>`04d`DE#m-Z;{a>p0H)&rs^b9P;{f90059YKGvok!NlP2~WBE-|_=Kw9|0Cnd8dFKGH=K!S;^zP}=m0n90CwmAdguVb=m5p&0Q=|w|L6cJ=>RV209@$+U+Dm#=>Q+<03+%ETHwzd0O9HYi{L|0C(#Ed+Pwi>i`|>03qxEVC(>7>;RqY0HN#v((C}$>;MGq00->=I_&^H?Erc00DbKMj_m-S?Euv60N3pR5$*sL?f^jU07UKpcJ2Uq?f|6j0I2Q&;_d+E?f@?D05b0YfbRf=?*Pp20MPFM9q<4l@Bmow0EF-Wx$pqy@BkF?06_5oZSeq`@c`%X06+2ock%$<@&MxU015K|DDwbh^8nBD00Hy>9P|K7^Z<7B0P6Gr?(_f|^#E-30KD}83ibd{_5hsr0POYvI`;sE_W;)S044YUbocUNum=J52LVP10hb5?=m-Hi2?31>0pSS&F$w{K3IWp!0VN9ocnbl{3jrGp0c#8ay9@yg4FO&a0kI7M01g3A4gsJJ0r3t2Lk|I#4*};70XPr=iVy+Z5CJa{0fG?$))4_J5&?P=0m>2qA`<~l69JYJ0o)S-BoqN}6al*w0sRyKJQV?f6#>H)0SguZQ5FG{76H>10TvelV;2Fq7Xb_y0b>{ew-^Bp83AD#0j(JU_89>~8Uc|S0l69h`WgX18v%wJ0n!@*7aRd$908*o0p}b6D;)t;9RZjf0ook_10DfP9s!ab0ofh_A0Gi_9|5i(0s9{TJ0JmsAOY+k0ZJhOr6B?RApvJ10nH)-Fe3qyBLS)-0sA8XEhGV2Bms#e0lOpt&m;jgB>_1l0b?ZrlO+MeB>^lZ0Wc;3WhMb=CIOr#0iPxT1t$RsCjoIM0d*$*F#%sO0jV(otuX-sG64lL0b?=&XEFiLG6B;v0T(j?8#4iSGXZ-u0nIZ3(K7)RGyxej0cSJ;Ycv7EGy%pm0V*{CE;RvoH357z0md}}$~6H1HUR@R0YWwbMK%GHHUXG60s1xp{x$(vHvwEX0hTubnl}N|Hv!l;0VFs9C^!LlI01Y(0n<1E*Ej(^IRQaA0j@a#vN-_}Isp|r0b4o&UpfJ&IsvOX0rENl_BsJHI{`R50e3qAx;p{tI|1!G0VzBIEj$5dJOOJw0kk{;xI6*+JOTbZ0YNJpm9t0V+NLNj?E}J^`3M0n0uC`91*@KLJKR0dqeAu0H|WKLH{@0VY5JWIzFwKmou&0q#HnA3*_BK>?0I0lPr~>p=k}LIFfV0bfD^m_h-YLILSQ0qsHoHbVhALjh_-0c}G8v_k>7LjnIo0Ruz;8ATLCd!0ef2ke_H{}TLI8p0SjCK4_pCBTmgAp0jpdAu3Q1>TmkJ|0V-VqE?ohUT>+I{0mNMa$6W#TT><%B0W4ktFkS&@UIA=g0i|96;a&j}UjY?g0b5@IUta-qUje6I0oPvv2w(v^U;%Jo0k&WP)nEZ7VF6uX0p?)=Z(;%dVgUkU0X|~^YGVPIV*$ux0T5&X6l4KUWC6`&0nuau2W0^(WdT)X0fS`$v1I|>WdR9h0Y_#5N@f9=W&xaL0o!H)-ev(YX8|>50gYz?k!JzaX93t}0Xt{`KWG7XXaRg^0mWzm@n``cX#r4a0e)!#tZ4z>X#x3Z0TyZjL23bTY5}Nf0mW(o;A#N?YXLZG0at4Qc54C7YXQ=00rG1BCTsy#YypLA0kmuZ;cNjbZ2>QB0d;KwsciwQZ2{qJ0px7~C~g5PZUJy^0d#Hw!EOP?ZUOdg0r_qLVQ&FtZvn?|0n2Xz1#kfgZ~;hg0d#NyqHqDzZ~+5x0XuO4KXCzyaRH8T0o-u`;Bf&ease)K0fce^h;jk#aslyj0Z(%QQ*!}~a{-WZ0oZc^+;agVbO9%H0ey4>0gQG5)OG;`cL6qc0XcU8es=+~cL4@?0Sb5lVR!*$cmc0?0ke1k(Kr0U3G$O?m-mdI6n!0ib#T<9Y$-dI3Ir0YZBLoqGYHdjaQr0qc7KHGBa%d;x)c0fl@4yLeE|`E0Tq4$N`3)OegT7i0f&A8ynX?|egXe}0Rw*lMSlTFe*uGk0f&D9!hZqAe*yb{0semhMt}iIfB}kt0giwH)PMolfB_DH0TO`$J%Is1fdQ0(0hoaS*nt7ufdL|d0VaY0T!H~$f&q(y0gr+K+kye#f&n3e0VRV0Z-W7Ig8{vR0l|X-`-1`hg8@2(0X~EQbA$nQgaOBd0n3B|4TS*_g#lZI0bhjysf7Wpg#qV<0qcbUCWZkjh5=uO0b+&$kcI)1h5^`y0YirYx`zS2hXLt_0XT>OW{3fmhylZh0r7|dB#8l3i2;U*0j-Gv)QJHWiUCQA0kDbzw2A@HiUCxM0a%Lxii-h`ivhoj0q~0fA&dcUi~)0u0j!Jx;EVwgjRAFy0eOu9vyB0^jRE(K0WyvOV2%Nfjse7u0mzO4|Be9zj{!K30X&ZZbdLd{j{(n*0s4;tDUbnIkO72{0kV(*-jD$ikpW1N0eg`FsF4A|kpcIS0Tq$~L6QM)k^!NT0nU;E`jP=ElL3H}0mPF5@RI={lmS(g0h^Qo(3AlHl>tqa0eF=Gl$8O%l>zOQ0UwqDP?iBxmI0QQ0h*Qp*p>m@mH{1?0U?(GX_ozM%>ngLdt0pgkg=9&Qun*lqU0X~}nY?}dZn*pes0j!$=@0$Vhn*k}D0WF*XXPg0RoB^kt0jrz=?wkSgoB=wW0Y04pbe#csodK?$0o!AS^q5&DA0Yst!NTLC9q5*cI0jZ(^tfB$mq50bHqXAW;0g9smj-vs`qXEmK0RyA~2c!WQqydAZ0f(dkvZMj+qyasp0gj~s+NA*}rU8GZ0fVLiqox7-rUCz^0UxIUOs4^urvaR&0okVk1gHT#r~yEz0e+|ff~Wz&r~$;N0sp801E~Q&sR3}Q0hg%(#;F1EsR1FX0aB^~f~o3abG#s{v=L0lupN=c@rttO2vE0UoUZimd^TtpT#F0nx1i>a76_t^q%;0hq1<)vf{9t^o+I0Sm7IPp<(}uK}p90j#e9m2n0dKMaz_I}hvjIA@0dTVcbh81jvjMWR0o=0z2DAY$v;kPO0fMvvue1Tzv;iKq0dBPcaX=(hnBxB*4D0bIBNjJN^zxB>dO0Z6$4Ot}G-xdEBE0oAzy*|`A}x&auv0a&^LT)F|7x&fWK0ra{7___f#y8$`70e!mxfx7{|y8*(x0rk59A-n-rya9u}0kOOR-n;<}y#Y$S0dlT8M#sT}r0ZhjMP{#qE#{r|q0rAHH^~V80$N@#j0gT82kjMe~$N~Mx0T;;uHpu~w$pPlc0Yu6HNXh|X$^q%h0qx2GD$4;!%K^8`0lUiq&dUMl%K<0M0d&j(nalyn%mF9O0V~Y`Pt5_1%>ney0r<@U7|sD!&H-A^0i(_Vr_KTP&H?()0V~e|F3$mG&jD)B0kF>jw9f$u&;bn40bI}lV9)`-&;i5H0Ugl+A<+SD(E)PN0i)3YrqKcD(E%FL0cO$xoYDcH(gEYr0q4>ICDQ>Z(*bJJ0dCU)tkVIo(*g6-0r%4ZIn)6?)B$?b0e;j0tJDF|)B*j}0YKFOlGOpv)dBw10YcURM%Dp^)&Ysu0ln4%!PWu$)&c+40Xo+KKGy+z*8!r}0r%Gd`_};(*a0`#0d3d;aM%H-*a5280rJ=Z_SgYD*#SV=0gl-LlGy>%*#Xzt0SDRv3fcic+5tq`0ead2e%b-J+5x=U0sq}Z;{j>o0iNRlqT>PE;{o5}0T$!|8sq_Ndh}<^eV40g2`TjphN$<^j&;0S@N@66XO|=K)*i0hH$fnCAi7=KZ_=0cYs}mgxb-=>aY30WsH#0?0VC@Hi|YZ8>jCuZ0r=|yaqIzg>;c*A0p08YP3-|u?E%K^0m|(G;q3wY?Ex6>0a@+=UG4#n?g5eR0m|+H&h7ya?*UZr0fX-Wyzc?)?*SX|0Z;G&eDDFN@B!2C0RZs7|?e_uk_W>yQ0WA0dX7~YW_yNB70mAqJ`S=0-_yIWi0X+Eub@>5#`2n!`0kru62KoUC`T;Ha0j&A~u=)Yv`T-I90Ydu$aQgvs`vIf-0jB!_?fU`o`vE-s0fqbliTnY+`~kxJ0UG@Q9{mAj{Q=4S0nPmZ2mS#H{sBw=0c!pMhyDQ*{{a{O0cQUJY5xJo{{hPX0T}=S9RLDp00Nc(0-68<)&K(900JHX0wMtdT>%1N0Roo+0-FH>+W`XK0RlS$0zU!*VFCh+0s^!G0_Xw)N&^B;0|J!;0+|B>&I1C{0|EjB0tEyDHUt7W1OjaY0&oNZsssY(1On;=0#F44R0RUO1p>eY0@Vcq`vn3}1_F2n0-go}+6DsN1_B}n0wxCnR|f)G2Lhf40-^^3+Xn*Q2LdVx0xk#wa|i-=2m-7K0TLb?+F4i3Id4=0*wj+)CvOF3IZhy0x1guj|&2m3j+HK0{;sFHVguR3<8A=0?P~n&kO<;4FVYr0#FSCR1E@*4FZr20?7>m%?$z^4gw$!0$vURVh#eJ4g#bO0_hF{?G6Gs4+1<70&5QfZVv*f4+6~(0s#;LP!IxC5CWYL0-+EB+z2aj!xRGb6ax7a0x%T*o0;n4TmLH|9|AZa0z4oBav%bBAOfl&0nj2!ECMMk0%R-#Xedu?^e+M=FalFB0)H?9yf6YUF#?c9%RK@PJ^~Ux0!TgrOg;jDJ_3Y30<}H@>OKMiKLRa30(U{&C0yRPccR~VtLISHo0@*?W2SWl+LjqGn0*XTdjY9&)LjuY}0uMw2JwyU-L;|-&0=q;4{X_x*MFK!Y0z^dujYR^vMFQqU0u)99LPi2?Mgp=%0_a8p4Mze~M*@RK0+~kwx<>-&M*<8;0whQRbw~oENCKuv0@X+Y*+>EuNdg#20!~Q+Qb_`nNdlKi0@FzX*GU2jN&*f_0zOItK}rI8N&`ek2P69|y0(4FSpiTn0P67l^0tin6Oiuz(PXdom0+UYy&rbr=PXZ870u)dJR!{<3Py(G$0-;a>?oa~qPy#to0zFXza!~?xQ39(`0`?;nQ35DZ0xVJjY*GSnQUbbC0=`lL0#gD8Qvx(o0yk3va#I3!Qv$V90=ZKH{!;=1R01+o0yR_uZBznrR05n-0-#g^)l>r6R00xJ0v1&QOjQCdJSOS7r0GQS^{`l0@EM0$p7Ks$BxET>|-C0{vYAHC_U6UILt60?1wh244bQUjnmV0s>$HAz%VUU;=hv0rWCHkP0{mnGTV(=YWdf>Y0EYh0A~UOX97ZJ0!C*7h-U(fX9CP;0?=my6lek%XaZVj0$ykWlxPB&XadY=0?=pz5orPyX#!Mf0$6DRjcEdrX#(hJ0_3Z33%p0thj0R>a01hC0t9gaNO1yuaRRAv0@`r`-EjgKaspv;0)27?=+0!VrSOnL&EdIFw$0_%DL?|K3^djdOq0)=}5iF*RPdji0F0tI{m348)bd;&~-0-SsTpnL-Bd;;%$0yKRBIDG^y<%Y6bFegYkS0%m>!YJLKwegdd|0^@!H=Y9eqe*z_c0#|h5|2!0%(Q;Y=#1)h61RD0^)`O=7s_whXN#r0%V5*Xomu{hXS~V0`G?c^M?W{hypE$0%3>(WrzZ$hytmI0`iCg_J{&Wi2_ZD0-A{eo{0k8i2~t?0wIb5C5i%DiUMDX0=9|*x{3nviUReD0xOFGFN*?Wivnkh0;h`ttBV5divsbB0xpaKGK>Osi~@O#0>g{~$BY6IjRF;o0#A(sQ;h_O4%8ddHjsg&l0!@wrQH}zXjslpD0^*JW=8gg|j{-E00&b52a*qP7j{>oe0_Kkb>5l?7kOE|o0+Emc<&XmDkOC%=0xFRLYLNnNkpi=k0=JO@@R0)akpec70y>fceUbu!k^;h#0>+X89+LthlLA?j0=km|zLNsvlLG#e0ymTbI+Oxxlmcy(0=tv~zmx(4l>!Hq0#20zQk4Rel>(QQ0^yYc<&^?ZmI73k0+^Npy_N#&mI4@;0y&ogWtReymjb_+0t1)=BbWk*m;#HK0>zjD$e04#m;w!%0z8=likSkonF8RM0u7o1S(*ZmngWuV0_B6!u*n*tb{0#BO)Qkw#bn*xrT0?L~L&YJ=YoB|J=0!5qxNt^YdE#+(A%oB|7-0#BU+q@4n&odUz10wJCPC7uFFo&s{70h#L|DpnOqXKuM0-mD+*P{YLqyk2y0%@cIm!tyCqyp}w0xzWkZlwaor2@*O0_vp#7p4M8rUG@Q0;Z+{+@=B&rvgN$0)D3gwWk8?rvgo=0#T>}r>Fv}r~><_0{^H2PpJY^sRD?p0*t8w#;F3zsR9nF0urhMQ>p@2ssfm*0-UM>+NuKHssbdd0w}8jc&h?@s{+QW0?Mlb1*`%ItO87|0#K|1kgNiftOC@m0@$nq2(1DOtpZ-H0)4FlsjULntpWqC0x_-vgRTO%t^&HQ0`IN@@~#3guL3o%0(q|jeXjz+uL8xd0uQhP6R-kKumV!B0*9~yim(E}umZ%e0{*Z90wc20*|o*ld%HGu>#Do0syiC1hN7%vH~`;0)nyvhOz?1vH}{j0v@vhJhK8^vjT{-0<^ON;Ije?v;sP`0%^1YnzRDTv;zCI0xY!xT(ts^wF1$#0!g+4&9(y3wgLsW0z9_@khcPqw*uL>0^PR)A-Do1xB@)50$sQQk+=fGxB|ww0ui|a6}bXLxdKPI0*<)?lDPuHxdO$x0tmVS47vhjx&mmr0^=eq(*yaGR+#sY%I0=32h=f(mX#{x^o0*l82kH-S_#{&7s0$#`hV#or=$O6mA0yN12ILQK@$pWIu0tw0j4ax#`$^v@I0^`a8=gI;x%K|ma0)EQ^g3AKT%L35L0u;;w7|a4x%mP@<0+7rClgt9b%mVMs0zAzEK+OVw%>u8@0>I4z@y!B7&H`%A0<6vg$Ib%v&H^aU0$9%ihR*`T&jR$%0wT}?QqTgy&;rHK0w~b}EYSi%(E@PM0+Z1KzR?2e(E<|E0z%RPaMA+G(gM!X0ua*z6w?Az(*jr10-n9*8;!S0`k`aCD;N{*aCvs0>;<^0NDa1*#cVG0*BcGz1af6*#i980%O_&XW9aa+5(;00{GejR@(wv+X9o@0+-tY+1mo$+X58a0vOx^Oxyxz+ychj0?OP1G~EI?-2$N90;Jsnx!nTF-2(jG0xjMGV%`Fi-U7tl0{q?rGv5MZ-vW}~0>0k@_um3E-~wsj0;1po(BJ|R;Q~kD0%G9;kKqEr;R5gB0wUr9P~rl6;sUqg0_frbS>pm-;{wj(0@C9G_2U8%Pw0v6~3T<8K|=mNCp0=Vb`@8|;a=mJCO0!Qfre(3^&=>p;D0_EufC+Y$#>H>x80*UGZ%IX5n>H-|=0wC)GSL*^>>jIYR0-Ear=Ia9L>jD|<0v+rEdF%px>;k;(0>JD78tnoe?E+iv0$=R{&Fuow?E)I^0v_%Hf9?WcuhwuW6@B+c`0>$tG{qO<-@d8ot0#)$>mhl3b@dCy10?F|L`tbt&@d6I=0x0qVfbs&Q@&fDf0yy&mYV!h&^8!2c0zdQuWb^`%^aAAc0u=QELG=P~^#Z*00>JeG{q+JZ_5x$}0+aRv$@T&O_X02X0y6gkZ1)0?_X7O)0s!~|a`*yv_yU;t0?zmX0{H?o`2u740+0Cu)cFF~`2raF0v!4RT>1ja`T{un0<8N2u=@hn`vMI70ucNHO8f#&`~rde0)_knwfq9P`~nL70uKEGLj3|p{Q`yk0*U~~0tEg7O8x>){sM~r0*?Ly#r^`x{sI910y6&sP5%O>{{pK20`dO>_5T7w00Tw<1AqVnga8A<00YGU1KI!sG64gY0Rx%=1GoVL<^cm00s}(=18@QZodN^P0t5U41OEa8XafUm0|TA|1EB*0h19Jxhvj+pW2Lt;D1OEpDF$e=S2m^2k19S)jtOx_J2m|y81NaC7LZ4g>oR1OE;KIS&Ip4+D1(1A7kx!4Ct)4+97g0}K!YTMz?Z5CfDD1D6m3(hvju5CdWn17;Be&JhFB5d#Dg11=H+i4p^i5(BRi1I`iy`Vs>u69ZNg1B4R;#uEeg69Xm`15^|PxD*4t6a(ZG0~!?rO%(%y6$7&s1K$+`I2Hpu76XD71BMm@&lUsI76TF&0~QwpXcq&E7X!K%1Mn9EJQxF>7z3gh1Kt<|;ur%q83Q^Q19uq%dl>_}83Vr=0|Xia2pR)H8UsZd1BV&|iy8yY8UxZA0}~qq7aId_8v}D21G*an^&10090O(?1Bo01r5ppu90Lm-0}mYoNF4)A9RqgMt9RmO!10Eg&bRGkE9s{`^1HB#t1s?+m9|Jxg1417IjvoV(9|Oi81Iix*`5y!P9|I8}17sirwjcxQAOjB}13MuDbRh$qAp_tc14JSNNFoESA_KA_0~#X(9wP%#BLjdV1FjgD+6>Z1F0(mtt$iUD+BN=11c;7E-V9JECXaL1C}fUnJfd)ECbXm0|hMu2rUCUEdz8d19&Y1tt|twEd%5&1L!RS7A^xsE(3Bd1EwwmsV)QPE(7c?13WJSKraK7F9Vn_1KckI;4cF!Fas|z19UJ0crXLIFay6Z1NATi`7i@6F#|F&1Aj3CgE0fcF$2dj0{}7u1Tq6TG6Ov_19CD0b}|FEG6TCZ1N|}s0W$+cGXqF71ClcXmNNs;GXvB!0}nI<6Ep)zGy_XC1BNsMiZlb&Gy~Z*0|zw&3N-^uH3NP%1H?50^ECq{HUnxl1B*5TwKfCPHUkPb13EVYJvRewHv@1t1Hv~0#y0~2I0FPY16Mc$TQ~!kI0KqE1MD~h@Hhi2IRh>^19~|FemMiKIRmjd1Kc?S;5h>kIs+6s13x+gLplR|Is<d1KC3Z-9rOBL<2xX1B*lhk3<8*L<7e}0}Mq25Jdw%MFT-a193$IbVUQAMFXWp1Mx)z^+f|FMguBF19CIOatFc0~t*N9ZdsRO#@s_1CdPwluZNUO#|mm11U}eElvY>P6K;R1GP>AxlRN0P6PN(11(PjFi!(>PXl*P1G!HFy-x!NPy-8414U2+Nl*iXPy>ii1HDiKz)%ASQ3DK715Qx`Qc(k(Q3Ie+1KLpo-cbV?QUe`Q15#20RZ;_oQUkkE1MX4-@lpdWQv)(n19VdZcvAzmQvJTLZ*f1ISwg-CF|-TmwE_18ZCZtXu=}Tmvj!120_zm0bgwT>}AL0|j0K8eRiRUIUn31Ls}?6JG;FUjutz1Abov%U=V}UjqPO0|a0LP+$X8U;~d}1Cw9_)16pANabW|mVFT@911(|$aAE_6Vgt2e1KeT*9Ag9MSeWRksaTj8n3$M|SeO`?IGC8|=;-L^Sm@~Jsi>)`si~={si~={si~={si~=`si>)`si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={NQjs?n3(A3=&7lxsYt1)si~={si~={si>)`si~={NSK(Zsi~={si~+)n3$=lNa*P3si`>V=;*1bsi|1#si~={si~={si~={si~={si~={SeTfYn26};=ve6Jsi`=rsi~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sYvKp=vY{on3(A3=&7k#D46Kz=;-LFsi~<*n5n6$si~<*czAetsi>)`si~={si~={si~={si~={si~={si~={si>)_si~={si~={si~={NU5l)sHv!_si~-`sYvMP=;&COn3(A3=;-KJ=;-L^=;&B@czCI)si~={si~={si~=`si~={si~={si~={si{bqsi~={si>)_si~={si~={si~=`si>)`si~={si~={si>)`si~={si{bqfavJx=;&DJSeTfIczAetczAetczAet=;-L^=;-L^=;-L^=;-L^=;-L^=;-L^=;-L^=;-Jusi~={NU5nPFsZ4jsi~<*=;-KJ=;-KJ7^$eKsi~={si~={si~={sHv%`si~-`si~-`sHv%`si~={si~={sHv!_sHv!_sHv%`si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~<*si>)`si~=`si~=`si~=`si{avD42-o=vbJTm>9_Dsi~={si~={si~={si~={si~={si~={si~={si>)`si{b*sHv%`si~={si~={si~<*si>)_NU^!Gxv{yixv{yixv{yixv{yixv{yixv{yJm{{oO=;&A&n23l-n3(A3SeTetSXk)jSm@~J=;-L^SeS^I7?_x?tf{G~sHv%`sHv%`si~<*n3(A3SV-vT=vYYT=;-L^si|0)n3#x&n5n6$s7T1@=vauDn3$N@*x1M@NSKJ2=;-L^=;-KJh^eWmsHvz(7^$f^=ve4j=&7k#si>)`si~={si~={NLYAyc&VtVsi~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sHv%`si~={si~={sHv%`si~={si~={si~={si~={si~={si~={si~+)si`=aIH{)`si{a)`si~=`si~={si~={si~={Na*P3=;-L^SeTfpsW_Nen24B|7^$f^Sjfo8$k@op*x1;}czCI)si~={si~={si~={IOtgD=;&COsi>)`si;U8n3$=lsi>)_si;U8si~={si>)_si>)`si~={NZ8oO$k^D}*x1)`si{bqScs{qICyxesHv%`si~={sHv$)n3$=lIH{>Pn5n6$si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sHv!_si~={si~={si~={si~={si~={si~={si~={sYsZqsHv%`si~={si~={si~<*C>WTSn3(8TSm;>jsi|0qnCR$Oi0J58n3$=kt*x!Csi>)`si~={si~={si~={si{bqsi~={NQkMaIEd)zScvH8si>)_si~={si~={NSKJ2n5n3#si~<*si`=asi>)`si~={si~={si~={si~={si{afn3#x&SP)=;-L^=vbJTi0J64sW|B9=&7k#si`=anCMuT=&7iwsi~-`si~={si~={sYvMP=;-KJn3(A3SU3=vh?tnEsW_O3i0J64saUC~si>{3t*xo4si>)`si~={Na*P3=&7lxsi~={si~={si~={si~={si~=0n3$NDn3#x|=;&C8si;VZsi~={si~=`NSNs8=;&A&si>)`si~={si~={si~={si~={si~={si~={si~={si~={si~={si>)`si~={si~={si~={si~={si~={si~={si~={si~=`si~={si~={si~={si>)_Na(4lIGEVj*x1PE=;-KJn5n5asi~={Na*OPsaTkZsi~=`NQmg@si~={si|0q=;-L^=;-L^=;-KJm>5{-=;-KJm{^$T=vbJDn3x!N=;*1asi~={si~={si~={SeTfY7^$f^nCR%}SgENvsi>)_si~={si~={si~={si~={NQhYI=;-L^=;-KJSeTetsi`=rsHv%`si~={si~-`sHv!_si~={si~<*si`)`si~={NU5nfnAq6Z*x1ERskpefxVX5uu(7$Zxv{yixj3n*si~=`si;UenCR%}=vauUsjaQ8t*NQ0si~={si~={si~={sYvMP=;-L^SeTd?m^i7aI5?@Psi~={si{bqsi>)_NU5nfn23m&m?)T-h&Y%S80hF&=vbKO=;-KJ$f>ERsHv%`si~={si~={sW_PE=&7kVsi`=asi`P9n3$M|si`=Ksi`=rsi~={si~-`si~={si~={si~={si~+)SeU7)si~={si~={si~={si{bq=vbIYh^eWmsi~={si~<*n5n5a7^$eKsI9H7t*NQ0si~-`si~={sYsZZ=;&CO=vbKO=;&CO=;-L^=;-KJh#0Arsi~={si~={si~={si~={NU5nf=vb+!si>)`NU5o*si~<*si~=`NSK(Zsi~-`sIj@Qxw*Nyxw*Nyxw*NyvAH;yn1HFNsi~={si>)_si;V)sHv%`sYsZZn3$=lsi~=`si~={si~={si~={si{cl=;-KJsi~={si~={si{b*si~={si~={si~={si~={si~={si~+)n24#Vsi~={si{b*sHvz(NSLXqsi~={si>)`si~=`si;V)si~={si~={si~<*n3$NUsi~<*n5n5asi~=`NSNrUsHv$~=va7osi>)`si~={si>)`NQkMZsi>)_si;VJsi>)_si~={si~={si~={si~={si{bq7+C1&=;&B@czAetc&VwWsi~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sHv%`si~={si~+)=;*1bSQr?XnCR%}=;&CfsW|B9Scs{qsi{a9m@qh45a{UWSeTfpsW_Mz=;-L^=;&A|=;*1bsi~={si~={SeS^ZsW|B9=;-L^=;&COnCR$On5n6$si~={si~={sYsY8cvu)1nCPjgsi~={si~={si~={si~={Sm;=-t*NM~sYrNusi~={si{cl=;&COn24B|h&Y&77!a7LsHv%`si~={si~={si~-`si~-`si~={sHv!_sYsZ}=;-KJ=;-L^=;-KJsi~={si~={si~={si~={si~=`si>)`si~={si~={si>)`si~={si>)`si~={si~={Na*P3si|10si~={si~-`si~={si~-`si~={sHv%`si~-`sHv%`sYt1*IGCxZsi~={si~={si~={si{bqi0D|Dn3$Ltn5n3#sHv$)NQju2*x1;}si~=`si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~=`si~={si~={si~={si~={si;V)sW|B9=vWx&=vWw-=;&C8n5n2pm>8H?h?tn@si`;^si`=rsW_>qsi~={si~={si~={si~={si~={si;V)sHv%`si~={si~={si~={si~={si~={si~={si~={si~={sYr-;c&VtVsi~={si~={sYrNuczAetczAetc&VwWsi~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~-`si~={si~={si~={si~+)n3$=lsi~={si~={si~={si~={NU5nfIH{)_si~={si~=`si;WkScvH8=vb+#si~=`NSLXqIM~?O$mr)_si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si{bqh?sb(sW_>rsi~={si~={si~=`NI007n3$NDsi`=Kn26};si|1#=;-L^si;^Gsi~={IOynD=;*1bsi|1#=&7kVsi~={si~={si~={si~={si~={si~={NLZMusi~={si~={sYvLlsW{l!*x1;}si>)`si>)`si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={NO*Xusi~={sYt1*si>)_si~={si~={si~={si~={si>)`si~={si~={si~={si~={si;Vpsi~={NSLXqIGC8|=;&DJ=vb+#IOyo;=;*1bsi~={si|0)h=`b}si~={si~={si~={si~={si~={sYqCu7?>ECsi~={si~=`NI0pfsi~={si~={si~=`NSK(27?_BdNU5o*si~<*n3x!;si~-`si~={si~={si~={si~={si~={si~={sHv!_si~<*nCR%}SeU7)si{b*sHv%`si~={si~={si~-`si~+)si~={si{bKc&VtVsi~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sHv%`si~+)7+C1&SeTfYh^eTlsHv%`sHv%`sHv%`sHv%`sHv%`sHv%`sHv%`sHv%`si~={si~-`si~={si~-`si~={sHv%`sHv%`si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={si~={sHv!_sHv%`si~={sHv%`si~={si~={si~={si~={si~={si~-`sHv%`si~={si~={sHv!_si~={si~={si~-`si~={si~={si~-`si~={si~={si~-`si~={si~={si~+)SgEL~si~={si~={sHv%`si~={si~={sYvMP=;-L^=;*1bsi~={si|0)n23m&n3(8Tsi>)`si{ba=;&Bjsi>)`si{clSeSTtsi>)`si~={si~={NPrM{czAd?h?rOb053W^W^Z;`03%^JVl_87I5ajnIb||pGchLV|8M0b6+uEF=cLNX>Mg-F<&uIWpZG!Jt$*uZgX@XQ+acAWo=1hCMh6eZ*FsR03%^#HfAw0WMW}rIW%QAWM*PzGGsVpG&EykHa25oIW#o{08JIw4**GI0CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uLd2@7SZAoM5DUu|J@6CZZ2qWZ~$;`b7^#GZ*E^WXmD^YXmo9Cg9rdGV_|M~VRJ5MaBu))VQzL|b6+@UaBwbYbZu;A4gfE3Y+-J0WpXZPaBu){Y+-J0WpZCQXmD^YXmo9CCj$g8b7gdNX>Mn8UukZ0aAjk3Z*l--G%{m3WH&f5Gi7FBVmUcDGB##0V`4TiGdVb8GiG5fXmo9CSq=a?I!SX(R$**)Wm08kWpZV1V`TtybaHiLbYpd5Z*yNUUom5Ea%EpJUomZEZEtdUUol@XNpnnAVQh6}Qe|dka%FB~WiDuRZEOGq054~0dTnoWE@*IY0B31>ZEtg5IB0NiE@*UZY$*d0Ai}#KQ)O~#VQgu7VRUJ4ZU8NFWpXZPbZuMa|b!25MOQXmD^YXmo9CR09AnXL4y|E@*IY0CHt+WMy(+GInoxWo&a_GG}sWWM4RFaBwbYbZu-I053W^WMOn+03%^$HaBK5HaBKrGB#l}W-()CG&eFfGh<~qVPY_3Gc`9E053W^ZE0{!Wp-t3LvM9%bO0k^W;kLvF*#;AW;Zc1F)}nTH8*86Ff}=0H#K50VlZZA82~RjI(KPgbZ7u0VKz87WnwTkH8f^0GdD6~FlI9~VKOl@FgY@0Gc+`2IT-*iIy!Z8VP|CkBVjc*H#0LbF*IdiFl1sfWo9>FGGsD2WHmG}G%++`H)9z9FFHDAZ*py6bO0k^GB;#oWi?@9G&VLjG&nM2F=8}fFl93_V=_57HZ?Xi^9TSsI#gwNbairNF+@aVb7KH=baHiLbYpd5Z*yNUUom5Ea%EpJUomHFUol@XRAqQ{b#i4fL_}qCV=icPZER%#D>^!JbYw|x03%^BGGSpjWM*bFV>o7GF)}k`IA%3sV`FAEGcqtRI5ab504q8=b97`+b#wqDVPP>cWi@4CGh#6`Vly>nVqs!AI5K2oF)}wbWHmHpVPya-Iy!T7WJPjv03%^zIXE*gV>2~2HfCaBIb~unI5uTBW-~Z8Vl!qiWMVXB04oAII#YCVWnpb7DF7p3V>L23GcjaiG-fz6IWsmlGB`FgHe)klIWsjgIb>ls9RN*b04oYQI#YCVWnpb7Q*?4=VQnTRDF7p3W@BSFHf1qoIX5#nGiEn6VrDWlW-vB2Hf1t1HDftB9{^1VWdJJ_Iy!P?VPq(FZ)s#IEFg1qWI8%?X?kT}bSVHMVK_N6GGaJ0HfA_5G-5YpWM*b!W-&B0WM*MBG&VFgG$8;@5@i4@8ag_6a%psBC}VGKb95kfZ)s#IEFg1qWI8%?X?kT}bSVHMVK+E7HDxtrVK!o8H92B1V>mZrV=*#iV>xCvIAJn1W+MPi7-aw}6goO`WnpARcwu97D0XjYWGXBmb97`nI&*1yWnXkD03%^#HD+UDGi5emGGbz6GBPzdFlA(9W?^JzGBze}HIbk$rV>K~kW;rr8W@9yDIAdlsH#lWDF91zt04oAII%j2cC@BCVVKp^0W;0|qH#KB7W;kPJVq{}7W@BMwFl8`gH8wFZGcf>7WdJJ%Iy!K5bSPtJVR9(|BVlGSG%_<~G&V3WFgG(~I5}i8G&C|YVlg*jG&VD2F=jIWO$22CD@8gwa%FLKX>w(AC^|ZGbYwa@X>(s`Zggd5a$#&=c05!*ASNatIy!T7WI8%&b6<05XKrO=Uv@lHJ}Dq}Z)s#8aB^vGbSP9Hc42IFWdI{#F=I0{HDWSiGBspnF*7t|He+FBV>LH1WI1GIH!(3eH2_URWdJKpIy!P?adl~OWpgMxI&*YnIyz}{UukZ1WoL3>Y+rUfR6ZakCLkd?I&*YnIyz}{Uvp_^Ze?U&c05!*DIjTXY-w&~Aa-wQWFT;IX>N2VR3LU?Y;|P-BVlAVG-G9BH#9k7GG#M2F*7k`IW%K6VKz58Wil{kVPZD`O-p3}D;7FBaB^vGbSPhGB-CcVrDmHFk>(@HZwD3WoBbBH#j$9V`O7H08JHT04o$aI&gAnZgePSY;R$7EFg1qWI8%?X?kT}bSVHMVK^{2Vq!HlFg9g3H8f*pFfw8>Ffe5|W@2SGFk&<_VLbp%5@i4@6*@X_a%paKC}eMSVr*qBAaitNIy!S{dSzd9DF7p3G&49kIAUTrWHLB6WM*SCWH2*0G-75nW;Ql5H(@w8KLAY=WdJJ;Iy!K2X>N2VV{dMAbRc7BVR9-d03%^CVPQ5oV`gD6V_`5dW;11FWi)1GF*i6fV`OGBF*G?r08I;J04o|gI&gAnZgePPZ*FsRAY*7@aw;q!b97`nI&*1yWnXkD03%^DFgG=1FlJ;qWier7H8eP5VKOjbIb$(mI5{;rFg9dE08JQW04o+cI&gAnZgePPZ*FsRAUZm8bYwa@b98cPZf7Pb03%^GF)}kVW@I^GHDNe5GBh$|VK6l~W@R>JG&L|dFflnr08JES04o|gI&gAnZggfSV{dMAbRc7BVR9-gAXF?MR6%lQb1p6}DF7p3WHwN38C}VGKb95kMXkl_HDF7p3VK8AbGBhzVWi~f3WHU8oIWuHtG&VRiVP!aCHaRyjNdQd?WdJJ{Iy!J+a&u)UX>N2lUvwrcAaitNIy!S{dSzd9DF7p3Vq;}yFlIAlH)3WsI5lNCG&E*5I5;t6H)1w5F)(E{O8`w2WdJJ|Iy!J+a&u)UX>N2eHeYlmEFg1qWI8%?X?kT}bSVHMVP!EgFf}tbVPs-vGcjXjGGa7jW@KSvHZ(Y7HDot3H%$Od6=eV`7dkp{VRCb2C~0nVGcsRvCM+OxbYwa@b7^{IUvwz|BVl1RGiEk6VPj=5W@ct$GBYqWHDqIEGBh|aFgRs1Gd52EO%-JTD;GLCaA9(DWhiNGbT%|!bS5kyb97`nI&*1yWnXkD03%^HW;bMHHDqFCVq!F7H#0FaH#s#mF*9N^GB7bRWHK;O08JHT04oN2lUvwrcAaitNIy!S{dSzd9DF7p3F*##7IXO5pVPQBmW;r=!Wo9)pH!)>3WiT=}WHL25QvgjBWdJJ}Iy!J+a&u)Ub!l#NF*aXxCM+OxbYwa@b7^{IUvwz|BVjT#V`4NnIWsjgVqr67IWT2pWHL84WMX4sGcsZ}H8)iNO%`PUD;PRDaA9(DWhixNZgev;UvwrcAaitNIy!S{dSzd9DF7p3WHC88V>U52I5B28H!?RiF*am0IWsb0IAvxwW@ceFR{%{GWdJJ}Iy!J+a&u)Ub!l#NHZ)&!CM+OxbYwa@b7^{IUvwz|BVl1=IbvftGiGKvGB;*9Vl!r8GC4VAI5T5oIA$2HSbYwa@b98cPZf7PeAY*TCb95kMXkl_HDF7p3H8V0aWid7|H#K8nGBq@2W;kOvVPa)wGB-6fVKQcBUjR)RWdJK7Iy!P?VPsWqbZKlTV`yP=Dl8y#bYwa@b7^{IUvw-WV{dMAbRc7BVR9-d03%^$WHn@CFfwK~WMO77WHB;0H#Ih9VmV@DW->ToWHdNo08Jld04ohTI%#KaZ*pZQb97`nI&*1yWnXkD03%^EH!(CgIc8-xWMO4xVl`$oIAdaAG%_}0VPax4Vq#@u08I;74gfkjQ*?4=VQm0oY+-YAV|8M0b6+uEF=KCXWnVF0F>PgSZ*qBGF<&uLbaG{3Z7yhZZEQ{x1TS@I0AVm?Gc+|~HDzWqW;ro7W@R=sV`VrvGB#v5G+{Y1F)nCyZEUj%055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIeQRGHGpLXJub9aBOvFX>MOQXmD^YXmo9CEfEhO!n+_-Z)|pDasYF0Y<6XGEpTjgXK8LOXmo9C@CE=cb7)~?WpXZPaBu)~Xklb!a$h)TaBwbYbZuNOBEIK-EOlf9ib8um903%^GI5Ie7Vq-WqI5IJ1W;r%uGc_}2H(@z8G+{6}HZ^5(04y~+I%INTcPK|`dTnoWQe|#rWpZV5CM+OCa$$E+Xkl|@EFfcVZgX@XXKZacI&EQeJTxpIG%VtPrYQg;VPrTmF)=q`H#1{mHZwRfV>LBmGc-12H8wReVl-o7IBoz=Gjaed2Rb@rWn*$>VRL0nX=Y_}aA9sJW^8X^bSVHMVPs-6V>e+kHZf&6Wi@0mWo0yGW@a}yV`4U8IA&#LIdA|@1$Yl0Iyy&bdTnn2Uol@XM`?O(Z!TzbZES@ACjvS;RY^p0VRuYvb95*v03%^$GGb(5Vr4mGVq#-uW@I!lWn*GxH)dovG-NP2FflN507-=aCk{F~RY^p0VRuYvb95+GNknpCcT8z>bS5S#03%^$VK6y2IWaRcHDzI8H8EvnHexYmFfueaI5aacVKOy!07(pm04EbVI#o$Ta$$E&X>)WaV{dMAbRbnpL~>zwOlfm;CMf_TVKXr|IAdWnH#9UiH83(YGdE;7GdM71Ib~!sFf=%3Wp@Bc5rqIJDmprFb#rJaV{dMAbRblDaAhVeAY*TCb95j>Z*6U1Ze%7bAY*TCb95kfZ)s#IDF7p3GcsghH90UeW??umGdN;oV>dTtWMwuvG-PEsHaRshc>qZ$g#aftIy!K5b7&}IZ*FsRAXIs9WhN{jV{dY0Iyz@;IyzQma&%>QL2`0oc`P7vX?kT}bSxlqX?kVifTk$`BVjRRGh|_6WivTBVmUHpH#K85Ib$|3I5jt6WMO4EGd6nwNi&52CjvS;V{Bz%awsVPBVjc;Vq!8mGGsO}WHMr5HaRh2Vly~7Gd40ZF)(2@Gh%%JNreC>2s%1*X?kTSDIjBSZgX@1BVjl*H)CXFFf(FgH85j2WoBkLHDWVnIAJw4F)?FgIXHg+Nd|=gClfk4Wo~qGc_?#qWI8%?X?kT}bSWTXZ*FsR03%^GIW{*oIA&rwVly;lG&3|aGdVbBG-hTwGcY${Ib&jh07(&r04EbVI%HvVVJLHSWI8%?X?kT}bSWTXZ*FsR03%^DI5cBsH#jggWMwg7FgQ3iF*7t`H)1k2W;A0tF=1tc07((>0RTEWRY^p0VRuYvb94Y>Y+-YAV|8M0b6+uEF=cLNX>Mg-F<&uNNknpCcT8z>bS`LgZEOGq055c5a%W|9E@*IY0B31>ZEtg5GIU{bXJvF>IB0NiE@*UZY$6i?FLY&cZ7yhVZ~$~=a&2EYXmD^YXmo9CkN`3@Iy!Z5WMOn=D06gVIy!S{dSzd9EFg1qWI8%?X?kT}bSxlqbYwa@b7^{IUvw-Wb97`nI&*1yW#WLQDF7p3GdE#4F)?K|VK`znG-5b2He)a|VK!khG&y28V>o6shyYYGkN`3iIy!P?VPq(FZ)s#IEFg1qWI8%?X?kT}bSVHMVKy;0W@cnGIW%E6Wn(!qGc`3iV`MWjGB-CgVKQZ7G>QOJ5|98gB04%_Z*X~3ZzyMMIyz8kcx7x*VPk7Tb!KK|ax5TobYwa@b7^{IUvwz|BVlA_HZ);2W@a>IHZe42VK+1}VL34~G&5!~GG;V5HZqI=R3MN5G6Fg}XJu|>a$$63O=)m#VQ_OODF7p3H(@nqWMX4CIX5*mFl1ynH(@k4WHvE1W@b4vVq|7FjsR5P3jjJgRAqQ{b#i4gL;z!KVRLh1bz*OGUol@XV{dY0Uol@XXKY_FUomNIaBN>OUoli=cyx7gWimuAXmo9Cbprq|X=E;FaBu)`VsmA3c4cy3GHGOAIB0NiE@*UZY<&*^FK}UOWps39Ut)4;WM^eAXmD@b8}B-No{a!C`KSpIyx#T03%^JHaTWBWM*bIH83+}VK`%AWiU8qWjHlsI5K58VK6k40A~ha2QNB0L1bidWpi^+W=U;uYye*|Uok;sWO8M5b5CYTZE$QZXmo9C`2hzyI#OkBWMy(XI#Xz2WN&vMVRUR^b2>U>a%Ew3Wm9NjWN&vtbZlXBRAFZTa%FC0WpXWZXklb;cP(LbY+-XPaBOvFX>KlPbZu-SXJI&GVKX;kH8LVRuw-Q)ppiZ+Ag-Y+-X$VP^nxWo~3;axHUcVPtQ2En#$QVRJ2TY;|X8ZZ2qaZEPcFVKOshW?^ABG&VV9H)S$7F*h_YWHvTrGc-0iVPiQnW%&UI2s%1aWo~3;aymLwXklb;cOYSOY+-XcI&)}YWN&vtbZlXBP;7N)X>KS(bz*OGCMf`NWo~3;axHUcVPtQ2En#$QVRJ2TY;|X8ZZ2qaZEPcFVK^}}Gcq(ZIXN^mF=jI|H#sphGGjA0WMnrnH!(9gHkklP2BruOAi}#KQ)ppiZ+9SJbZlXB0CQ+zWN&vZVRUR^b1iUeb!TaAE@*UZY@+}%Iy!WDaAg1^VK`+mVK8JcGc;p2Gi5MjG-G9CG%;o}VKZSfW@BSDHlqMBIyz%-ZEaz0WB?;!H90mgW@BVDGh#F_W;tOuVK!!DFfcYbI5aRaVlXgeqX02FI&WrXb7gb@BVl1NG%{f{W;0?rGG#J1GB-3gGdN*pVKFvkGh#GkHD#j!F%3F8MQ(I*c_?FVZgX@XRC#b^CMf_TVP-isWo0mAG%_?~HDxq0W@0pCF*G(ZH)S+8HeoO}G@k%d3!?xr9y&TjZgg^aC}VGKb95k7d2nSWEFeQ~ZEaz0WGoqI5uWDG-hICH)LToW@IohH#ssnH=zJi9EAV?IyyyebaHtBb98cbV{~J6VsCR_F<&udZf9w3WnVF0F;z)Ka$$E&X>)X6F<&u7Zgg^aE@*UZY`Fj^Iyz)&VP^m%VK-rAH)dmEW-?=AVKq25VmCHrW->T5Vm4wnHDfV3Vz~e)2s%1#X>KSfAY*TCb94YBVK+BnF*Z0fGdN*3IW=N8Fg0a2GBGzXWjJ9uWMVQnW2FE}2Dtzz2s%1#VR$GhAY*TCb94YBVP<4vVlXu_WH4c7HDWV3F*0UkFkvxeH8V10HZe9eWTya12Dtzz5;{6KTEZ*FsRAZKiCIy!b`V>2cx03%^FVKQbnVlXgaGB-IlH8VFhG-5b3Wic@~VqrC6Ff%Zz07?+K04NeVI&EQiC}VGKb95kQY;8I^c4cETCMf_TVKQQ7WM*PFHZ(OkVqs)5GB7qcF=H_}HDNMkG&VRfH>&_j5V-&-2s%1qZ+IvvAY*TCb94YBVPax1Heoe0He_NqG&MFbFlJ*mVr4lqWn(!rGcjf{GOYkg2Dtzz2s%1rWo~q3awsVvV{dMAbO0k^W-u~2WnwTkIW;h1GBjZ~VKp*1V>B={V`efiFlI3}uK-F0xd12=Iy!H5WpZp`aC2BFV{dMAbRa=NLP91fAY*TCb94YBVL3T4HZV10Ibkp|Ib||8VK!koVKp{lHZwRdF*Y(bG_e3m5xD>;6FNF?c4cyGVQ_O?1eK|w-70CRM5bz^j6bz*OGUol@XV{dY0Uol@XXJv0~Uol@XK|w-7E@*UZY^MSMFK}sNYh`jSXmD@Ma|b!258Lb6+xJZ*FsMY-L|EaBOvFX>MOQXmD^YXmo9C6$}I~WMyV$a&l#4Uvp?-WNB_^068*cVq-QoG-fk0V>V=CVq#)qG&N&pW;8T6Wi&Q8VlHTOZEV5-C^|Z0Z)|UJ03%^DHZU+@H8Ey4I5adiIbmcmF=IJnF)=n`WHe-X>N37ZgXjLc>p6}WHeN2(X=iA30CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolW`X>N2(X=iA3E@*UZZ218PIyzEiZe(S0IyyvUaCB%oI%9HWVRU6uWo~3;aztftbZAszX8>|#Ze(S0Eo5bIbZ9MbY;|X8ZZ2qaZEPcFVK6Z^W->8kGBGePG&C_eG&VFiH#THuWil~jW@9vCIQanwIyzEiZe(S0IyyvUaCB%oI%INTcT{guWo~3;aztftbZAszX8>|#Ze(S0Eo5bIbZ9MbY;|X8ZZ2qaZEPcFVKp!?I5IS3Fgav2WH~uCH8wLeH8^52FfcV_Gc_?|WBCCG2s%1aWo~3;aymLhWpH$8Iy!P?Ze(S0L}hSvXi#i*XK8LILv>MdFXKXq;Q(2H#cE2HfA$4Vq#-7IWlH6HZo;2F=J-R09_6C06PylI$~*VWGH8BIyzKkcyx7gWimu503%^!I51>mVmUN0HZ^20VPP{iIbt|wG+|;jH8Wx`F*!HP09_6C06P>qI$~*VWGH8BIyzKkcyx7gWimuTa&lpLDF7p3VKp`|W-u@{Vlgl?G&VS4GBG$aFflMOHZw6}Vl^~1&H!B!_5eE%Iyz!$Ze%EDY&tqrWq5RTa%D3_DF7p3Wiv2kIA&yJW;ro4Wi??oH(@nmV`O4sFflo0IAUR9&;VTx_5eE#Iyz!$Ze%EDY&tqabz)^rVQ?t`BVji%Wnp1rIW=NqV>o6xGBi0dW;JFsWi&BjFflb`W@FL-T?_UAI}$oNVrgzMdFXKXq;LvL<#bYX6ELUm?lWpXJ1BVlA^GC5;6I51^qHa1~mVK-%EF=k~kG&wP4H8LN2ZAVFheWpi^W03%^$V`4aFVKibeFk@t4V>C1{Gh{VpVlrYlGG;P1WjJNn09_jP06PmhI&)=oLvL<#bYX6EC}(VKIy!b`V=^fKBVjc)G%{l~WHwL2mVl!l6IWlEqG&4ChI51>0G%`6dX50W>3HAUx3pzS;WpqPtZgX^DZgePTY;8I^c4cEUDF7p3Wi&H1Fk)gkG-G2pF*!FdIWjP0GGb;nV`VgEWH~Z9-T++*_5eE!Iy!S@bVF}$b97;DbSP(RZ8|z>c4cESDF7p3G%__|H)dmEI51;1IAUfwVL3HoG%{s4VKp}~Hf1$2-~e3;_5eE!Iy!S@bVF}$b97;DbSP(RZ8|z>c4cETDF7p3G-5MiG%+`1IWS@|Wo2SFGdMIjVl^{lIb&onGh{P4;s9L=_5eE!Iy!S@bVF}$b97;DbSP(RZ8|z>c4cEUDF7p3I50IcGcYkXVq-WnF*RmkIWRG0I5lB8I5jY3Vq;}C51WHB%{WHn+qG%zzZIW{pe<^Wv^_5eE!Iy!S@bVF}$b97;DbSP(RZ8|!2c4cETDF7p3Wn*SCIW;z7IAtosG&5vo=m1>`_5eE!Iy!S@bVF}$b97;DbSP(RZ8|!2c4cEUDF7p3HDYCCVmB}~W;8HiG&410I5c87W-?|pIX5{oW;8fA>Hu8|_5eEzIy!S@bVF}$b97;DbSP(RZ8|z_VRSSp03%^FWnyMCF=aD3Gd474HDon8W;8ZAIWRD0F=ID1F*7&p09^_806PadI&)=oLvL<#bYX6EC}wPLVRR_~BVjmWFfuhbH!)^6Ght&eF=AvhWHB{jW@BVzWH2~pFgfl3T?O_4I|VvAb7gcxZ*FsRVQzFNX>N2W03%^$I5A^3HZd|dHe@wrF*P$}Heoe1V`E`uI5uHnHfA#L09^z206PvkI&)=oLvL<#bYX6ED0OagX=iR_WFTp7bSVHMVKrrDH(@e2W;8fBV>D)BV>V?uHDhBrVPR!8Wiv4`Wby!A4E6v!8ag_0b!BpSLvL<#bYX6ELUm?lWpYz=a&=>Lb#i4WLvL<#bYX6ELUm?lWpYz=a&=>Lb#i4YDF7p3WjHrBVq!TrVK6m0WI1IuH#aacHeqIEH8D9fVrDou^Z;EL;0pjcI#Xz2WMy(fX>Md`Zf8($X>N1?V{Bn_b7OU4Z*yNUUom5Ea%EpJUomHFUol@XX>D+9Uol@XQ)ppiWpYAkZe(e0XHaixZgehabZu<-04q8=VRLh3bO0k^F<~({HD)tnVKy~oI5#t7W-~WtGcz(dVm355Wo9;F@BsiiI#OkBWMy(tVQgh|bY%c@baHiLbYpd5Z*yNUUomBFXK8L_Uol@XQe|#rWpYqqY-MzGWiDuRZEX4gGCDeMW@d9`bO0k^F*#*7W;SLyH)S+7Fl0GpWMninGc!0hVq`NmWnwfq!UzC5I!$kNb7fOwa&K&GMRsLwbO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F==mKF<&uFZ*_BJQ)6;(Y-~k#Wo~pXXmo9C@BsiiI#Y0LX>?O#a%E+10CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolf~Y-w~;V{&C>ZZ2qaZEQ&p054;2ZE$aHWo~qHFKKRNa&&27E@*IY0BLSza&&27UpQ!Ra4u+cZEQ&p054;2ZE$aHWo~qHFJW$Hb!=gBUv_0|Z)0h6c`j&hZ~$R$XLW30a$jF|Wo&O_X>@sCIB0NiE@*UZY!3qfFJX9Tb1rCbZ~$R=X>(sVXmD^YXmo9C1OYWVI%ailV{~b6ZU7@;VP-WnGh;M0HZo*oVmB~lVr4lrHaIglV`VsEWHK~41OYWVI%a8XWdI{#WM*MxVqrHoG&f-|Gh{P2V>eMa|b!25DO=WnVIIY;|X8ZeKWPaBwbYbZu-90Vp~;V{dL|X=hVudSw73VPRuqVmUBmH#9k6IAb|xI5lBrG%z=0IWRdeF*Y|eVh{l+Iyz%)Wnpq4o9Fg7+~G-fn0Fl9M4GdE^55CJGUI$?BdVRHZ@VP-L8GGj1iH8o~pFgG+fG&f~9Vr4QjHDfqrVKX^4G!OwOIy!S~Z*+42BVjUSIW{n5IAS?BF*P_bF=S+AHaBB9G&M3aWHvQ5H)09_DotT<061ebHZnLeW;r)zGi7FBG-5I`GGaAhWHDkmGh#AhG7teM2s%1vWpq<%dSxgnAY*TCb94YBVKOi`F=aL}H8U_YGG;eqVP#}tW;Z!CH85c@G-NS3H4Fht1`q)#AUZm7WpinIWhi5HVsCRgI%98gWjZ=%Y&tqpWo~3;aztfzX=7z3DF7p3IWlH9WMpAuIc7CCG&MJ4IAmpHF)%YQI5Ib5HD+OA4gpFY@BsiiI#Xz2WN&vtbZlXB0Ap-nb8};LVsCR_F<&udZf9w3WnVF0F;i$^WN&vtbZlXBE@*UZYV>{GHGOAIB0NiE@*UZY#0GCB04%_a%Ew3Wkh9mX=7z5b#8NMXKrO=AZc!NEFfcVZgX@Xb97`nI&*Y#X>MmGDF7p3Wo2VAFk>|^W;SDGW;tRuFfcVUHDqNsHDxtpV`5}v5&=^n7y&UAIyz%=Wnpw>LUm?lWpXHEZ*FsRAa-wQWGXBmb7^{IUvwz|BVl1VGcYtTHD+QrWnnZlV>C8lFfe6eVlXf^WHn|rW;PT7Qxg~gF&jEMWo~tCWpZJ3Wkh9mX=7z`D06gVIy!b`V{~tFJacqpIy!T7a%pa7J|-yuBVlD`F*Ra0IW;n7Fk@jjF=1vjFf%t}Ff=tYHZo>rW-t~3QyI+<06IENX>Ms@b!2I8LvL<$Wq5P|V{Bn_b7OU4Z*yNUUom5Ea%EpJUol~9Uol@XO=)gvVRd9_Z$ocxbY*ySE@*UZY)JtkIyy^bc>p6}WMnyFH)CQoVK-r7W@0&IH#cTBI59F}VKy{5F*sslNdY1{I!9q`WpH6+LUnX>Z*Bl1VPZC8Ib$$3GGa10H#9IcV>2-^V>dZuGc-13FgG}4W=R1eIyy&TZDnv_WI=doa{wb@VmC8pW-?(mGh{enVq#=sW;kOoW@0vGH)SwkVPZ69NdY1{I!$kNb7ewxbaZcS03%^!G-PBnHaIakGcq_cVKO!{W;QuwFg7+cVK!klHexnO0U`oAI%8~QVR9%b03%^IVPQ8gVr4UAIXGf5WjAIyWnwusW->H6VPrHoVq;+)0YpgwA_Y1+V{Bz%awutTbSVHMVK*~kGBh`0G&5m1H!(0WF*Gt{H!(9YHDfb4W?^JwHy;5+14#iQ8#+2-X>MdFV{dMAbRbD?aCLM-X>Md`ZfA2QEFfuabSVHMVPRr5IX5*mWH~ryFk(3~H!@~qIW#vlGchN2W03%^EFg9d4G-Nb0HZ)~3G%+zZH!x*3H#B24G&43aIb>!d0YnH%0U`@JI%i>RWpH6+C~0nVDIjBSZgX@1BVjXQW;r!BG&5y5FgG`4WMVa9Ff}z|Wi>QpHDzNpH8UjvLvHF=IAjVmLEmWil{gHaBB6Vq!UDHeq5b0Ynx_0U{VWI%;)ubW&w(Wnpt=WGG{AZgX@XV`yP=Dl8yrZgeRiV{dMAbO0k^F*9LfWMMflI5agfHZd?aF=R4gHZWv0Vl`tmG+|+7EdfLpNdY1lIyzx^X>%xJZ*FsRAY*7@aw;q!X>N2WAY*TCb94YBVKrqkWinx5HfAtnHZw9fHa9XgWMwipWHV%8IXE+6F)sl`7D)jjH99(IVQyq>Whi5BZgX@XV{dY0Iyz}@IyzTrZe(wFCM+OhZ*FsRAY*TGWjZ=(Z#p_lWqCz*Wp3htrYQg;VPa)tF*!9hVPj!pGdMS6F*z}2FkxjdGhsDhIW%HqWibInGf4p=H99(IVQyq>Whi5BZgX@XV{dY0Iyz}@IyzTrZe(wFCM+OhZ*FsRAY*TGWjZ=(Z#p_hVQpn_VPxWfrYQg;VPQ35HfClsG&M0XG-EbnF*PwUW@a-tH#9k9Gcz?bF*5-~Gf4p=H99(IVQyq>Whi5BZgX@XV{dY0Iyz}@IyzTrZe(wFCM+OhZ*FsRAY*TGWjZ=(Z#p_nZ*_BJLUrPRrYQg;VKOr}W-~N1H8eRgF*Y|bFgRjlGh}5qFgRl|HZx^qGc^H3Gf4p=H99(IVQyq>Whi5BZgX@XV{dY0Iyz}@IyzTrZe(wFCM+OhZ*FsRAY*TGWjZ=(Z#p_nZ*_BJO>g3WrYQg;VPR!AWHvNqWj0|kH(_C9GGj1eH#IOdWH4qpVly=`G&cc6Gf4p=0y;W%aAaY0Wle8&b7d$g03%^HI5J{2F=1slF=RPrGhsMnFl1&jF*i75GdM6YW;kX!0YpgwA_6)(b#P>1bY($fbZKvHb0{eQBVlA_IALTpG&Nx|W;8ZAF=IA0H!)*4Ght+6H8nY6W;HtjL`eZ62s%1#Z*_BJP;YZ-bZKvHC@COgZ*FsR03%^$FlIAkHZ)@}H)CZsWHx0oH!w0}H8we6Gi5e0H8nIn0YnB#0U`)GI&gAjc4=>Qb4_n`b7fF(b7^#GZ*C|lAY*TCb94YBVKrelW;iioGdVeCWHvc4V>o4IGhsP3WnnmCV>dTsW6Ibtz5HDWblWn(vCHDP0BH#B22G%#Z~IAJg`K>Me1cP1$SBVjc*F)(IkWn^SAG-EY0I50CYHaB89H)bEZ`A_zJMn8C@COgZ*FsR03%^CVP-fvF=aAlGB;*sV>4zsH#s&iV`evIHaKN6H!w3r0YnB#0U|XzI%r{TWNc+9V{dMAbRc7Ia%DO?X>U3@S7~l!Z+9jvAY*TCb95kMZ*pZiI%#h@I#+3KWN&vx;((?p03%^zGBh$UF=jA0V`E}8Ha9S1Vl`%DV=*{kFfukaW->NM0Yo$K0RTEWNp5g;bO2*)VRLh1bz*OGUol@XWo~C_Ze?FFUolB;aCLMpXmo9CRskpiIyzKgVr*q|C@BCVVKO%{IAb+pIAt(nGBh$WGG;S5Ibt$3IW;k1H#TKAV@d%^RskpiIy!P?b7gcWDF7p3Ff=(fVKQbkIb>ruFg7?gG-hHsG&4A6VK+ErV>o7FOaV$(0Vo1GI%H*Tb7d$g03%^BVl`%DF*7(~WMnfpVPP<2Ffw8>IXPxBIX5#nG%++z0ZL8*DhMEBZ*FsR0A*rgVlXu_V`4TlHe_aGF*Pw{H)b+7Gh=3CHfA_CV^9G~237$m0y;W#aA9(DWm08qVRUJ4ZYU`LBVjZ)WnnWgVKp#jH(_QnHe@hkH#a#kVl!i6Fk)t7I5$!ON>TwT2q0r`ZgX@1GGjM1GGbz6Ha9RgIbt|6Vq-C6IWRadWMegAGdN*kQ~^o`XafK`I#gj|Y-Mu*V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF;rnD|VmD=BVKg*jTLCIMI$~jCYesTmZDnG0W@cq_03%^#Ff=w{HZwRiG&N#kV>w}CGBaj3G&y29WiewhVPh~`0V+B=W^!+CbWmwyYh`i(BVjo;GiEqAIAUTjGGR0|I5;^tVPR%BG&EvjV>ebO3X7a&=>LV|8M0b6+uEF=cLNX>Mg-F<&u9X?ksMb5vn+XJvFQXmo9Cbprq|Z(?(0a&~2Mb1rCbZ~$*&b7gXNWpZ<0IB0NiE@*UZY%mi5FJWO~VlHTKZ~$RpVq#x7XmD^YXmo9Cum%7xV_|S}b!=rWXmD@Ma|b!25)0BZgXEUb7*03WpiILV_|S}b!=r{IB0NiE@*UZY-9mIIyz-;VPb4$WB?;!HeqHnV=^%}F)?OhVPrQmW;0=8VmCN7G&3+|Vlg&hWC1`rI(KqubY(?uVPb4$WB?;!VmC20WnwfrVlpy0GBG(ZWn(lpGcYhXFfutfHZo;oWC1`rI&NiQasVS?VqrI8IXPouVP#@7FfuSTVKz1}GBRXiV>UH7VKp{0WC1`rI%Z*V03%^IF=91gVmC7}Ib~sCVKg{oVl*~5W-u@^Wo2V#Vr64w0YExBV{dJ6VRB^vBVl7bZ9PUbZu;F0Wdl`Vr*q@WJPXaVr*q(03%^!VKg;0WjAFoWMncpH)CODHDNM0W?^P#GBPw~WMMdK0Wdl`b8=$L22Hexn0Wi>c7F*i6dF=9DmGBji|Ff(K^V=`+2FgiM9b94YBVPrUAIA&&LVKXo?H)c6yW-~crGcYqUHDfe0Wi(}BWNQI1Iy!G~03%^CVPRu4G%ztSI5=WBHaIysG&eG0F*YzcIAvipF=I4q0Wdl`V{dG4asVS?GBz;ZXkh>&VKHGiGGa1hV`VpHH!?OdIAUTjV>38pV`MNiH#TK6X7dODIyypZWo~3sbYXO5L}hbh0CRM5bz^j6bz*OGUol@XV{dY0Uol@XXKY_FUok>#Wo~3sbYXO5L}hbhE@*UZY>NRaIyysgWnpw>03%^!F)%PVI5{#kGBY+XF*!9cFg9g1G-hRFI5%c8WHmI40V_H>L1bhABVjjUW@RurHZ?P2H)UZsG&D6fV`4HeVq-O7Ib~*MG%^z-Wo%(|WdI{#W;8fCW;kSJIWaXeWMwg8WMVO8I51)~W;0@AF*RmkivcSQIyz%=Wnpw>D06gVIy!T7a%pa7DF7p3Gd5*2V`F48Wo0!qH8f#iGBGeTIW#pnFlA+7F*Y|iZvjmUivcSdIyzxwWGF>$bZK;XEFf)VZEtdUIyymac~)U;b!904BVjdTG&VIiV_`NoWHvA}HexnpV>vi9V`MTgH)UiuH#l(tO&E&-D-Sw4VPs?|MQ(Iyba^ZwRC6vaE-3&bVKOy2H8y5uG&wanW@BMDVPj!pGdVdjGh|{nFf}kXV{-vb4T}LQB04&9Wo%(|Whg~%bZK;XEFeX0bZK;XEFf)VZEtdUIyymac~)U;b!904BVjZ*H83(bIbu06H8L<^IAbz2F=RAlW@KeKGBGtYHDz@HO(2T_D-$|8a%F5`bY&<-ZggpMc`P7BZggpMc`P7QDF7p3H(@b1G&D0ZHD)mG&5vocL7ZiivcSpIy!A-a%W{IV{dMAbRctdWI8%?baH8KXC^ElV{dMAbRa@(b!BjJX>N2TDF7p3Wiv2jG-fh4Vlgx}IWRCcWHvG}V`DQjIb}09Ib$+nc>zr%ivcSFIyz%)WnpqCDF7p3IXGf8G%#W{Ff}zZFflk}Vl^~0WHw`EIAb?rWnng9djU<00V@bPI$~*UVQ?rZAY*TCb94YBVL3E2VK`woVKq2nGBq|eGB7bUVPi33Fga#oIW{zAV|@Wl28#hJC^|Z6ZgX^DZggp3bY&=ZZ)s#IEFeR2Wnpw>EFeK-WGo<3Wo%(|Wh@|KZ*OcVAY*TCb94YBVL38lVmLB5F*Y?~W-&K6H!?S2GB!3fHa9pnGB-3bVSfQlCW`?p6*@X;ZgX^DZggp3bY&<*EFeKFAW|$KVsCG3DIjBSZgX@1BVjN#F=H@eV`5=pW@0rrH!(LjIbvcnVlgo@H8Ny1V>E#QO%sa&D+oF|Wo~q7bZKRCC@COgZ*FsR03%^CHZd|WF=90_F*7+eF=aPqI5jjkWHLE6IAb(oHDx%10Zj&r0V@bPI%98baBps9Zgg`fDIjBSZgX@1BVlDYWMw!wHDP2qVly#jG%_+bHa2E7FgY|cVPZ8mGckn$O$LhrD+oF|a%F5`bZKvHb0{ewV{dMAbO0k^W-u`}FgRm5Fl971H#KBtWil``G%_|fIc8*KV`VrshXG9nivcSXIy!b?Y-wagZggpMc}`(%Whi5BZgX@Xb97`nI&*Y#X>MmGDF7p3G-EPjVl`r9F=Aw4V>CH5GC5^3G&eUgWMedBIXPiCi2+R#XafK`Iznu9WpHw7Zgc=+Y+-YAV|8M0b6+uEF=KCXWnVF0F=bbVF}-ZgeOqAY*TCb94YBVP!TkW-vKnHD+WmG&e9YV>o3oGBPqUFfe5|F)%P>WR(F=2Dbq%B|17*X=QgPQFUcG!C}VGKb95k9X=QgNDF7p3GBz?{V>vl8IAk?6WHvE3Vq-WoIAl36I5RS2F*#&1n*mP?w*f5;Iy!J^ZYXJPbSxl6ZggpMc_{!RVK6W?HZeD2HDNL^H)CTnWj8oBG-5L{FgP(|WH>crGo1lX3%3C+0y;WkWoKz_C@BCVVKibnF*GtTIb$?AGczz{WoBkKF*Pt`H#KE6IX5BBVjNyVKg&0HZwRkF*9anH)3O9Gh<_8G-f$sF*GnXWjLV$PqzUr4LUkWbY*g3bZ>GfR%vB-CM+OgZ*OcV03%^CV>o3tGGaJoWMMZsIAtG!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^JVK_KtV=-oBVlZT8F*!6cF*7wVVlz20G+{S6FfcWz0Z$dT0WAnRI&W}ga$$6Daw;e(AY*TCb94YBVPRr8I5jyjH#RY2I59C{H#RjgI51{mWjSUyV_`EnGpPYj2Dbq%2s%1%aAk5~bZ>GkJ}4<5V{dMAbO0k^HZV11H)A+7H)AtnGB`FhWMyVGH8MFiVly@|G&DCks{v02w*f5zIy!G~WpZJ3Z*nUuC@BCVVKg^mV>mT7Vl_E6Wi&NpW@ThFV=^@}Wi>W9G&Nx|F|7elw*f5(Iy!V=a%W|9L2_egWpsIPWpgMgAY*TCb94YBVPrTqG&p28G-YErHD)z3G&3<_V=!c4HaIXgF=b<6Gp_+p2Dbq%2s%1rb#ilWaztftbZB!ZDIjBSZgX@1BVji=VPax3Ibk+sHe)noVmUcsV>B{kG+{7dG%#T{GG(y=PX@OEEeJX~V|8+KZ*o#^cXKEyAY*TCb94YBVK6sgVl`znF*!73VKX)`FgG`5W-(?lH!?M4Ib%69G_wIu2Dbq%2s%1;VQgt+C@COgZ*FsR03%^CWnwfoV>dZwWnnWmWo9xqG&W&mGBP=1He+TsIc8zC0Z#@$4^a%FC0WpZC+Wp-&}WiDuNZ~$^;Ze(S0UteTpc4=c}UpQ!Ra4u+cZERz2a%BKyX>wmSV>mfCWMnxvVr67zGdVFdWo0;FG-NquH)b|9G&y4~Xmo9CzX3BkI(B7pbY*x!a&lpL03%^#G&nIaIAdcsVPa-EW;J6tWoBeDWI1IrI59RcG%+;40W&%}c4cyOWq40!W^-k903%^HWo0rmIbtz5G&D6aWMN@qH!(IhHfABVjW%HfA$3G&y59Vly`|H)A$9Vl*>3IA&&IHZd?XW;wqBGdenSWq5RTa%FP>BVji%VK+8qHaKKuWn(pDF=aDjHe_TmF*q|cH90b7Vq=8>06IEDZ*6U1Ze##+baHiLbYpd5Z*yNUUomBFXK8L_Uol@XRY^p0VRuYvb97%ZUok^(ZEaz0WG-lQZEV2-D>^!3Z)9a~Z)t9H03%^EWH>ZAWMnyEIbtwjFl1t5Ib||2HDft3F=k|CIc6}z2mm@dRAqQ{MRsLwbO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F==mKF<&uMWq5Q&c4cmKE@*UZY-$hyFJg6OW@U0;b98cLVQnsGaBu)(b!KK|a$jF_baG{3ZC^NOaBwbYbZu;F0{|~@Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_UovuKZe(S0UovQ9a$hoVY;|X8ZeKWPaBwbYbZu;A00b{%Z)|UJUvgz*bO1LtH!?M5Hf3dEFl1vmVm3K9Gh#SoHD)n3G&MOnG-WPmbZu<#0UbIzRAFZTBVjZ*VmC8nIbvZqWie$jWH@CoG&eChIb$$mGC5*qWHImo9XdKtY;|X8ZU7@;GGa4hVP!HnH)UjEV_`F5IAJqoIW}TpWn*DtG%++b@BtkDZyBVjZ$HZ?RiVmDzlF=jY4H90Y2GiGEsWH~lBVq-NlGd1u59XdKwXm53FWKnf#bO0k^Fkv)iV`DitWivD~F*s&8F)=nWWHep6}Gc+(UIb$K}_FfcM?@BtkB`_G&p8BIX5ymGhsDlW-($h@Btk+`Wn(g9Ib>rwFfuteH#jyiW;ZxFVKF&3Ib~+>0UbIzMRsLwbW&wuWMy&yBVl1VHZo>5GGt{oIbmirG-f$7H!?P2HZx*5FfutcWiapo9XdKic4cmKS8{1|WpV%`VK-%FH8e6fGB;#lWH2!@V>dJ~IXE(AWn?lkG-We1G4KH$Iyzxo6rWHLB2HexnnH}C-+Iyzxs{u9XdK=Z)|L7b7^mGb5vnx03%^JWi(-8IW;vmI5%ZDWHDkmW;r)EFk&)cIb%3wHDfmL0UbIzW@&h3WK(oya8zMu03%^JW;S9uHf3gGI5#zAIA$|3GdW^5V`gPAW@R@pI5}eQ0UbIzXK8wEZ*xg*X>?R!X8Dh9X-RHrbW~wy03%^DH)UinW;SFuIb>omIb&sHGczzZGdW~pFfd|dI5lMO0UbIzX>Dh9X+mXZX>L?uX8~i03%^xGdVCZGh;VoH#0S5FlA+AHa0b8GdVC~Wi>EjVKFiA0UbIzX>Dh9X;fin03%^DW->W4HDNGhWH&K4GBYw`VK*=^G&yBuGc#dhHZnKx0UbIzX>M?JbX9OnGiEt6GB+?|Gi5mN0UbIzb!kIkZgydFLuhGiWO8M0Rd8fsbY)awX8?{HfA+qWinzpV`eZkVmD-DF)(CdGBYwWI5%Qu@BtkVP^m%VPa%tWi>Q1FlJ&iWo0-tF)%PMe1cT#0;WMy(xVP^m%VK+H9V>4tqWjHuwH8M0dW-?(kV>D(mVq-TlVmLWAWkU!KIyz-;XK8L_0ADd*F=cLNX>MgMXmo9C^#L^zIyypWZeenHL}hbja%o{~X?kUHC~akJZ*qA$I#YCVWnpb5DF7p3I5#t4G&V9bG-ft2H#K80GGsJ1FlJ&lG-Wk4I5cBo@c~y4^#L^?Iyz)!V{dJ6Z*yfRV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAa-wQWGX2DBVjZ$IW#skF=aVoWH4f5Wiw)8V_`BhGBsp2WMO1tI5_hGR~`ic06IECX>MV1c|>J%WpZg@Y-xIBasXp&VRLh1bz*OGUol@XV{dY0Uol@XWMOn+Uol@XLTPSca(P5$b7gXAVQgu7WpXZPbZu<-0VyXsI%98baA9&~C}VGKb95k7d2nSWEFfcVZgX@Xc5i89Dl8ylZ*FsRAa-wQWGX2DBVjW(VliW7VP!WkVrFABW;A0tVP!ZpH#jpmIAdjDWjFQ#OC_)i7CJg|WoB$;V{~b6ZUA2~UomoJW^83+bZKvHE@*UZY(;KoX>MfzXL4_Ka9>|#Zf9w3WiDuRZEOGnDGoY1P;7N)X>M~UP;7N)X>L(J}HDY3BFf%n~W?^AwGGk$8IALXD`TM}>V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF;HxEXK8M8E@*UZYy<*1Iy!S{dSw73VK^`|F*9Z~Vl+51Hf1z4GB;vlH8^B6HfCmHG&L|WGXw%TIyz-+Wo>0{bVF}-Zgc=6VKz22Vqs%BF=jM2F*i3eG-EY0WMnZlGBY(aIb=C9I0OPYIyz-+Wo>0{baMbBVL3K8VPZIDVq#)rH)CREFlIJlH(_QtI5%TCI50LhIr9hrIyysdZgX^DZgfI*W@cq_Q*?55V{~LV|8M0b6+uEF=KCXWnVF0F=uRFF<&u5Z*FsRVQzFnb!KK|a#M72bz^jOa%C=PbZu-10y#Q5bYXI5Wpn@|VKihgWnnWiW;ZitWHMx9IXO2qIWRIZGBh)0W@9!uFbD!UIy!f0bZBpNbO0k^F=l2rHDWR|V`4EeIXE$4Wie(qHZx)|VKFjhWjJPI2m(1eI&W}vX>V>}Yycx+G&wV3W;QuuV_{}vWH)AJV=**jIc703WHUE4Gh;b3=eBVjl>H8?Y5VL4+mI5%TrIb<_3G-NY0W@b4!FgG$~F)$1QNehqyCkQ$^aBOvFX>KS`Y;|X8ZYcmGVPR%tGBRX2G&eP6H8*87WMO4FGdE;7Wj8Z6G-ESmG7bVs29N?L2s%1sWpHI~WOFD`Y;|X8ZYcmGVL3TvW;Zr8Ha1}}H8(L~H#s(BF*7qbGBPnRGGb<7HV^_y29N?L5IQ<(Zfa#?bSO}4b!TaAEFe&9b!TaADF7p3V`eyGVmUN3Fg7+bHDO_5WHV%9G-fzrFfuk{H)b+45&}sMkOC(eIy!Z3X>MtBQe|^*b#h~6C}VGKb95kbWoB$;V{~b6ZaO+td2nSWDF7p3H(_NqF=R4iI5{<8F*Y?~Ha9dgHaIjgWjJOqH#cKp6aq;XkOC(XIy!P?b8mHWV`V69Wo>VAc{(~lZh2N=Y;|QR03%^JW;14CG-5JgG-6_6WH~cpGB#l_IXGl6Vr4U7V`eoL0!a{%0w)4GI(2SoZfSH0IWRdiW*!1bkOC(eIy!P?Y+-b1Z*C}KZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlD_G-F~iV=y%{GB!72F=R1iFf?XjHf3QlFf%e_Vl*HENf(d;CjvS;a%F5`bZKvHC@BCVVP#@7F*G+hWHLEnIAmryW;0?iWo0-yW;JDGWHL2kVj==bkOC(HIyz-`Wo~pRDF7p3V=^-_Hf3RBHDxz4H!w9hIXNDqkH92B7GBq_ZBmzm00w)YQI&@)YC}VGKb95k7VP_^O03%^BIW%H5W;J4EHD)t1VmUNrV`MpEV>M=EWHM$pF)(H(0!a#x0w)YQI&*Yka&&cYRAFZ*V{dMAbRbk=XC^5CBVjc$HDoj}GBac|Fkv=iHDxh4GG=9DVly=|I5{#oH#jH)NeYkxCk;9}b9r-gWo;;PbYwa@b98cPZf7X~BVjRNFgIc{V`euwIXN^pW;ZZoIWjXjV>UN4H8nS5GdL;&NehqyCk;9}b97;Hbail3d2@7SZ76eeWI8%?baH8KXDI+9VKinlF)?H~WHU20VPZEhHeq5hV>VMmJ03%^yVPau8HDYEtVL4`FF)=bUGGb#lFf=e`GGk(9F=Jyc0!a&y0w)4GI&^t(Wm9Exc4cxXDF7p3VKg*hF*i0dIAk?3GG=CEI5IS4V_{-rV>2>1F=01lFak-C0w)4GI&x)mWppSh03%^yGiEk9IAt<0VKHJiI5#sfI50P4IW{;oW-&8lGBGeR0!fepCjvS;b97;HbSNnRBVji(VKFf{VlXl@HZ){5G&MIeH8(XlHa9gnIXN*nW@9u0Nst030y;W%aAaY0Whf~CBVjo=Vl!l6H8EyoV=y;jG-YOEV>mG|I5Rk8IAbt4V`4S}Nst030y;W!b#5pr03%^HI59P2IAb|DH#jylWjJLyWi~lDV>D(sHext8Wj8Q50!fepCkQ$^b97;HbY)~HDIjBSZgX@1BVjaRGcjc|VKg~3VK-tqV>C7~H#IUaH#jk6W->Q1Vq!W1Nd}MtCkQ$^b7*gMY-CY&X>=$lAY*TCb94YBVPj=sVKO&0Wn?!oWimK2Gh<>gW;ZruF*jj1V=yvgIXnVM29N?LD>^z4R=awtP}VsCRMEFg1qWI8%?baH8KXDlFMZ*OcYAW&>!Zf<3AIyzKgXGvr!03%^FWo0&EHe+HkG%ztVIAb|6W;0NnHaKK5IAS+5Vlp#kH(_NtHextoWH4koHZU|aLIOz&kOC(RIy!V=XJ=((C}VGKb95k7VP_^O03%^#G%{piIb}9AVr4cnWimH1VKg>2Hf3fxIX7lBGcqtl0!a#x0w)YQI$>mFRBtF_Z*FsRAXH&zCMf_TVP!ZlG&W*kHe+F7IX7WrGcYqZWn(olFf(CgGB9IfHbw$T3XlRP20A)&b#6&!C}DMUZz%vHVP-TmI5A>nVP!ZqFgGz{V`XMGG&4CfVK_N5WMpMyH%J0W1dswJ20A)&WpHI-bXRC;Y-K26b#!kj03%^!Wi>H0V>e-BH#0F~Wn?*IGdVXoF*9W`WjHfqH#A~O0!ajr0w)_fI#YRbbY*Qqb!lv5WpXG(bz*OGCM+OgZ*OcYAaitNIy!T7a%pa7DF7p3G&wb6W->K1VPP?5Ib>!wHexq8WHc}~I5K55W-&2iOae(6L;@)fASNaNG-Nq8IAu9zH#avjVliYfWHd4}IWS^5VKq21Vq|7vP69~{KmsWbASNaNVKX%_G+|;gF=aPqFf}$ZGhs1eWMyMFIb%08Ib=3vPy$H}LINodASNaNG&N#oVlg>nFlJ*mW;QZpGG;b5GGSyiV>V-EH)LToQUXa0kOC(NIyz-;bZK;XC~0nVDIg{$03%^$Ff%eYVl-hjVP!TmF)=qXGBh}1Vr61xHDoq3VKp#R0!apt0w*ClI(KPwXeeWEZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+OnZgeRiCMEzQVK_HqH8D0eI5s$8IX5|DV=-hiVq|1vVPa%7H#ajeI938lACLkk2s%1@2PX>N2WASNaNBVjXTFgas2V`4ZnVlgo`IWRUgG&wLhH)b+5F*7(cHZ@oRNd}MtCm}jIcWHEJPjGZ7V{dMAbRcqNW^83+bZKvHIyzK&aAhVeAZc!NDIg{$03%^JVmCB0G&f>3W;r-DGB7h_HaRdcV>C8nFk&=hVrFJq0!bf`0w)MMI(KPwXiso-C~0nVDIg{$03%^DWi~c5G&we5Wic}~FfuhbVP$1CI5}ZvIAmgBV_`R30!apt0w*ClI(KPwXm53NC}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFfuabSWSvCIBO0Vq`WpWnnfoFkv(^G&E*mV>vT6W-u``WHdB5F=H__UIIxUkOC(NIy!f0bZBpNbSPN2WASNaNBVlDUF*G${GB9IfW;8Z3W@0vFIXE{lFgG_cVL4@FV>Ds{NhFX0Ck;9}a%F5`bY)~HX>N2ZAZc!NDIg{$03%^yV>f0qFfcJNFgIajI5;+9V>vQ4W@b1tV>U1|Ght(70!a&y0w*y#I&x)fVRU6=C}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFe^JVRmJ5b75>OAZc!NEFfuabSWSvCIBO0HZ(RkH#jz7Fg0a3GBzOAZc!NEFfuabSWSvCIBO0Heon3WMesDW;A4GIAJz6HDqKoVl`qlVKiYkH!x;pXaY$VkOC(KIy!H3Xk~IJDIg{$03%^zV>323GdW^rGBP)0G%+z|Hf1w8Gh<~qH8C+|VPs@#0!agq0w)PNI&W@lc}Zp{VRdwGDIg{$03%^EF*af{HaRdgGGsGlH#K51IWS~pVK6o`HfCisW@ct=0!asu0w)PNI%8pMY$#!MbZ;pjCMEzQVK*{3V>L4|H!)^qGGjI{H(@z9HaBH8I5RakG&MD4WNrdU2ap0M6*@XkVsmA3c4cxxb!lv5WpXG(bz*OGCM+OxbYwa@b98cPZf7X~BVjRQWHvZqF*Y`3V`4BcWHmTpVq!TlFl8|`V`MTjHDz!DNfVF)Cm}jIZ*DdBmWH2^0Fl9D4G&N;1H#A~pHgW<VEWhi5BZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+OnZgeRiCMEzQVKHGfH#BB2IA$|6VKOu|WMML6WMelmWid2mWMX1AF?Iq;ACLkk2s%1%Zc=4!Z+2xUX>N2WASNaNBVlGWHexq3H90V0WivA{GcY+aGi75pHe+HkH8*5tIW~9#Nd}MtCkQ$^Wo~q7ba^OgZgeRiCMEzQVKHJeIX7ZuV`FAAWnwipH#a$BW;QZ7IbmitHfA|8IeG#~29N?LAv!vDX>@2PV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAZc!NDIg{$03%^AI5{@3Bb#y3cZgeRiCMEzQVK*^0W@I!qVKOl?WM(ooGGb&fFk&!bWjSUxVPrEkF@gd~29N?LCOSHDWo%(|Wn?I0Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jX>N2ZAZc!NDIg{$03%^DG-YEsV`gGxIW%Q8VKio8V>U4`Ff%b_H(_IBF*#<00!bv00w)bRI&x)fVRU6=C~0nVEFfuabSWSvCIBO0HZf*5VPj)vIb$|tH!)^nG-F|6Vq`XDVK+25WHvQ2h5|_okOC($Iy!P?Y+-a|WGG{AZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+OSa$$C5a&uv9EFfuabSxlgZgeRiCMEzQVPj)3I5#n4GB-9eGB+|}Vq`F8Wi>EkIWu85W@0%wGl&97FOUK!7&ooVq;@8WiT~3G-WhnVPs@DH;MvD7LWob1v)x!bZBLAC@CN&CIBO0IW%HrFf%h@HfA(oGcjT@H8wakWjACrGcqtWH8*88i~>mmkOC(OIyz%vY-}iDb#!kjASNaNBVji(IAb+4F*h-0Win$nFgIa2H#RqAH8?XhI5agiWn^vwNe5^H06IEDbz*OG0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&udV{>0IUok^L90#Bm?Ej2niNp5g;bVF}#Vrgz+bZKvHD06gVIy!b`V{~tFJY#QiWjZ=(Z#p_lWqCdZ5Wo9)qH8No|WH(|lWnnXw0#62`0xbeMI%{Qlb0{eQBVlAXV>D$jH)UcrF*h(ZH#25oH#uQsHDhEoFf}zcH!+t2Pn!ZS2q0r`ZgX@1GB7b?I5=iCWHV$nIWRe7Vm4(kHaB5pGdVJ0G&eOgnF3D+qXI1gIyz@zZDnv_WI}axbZ>5RC@BCVVPs@8WMMfqH!(IdV`DgCG+{J3Gi5e0Gh;b9H8L|eVVeR^p8_ukAY*TCb94Y>VPs}wGh$>jW@0yGHa0gnIASwoG&nFZG&W{qGiEoP0#62`0xbeMI&E)tb7ewxbaZcSb0{eQBVjmUH(@k4VK*~jFg7w_F=I4gV`gSJGGk&nVKZhiF*Tn8Pon}YJ32aWa%FRKWn?I0Z*FsRAY*TGWjZ=(Z#p_xX>Me1cP1<#V{dMAbRc7Ia%DO?X>U3@M`3McaA9QPfTk%RV{dMAbO0k^Hez8iW-v5lWMeooIb>uuGG=CGWHVwiWH2ygGi708p#o1iNdX;0Z*5{}Zeet3Z*BlXZ*5{}Zeet3Z*DGVbZuc;WdLJrVRLh1bz*OGUol@XV{dY0Uol@XXKY_FUomNIaBN>OUok{waCB%>bY*U1X>3z;VRU6KXmo9CXagNOI%#ciYye*|UomNIaBMDUbZu<(4*)NAWn*-2axQ3aZ~%5?V{~tFUpQ!Ra4u+cZEO_`1TS!DV{2t{0AyrgWH>Q6W@ThKG&D0XVK+EoHD+TqI5s&qG+{9~G%jd#ZEUInDLOi7WB?;!Wo9)uIW%HpFg9gkIbkqkIWaUfVq`EdIW{$BF=b?9ssbrGI&fihXaFN&W@KSzGcz$WGGQ_`I5jgiFk&`iH!(J2IAt_qH#s>punPb>I&@`hIyzHuVQxue0CRM5bz^j6bz*OGUol@XV{dY0Uol@XbY*N`F<&uLaA9sqWG-lQZES-G0WV~7VRv6_X>)WgXmD@BGE@*IY0AX%tb!=gBUtei$aCK~RWnVaGaBwbYbZu+Nn})caAg1^VKregI5;?EGB7hUIWswAHa0LaWivN8GB-G3Hf3QkGSdPjIy!J+bZAdM-I~hB@H?{L2h|Lb8}^MD0OvdWOF(?b#-ZEDF7p3W@RxsGd46cV>f1GGGj4eWHB-`FlIA3F=b>oIb=CFvjRs8(*h+DIyymac|mh?WppTWbYwa@b98cPZf9S1X=QgQ03%^zVliZ7H#9S0G&nY8Fkv?_WM*YzIXGoCGB9B>F=J%40!I+j0wobTIzeuEL349ubSPtQZgX@XL2h|Lb8}^MCMf_TVKFjhG+|_9VlrblW-~W8V=*;2W;QW5VKOvjFflMUVYdQD57PoA3_3bNZh1j-b7gcWL2h|Lb8}^MCMGEWBVlDRHa9tCFflbaWM*bHHDO^jIASzmW->7|F)%qZW@EVmM+(ydB@sG0Z*XODVRUbDJt$*uZgX@XL2h|Lb8}^MCMf_TVP!QrIb>#IV>2@{Ib}CFI5{{uHa1~1Wn(fmVK6W_V!HxI57PoA3_3b*aAk5~bZ>G!C_!#{L349ubS5S#03%^JFflYRGGQ_~W@RyBWn^M7H8f;mWMpDtG%;d1W;tcO0!Iqd0wotZI&W}ga$$6Day>mLV{dMAbRa=)c|mh?WppMfAY*TCb94YBVKXu}G&M6ZVmM=DWieuAV>38mWHLBoFfnF0GcY+gH@^Z$71IJG2s%1vWpq|$a&u{KZYU`rV{dMAbO0k^He)q5G&y82Fk>+`IXPx!Ic765WjHxyGcz|hVrDoq!2(AH(*h+3Iyz@%bV+1Xd2nSYDIjBSZgX@1BVjiMmIDIjBSZgX@1BVjNxVq`KkGG;V6W@9-uH#aynG%++}GB#mmF*P_hF*L;jM+VaZB?vk?XJvFrWGE>hV{dMAbO0k^F*Gw|GBz?eWH)6sWin-EGc{pjGi5koIAvlrGcaOe#{x$N(*h+3Iyz}{PIYW-C@COgZ*FsR03%^HF=AygF=aG3GBYqSVK_H3VK8JlW;HQ1H#lZAGcz>F0!IeZ0woAKI%#uLbaHQQXDBHkV{dMAbO0k^G&MIeW-w!BGG;k4H#cHsHDWk0Gd5&3FkxY1H#cE7%K}FR(*h*|Iy!A(Yh_nuVQVNU03%^DGcaa3WjQ%9HaBHvF=1jkWMX78GcjdkVKOpfWHmL-0!PyVB?vk?Z*XODVRUbDAVG6;Wpq4LJ}4<5V{dMAbO0k^VL3QsWHw`CVKiiAVq-BkI5uWxFfe2{VrFGGFkvz=&jLpV(*h+8Iy!A(Yh_ekGi5b3HZeD2Gcq?dG&D12HZwCdH8wIcW?|6+M+@))06IEBZh1j-b7gb@V{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XL2h|Lb8}^ME@*UZY~%th0y;W!Z*O!cDF7p3I5ae5GdM9~F*G%0IW;n6Gczz{GB+|bFfn5_Wj8l7)B;cB0xc{$I&E)tZgePfbYwa@b98cPZf9S1X=QgTAaitNIy!Z3X>oOBUvPACJVA0}XlZt3J}CerVKy>1Vlpx`V`Vd9F=Jz9GG=6BF*!J4IbvgEG%z$_Io1MCD&zt!5;{6{Zf$RMZgePfbYwa@b98cPZf9S1X=QgQ03%^zWH~o5W@9sEWHDqnG%#Z^VKz81F=jVpGBh`1V=yz=0#6X+0xc3cI%a8ZWGHiVWI8%?baH8KXJ2+{Wp^n6BVl7QIWaXhH#IV2WH2>0F)}h^Vm3E3Ffll0V>K~lWHj0WPY~n+Ef_jFV{&C-bY&=WbYwa@b98cPZf9S1X=QgTAYyNCY$*UEVKiYiV>V(iV`4aCGc#mmI5T5mVK!rAVP-TjG&g2AH{1eG7UTjg5;{6$Wpi|LZ+R$lbYwa@b98cPZf9S1X=QgQ03%^xF)}z~Gh#MmGdE!~V=!ViH)dsJWiT@{H)djHHDfv60#6X+0xcpsI&W}gZYXnfWI8%?baH8KXJ2+{Wp^wfMrmwiIyz5qWo}JxWMwG;BVjmUWHB@{IW=WBVP!L7F=l09H)3ICHe@g|He@tpHDurdPaxz1EhIWRV{dSID06gVIy!T7a%pa7Uv_C_cPt=tbYwa@b98cPZf9S1X=QgQ03%^IVlp#gVPj!4G%+$^WMXABG+{9`IWaajFlI41HZWu20#72e4jwYIy!A(a40DNBVlA@VKp&hG%+z`IXGlDVmCNpWi>Z3Ib=39W;bRzWn|?7R_OvX0y;W%Zf#+3C@BCVVKy{oI5lKrGd5!|H#9e9H8W&0H)LaDH#a$EG&eUkFy{hR;0pjcI!SJ1Wq3k$W@cq_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F-dM@Wq3k$W@cq_E@*UZYz0GALQhj)R8m1hMJO&VE-3(PZ)ay|Zf9ROXmD^YXmo9CBVjQ%H85l{IW%H3H#ageGdE&0WjJOxFlA&iIXN{sV>RjmGXn)fRYFfwUqnShRYxc;E-onmY;R|0X>MmMmQcfr?E-onmY;R|0X>MmyGW->T9V>o0vHe)ekHa0dfVrDQlHDNSlH(@mJ0y6^zLsddgQ(r|=QcqGSE-o%90Bmn(XK8L{UpQ!Ra4u+cZEPc9GC5;mW-&21W;HN4W;Hi3G&3)bV>w|lG-72qWMVisHDfnqHDft6Gd5%}^a3*j3`12yPg7q^Pe&+hWp-t3EFdl}E-3(PZ)ay|Zf9ROXmD^YXmo9CBVlD_Gcq(aG&VLjH)CZoVPRroVKp^4Wn?yFH)S(rI5_qKGYSPmRYFfwUq(SmOeiicE-3(PZ)ay|Zf9ROXmD^YXmo9CBVjQ!G-PICW-()BV`VX9Fk&?_Wj8Q0F)%VRW;tYKGc@=DGXn)fRYFfwUsX<0ML|PIK|)MLC@wB8DFAG5XJ=_{XJ0sIaBwbYbZu-SVKp^3W@9yCGB;v0W@0#EH)Ak4GBIT}H#aaeW-w%BHu?fH0|i4>LQhj)R8K@tC@wB8DFAG5XJ=_{XJ0sIaBwbYbZu-SVK^~2G%_+|GB9Q_VPQ5mVK6phGGaD0H#lQrWieqlWc&g%0}De{LQhj)K~qyjQdB5oZ*F8PATBO0DFAG5XJ=_{XJ0sIaBwbYbZu-SVK6mhG+|{mWHd8mVL4%8FkxY2Wie%9I5K59VPa!pGyVcI2@yk8LQhj)K~qyjQdD0_O;9LfZ*F8PAY*TCb1Wb(E-onmY;R|0X>MmLV|8M0b6+uEF=cLNX>Mg-F<&uIXnAvKV{<}vZe(m_E@*UZYzqS^Iyz=@Z*Fu(a$#*{Vs&O_WpV%`VK8Q6Fk>-hWi?}CWjSVLWM*b!He+IAHZf&2V>e+rG7AGKIyz!uV{1loVQpn%b!KK|asVS?I51&lIb$$pG&4D3FfwIhVr6DxG+{YoI5K8rIWlB23j--SI%aZjZgfy-V{2t{03%^GGdM9cHe+EmWjQx6GdE^5GB{>tIXE$4WimK0Vlp@j11UN>Vqs%zP-$apWpV%`VPi04VmD!8H#BBuH)UcoGBRT{Gc!3hG%{p3G%_$YGw=ZbIyy;hM|EjbVRC0>bO3X7a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uBZAW!!RAF*wWpplRbZu;c3k@K`yC70!W^83+bZKvH04;K5W^83+bZKvHE@*UZY<~{`FK};ZZggK`VRLk4axQ3aZ~$;`X>N31Ut?i&bY*g1IB0NiE@*UZY-SDwFJW?Lb!}yCbaMbUIb%3DWi?@DIc8yIH!@{mW-&E6Wo0vEI5T89WMVQdXmo9CP7?$#X>M?JbO1PIHD)+8WHK;fF=1giIb%6AF*YzXHZf&4IAt<6V>B*kbZu;~3jjJgbY*NhI#Y0AZbx-ta%2EwY+-YAV|8M0b6+uEF=KCXWnVF0F?3~YUol@XQ*dE!M|ELxWG-lQZEP?T055fPX>4;YXmD@4;}IB0NiE@*UZY*hvWFJx(QWn*+{Z*F01E@*IY0A*uzX>V>}Y+pENaBwbYbZu-E11&l_VRLh3bO0k^V`5`sV>M%CWMMaBWHdNtFgQ3cIXO5oWMnrsHDfY06$33gI&WrXb7gb@BVjmYWM*b&H8nRhI5A`}V`VfrFl1#lW-($mG&eRdH8$`806IESWo~3;a#nA6Wo$=sX=DI%baHiLbYpd5Z*yNUUomBFXK8L_Uol@XQe|#rWpY+;cx7xya%p5PXmo9C^acPgaBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIKWo~3;a$hoYXklb;cVAy&bZlXBUte-zb97~LX?kUHUovoPb!TaAUpQ!Ra4u+cZEST0054&1X)b60Wo~C_Ze?FGX>Ma|b!25Mg-GGTCOUpQzkXmo9CXafK`I#YRVZDn+FX=7A!VQF*#b98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUolg8ZEaK5F*jpnIX5&kG-5Y7GhrPAH#$0VbY*U1X>0%^VK`woVmDbY*U1X>3z;VRU6gWpiTyb98cbV{~J6VsCR_F<&ubZ*pZ{F<&ufY+o^7F+^o>bZAp_Wo~0>Y*Tb$bY(#HG&5mkWjJIuWMMZY11~x{b98cPWMu#&VP#@9H#B2pH8wS5W@2P8IAvouWnp4AF=ApjWHT@^G9?2qIy!G=W^-k903%^EV`XM#I5jviV`MU7IAbt4Gc#f~W@TeAH)UluI50FN11~x{X>Md?cmN||W;SACWivB4Ha0jgFg7_bFgZ3jVKrtsWMwxtGdM6~B?B)yI%0KZW@T~!BVl7UGch!06IEWWpZ?7ctvbwZDnqB0CRM5bz^j6bz*OGUol@XV{dY0Uol@XXKY_FUolo?a&%>QMQmklWo~pXXmo9C#Rvc|aBpyRa4u+YZ~$;`aCLBBIB0NiE@*UZY)%sdFLZBjY;yo(F*r3dHaTTEGG#M1Ff(H|WH2yhVK_51GchzcWMMZhXmo9Cv;VRT_GXmo9CvKlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVILV`Xk-UovoPb!TaAUpQ!Ra4u+cZER-_054;2Y;|pJE@*IY0Ap`#b!~26IB0NiE@*UZY&-)f0y;WOZ)ay^awsVPBVjT*VKHT8G&N&kIb}34IAUZsWj1CoH!?6WF)=YRV>K)TN<0H72Rb@zWp-t3C`@H`Wo#(`BVjOQIb>lqGdMLfIb&mCI51^1W??yIW@9*IFfwIhFlH_TN(DRvC;~b}aGcXDZTWhhK#c4cfVAWUy#VRUJ4ZY&^kbYwa@b98cPZf7X~BVjmYI5;&mWHx3oWM(vBV>dH5H8Nv3WMwotW@0!pIWsl`N*p``C@4BQcXDZTWkzpuZDDjMOl5XuY%Cy5Z)0I}X>V>UAY*TCb95kMXkl_HEFe@ta%XccE-onmBVjc&F*7kYHDNI~WHd4}H8M6gW@chFGdDRmF*RmkG-WsgN+vu5C>A<8a%Ev;D06gVIy!S{dSzd9CM+ODZgg^aCMf_TVP#=3Gc;y3H!)*jH8f&0IXPxBVrF7vV=`uCVPiICH97-I6tD{bIy!V^Y&tqjZ)ay^asXp&VRLh1bz*OGUol@XV{dY0Uol@XbY*N`F<&uEZ)ay^axQ3eZEXAq055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIC{ZWMy(+GGk$LV_{@vWM5x%Xklb;cVAy^VQ_O_GH`5lXK8L4COXmD^YXmo9CK?5&3I$>>MX=QG703%^#I5jk8Wn?ipVK8K6WnwomHfCfoVlX)|G-fz3IWaRq11~x{b8C4=a$#g?Wo~o;BVjgTIWsmgI5=T7W->E0WHB{kIb<|tH#In8G&g26F*Wc306IESWo~3;az$=-X>xCFZDnqB0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolc;Ze(S0MQ(O!a&K;JWo~pXXmo9CxDg~eI!Sb8a$$6DasXd3UolB^WpZJ3Z*neZbZu-#10gy(b7^{I03%^IVPZIDHZf*mH)J?4Gc;vmWH>ZqFg0dnFfuV?WHdHL10gy(W^!+CbW~+{bairN03%^EI5#*pGC5^7G-hEmVl*{oWH@6uF*P}5VK`%AVPs-P10gy(Vqs%zRAqQ{b#i3@BVl7XIX7WuWjHi3IAUZoVq!2bIXN~mH8?deF*0R0IA-tx06IEIL{b2AbaHiLbYpd5Z*yNUUomBFXK8L_Uol@XNJLUDXmo9C;0pjcI!1C~ZDnG0W@cq_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F-CG>ZDnG0W@cq_E@*UZY)=C!Iy!S{dSw73VKHK2G&VIjG%#c|W-&D~H8V0{Gh;F`I5cH6IAUZtIZp#BIyz%)WnpqvN0G%z$}F=l3DH(@bhWHUH8GBh$YV>dA~Gczzx11dT?W^!+CbW~+{bairN03%^zHf3ZoG&5#5IA%CyF*i13IW{phH8f)}HaIXdVP-H-11dT?aA|mDY(jNrW@T~!BVlD?F)%PWFfcJQIXEyeG&W>1Ha21~I5;sgVKF#jVlz(zDk3^Ma%Ev;D0OagX=iR_WFTp7bSxlsZgXj8Ze?U3X>N2WAY*TCb94YBVL322IA&xrW@I@yIAk?tG-5PnH8MFiFfn2?V=^;1G))6cAn*YIIyzEiZe(S0P-$apWpV&>baHiLbYpd5Z*yNUUomBFXK8L_Uol@XQe|#rWpYqyV{2t{E@*UZZ1fKRFK}{cZE19Ac4c!eXmD@@6JWpiIRXmD^YXmo9CUjqOyaB^>BWpi^bXmD@BWpi_1IB0NiE@*UZY%~o3FK}#iXK8LOXmD@Ma|b!255Wj8KpbZu-E3MOQXmD^YXmo9CS_3dOIy!Z5WMOn=D06gVIy!S{dSzd9EFg1qWI8%?X?kT}bSxlqbYwa@b7^{IUvw-Wb97`nI&*1yW#WLQDF7p3Wi?_pG-fwBIW}WBGc-6fHaKKtG&W{tW;r-xVqr8fRs&KqS_3cwIyz@%Ze?;|bY)FxaBX35b0{eQBVjpXGcjdhWMejCF=k_8V_`LBH8WynVPs)AH8wJ4GBH>KQs4^!IyysjVr5NXZ~$X$VRLh1bz*OGUol@XV{dY0Uol@XXKY_FUomNIaBN>OUok^vc5IWsmfWjQxCW;0|pH8=1906IEPa&%~KXL4b1XlY|ZVQpn{VE}VLV|8M0b6+uEF=cLNX>Mg-F<&uHa&%~KXL4b1XlY|ZVQpn{VJ>KNZEU##1TS=Ga%Ev;0Ae#XGB`CeG-ft5H8nCbWM*M9WH2%@V`ODyIX7ZvHZEv%ZEQ{x055QIWo&h1WiDuNZ~$;}Wo&h1WnVaGaBwbYbZu;s3ji;0Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_UovxLbaZKMXLDaNaBOvFX>MOQXmD^YXmo9CeGdRHaBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIOZ+K;Fb6+xWY;|X8ZeKWPaBwbYbZu;h5dbf6Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_Uov!WZ)|g4GGlLSY-wa=a$jF(X?ksMb6+xWY;|X8ZeKWPaBwbYbZu;B14KGHQekdnZ*2f!HZ(RiGiEe4G&VOlF=IJnFflPOI5Rk6IWRS3VPP^eX9Gk!Iz(@GZUA90IAJq5GB-D3Ff%YYFgGwaFg9j3HZ?M3WnpDGVKp;n14KGHRd4`dGBr46G&wjpH)UoxWHB^hV=^{4V>vQnFfuhTGhtz2XagcTI#hCDc4cyNVQc^+VPZF7V>4thVm2~2Vm3HrG&3+WVKX>pV`XMGH#1^5GO!C4Iyz-za{ym4UomB4b1rCfZEWBR06IECY-Mg_Q*>c;WdLJrVRLh1bz*OGUol@XV{dY0Uol@XXKY_FUomNIaBN>OUok>#Wo~3sbYXO5E@*UZY)KFRFJo_QaBps9Zgg`mX>D+IY;$EUXmD@D+IY;$E_IB0NiE@*UZY!wUyFKA?P0Ao01I5;^qW;SLqIW}ZAV`gSIGh}9AVq-KiI5#mfF)nCyZEQ&p055W7b8mHWV`XzMXL4b7X>@rmXmD@@r2BVjmZH!@*nV`elrH#jviH#22rWHT~iGcq${H)LgEHeqxFE;>4AY;R&=Y)@`603%^FGiG99WiezjFgIjjFfub{W-&1~IXN>pGBP+aF*aj#11>r`XKZg`VQf!sG5{lCWHB={Wj16sIA%9BIAmrpF=aP6GG;MkHfA|CHDx$CbOSCrI&5!aVQf!sF#scBWMgACH#0Y7IAb?vGdVb8F*qr`X=DH+VK`!AIbvooV`61wF=jC}WHn+qWjA3rFfuhWG%+wVGVlQaIyysdZggQ|bWm?;ZgfOpbYTE)>8FK=RVWpZ|9asW0oV=!W4GBGk{Ib&lrFg9T|HZ(9fH#TH3GdM9ZVmU5obZu;W11%dmI$~vKX>KTEZ*FsRAaitNIy!T7a%pa7CM+OKWp-t3DF7p3Ib~rtV`gSFWj1DIW;Hc8Vr4WiVlp`}GGsS3IXN>ob^}itd;={4Iyz-;WGE>BBVjoUD~G-fm~W-?}DFfuYZW-(?oVKX&mGBJ1qPkaL{0y;Wlb#iiLZgeOq03%^DH!(IaH#jvkVK*=`WjHiBW;HcoH8(XiF)=n|GBRa)15dCE06IE!Wo$Y+Q*dE!O<`_fXJv8#V{Bn_b7OU4Z*yNUUom5Ea%EpJUomuLY+o^7F;j41ZcSlsVP|D>E@*UZY%dKFAi}#KRB~ZsX>Ml#Ep&2WV`*+@E@*UZZ218P2s%1cZ*OdKIyzHjY-M9~X>V>iI&)=gWn*+{Z*EX*b!TaAC_{B(Z*wLo0CQz*Wn*+{Z*DDgZ*OcZaBOvFX>KlPbZu-SXJIrkHDxh5WMnyIWj8f8HeqHrH8M6~VK8E0V>vfvFgbn$LDwmGC4VAV>38rHaIh3HZ?IhVKQg~06IEOVQpmqb98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUolQ$ZDlTKbZu;e12H-}a$$67ZvZ1BVlG`H)S?uWiVrAH!)%`VP#}xWi>Q2HZfu_GdE>5GBt<;CKft6Y;SLCX>MmhbSP(RZ8|!3Wn(ieAZKiCIy!b`V>2lLBVl1>FkxY1F)=ndVly>1G&W*mH!(6ZFkxghWHB~1VmO8aNEGk^06IESZ**aFX>V=-b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;Z`IVRUJ4ZZ2qaZETeTMglrILUn0uWMy(FDF7p3F*!CcGh#G1WMg7EW;ZZoIAb+sI5szAWo0xpI5{>mi34br14acpI%0KcY-A`YASNaNBVjQ&Wil}{W@BY#HZ*26H)b|6GBz`2HZw6YGB;ylGBk?=Xaki4Mg=-LcWHEJL}g}Sb!>D)Z*FsRa&=>LZ*nLpASNaNBVjZ&V>dNpW;J1BFf}k_H)CTlG&VUoWMMcmWiw_tI5dp|Xaki4Mg=-LcWHEJLvL_-LvL<#baHiLbZ>GfDIg{$03%^EHeoO{W;Qo7Ff=%0H8D41VK6u|G&nY8FfutYHDY9s184)414acpI(KPwXiaZ+WkYXnb98cbV{~tFC@CN&CIBO0GdVbBFfutXGBY@0Fk)gjHa9h5Vlg*mW?^AuIAbz5kppN0l>LZ*p@eDIg{$03%^$Wiw_tV=^~0IAk(1FgG-0WMg7sV>2;jHa1~pV>LCC184)W4mLVELUn0uWMy&yUol@XLUn0uWMy(LXmo9C!3QKrVRL8zNMUnmE@*UZZ1e*%IyzKkb97~L03%^FIXN^kGBP$aF)%e^GB7k`Gh#DgV`e!uWMX45H8V8y12Q@~Q)P5?WpV%`VPRo8W;8W2Vq!NpFfcheH#sygVmD)9He+QnF*z_ZG4um6IyysaWnpq=$}VRLI#a$#w7CMGEWBVlGZHZWmfWi>HlWH~fsV>2~4He_RFWj0}BIbk=%abYwa@b98cPZf7hYRAqB?WpXSaQ)P5?WpXSaLu_SXa%FNU03%^CGc;soH(_NsGG#R}V>mcsVq-I6H!)=~H!x-}H)b@R15_mR12QQ(I(KPwXhLapD06gVIy!T7a%pa7EFe^6b97~LEFe>5baZ8MEFeQ{Wnpqx6trUO(M^aC;oIyz!yXK8LIDIjBSZgX@1BVlGYGi5L^Gi7BkG%z+cF*!CgV=-i8I51*jIAS$rGBc2WHV!9H)3NnWUd2L5%dExCOSGoX>=%abYwa@b98cPZf7hYRAqB?WpXSaQ)P5?WpXSaLu_SXa%FNU03%^JW@0lpVL4(qWHVtgHaTQrFfcYUH)3NkGc`6fVmV{515_mR12PjjI&@`obSPtQZgX@Xc5i89Dk&giZ*FsR03%^AGcjT^GdN^oIAb?4Wn?foVl^``GdMJ3HaKN8Vlg`fv;$NN^aC;tIyz%)WnpqCc5i89Dk&giZ*FsR03%^CVmLB4G%`10Gc;vpWi?_pW@a-sFk>=eWim23IWjr615^w212PCYI&NWYWhf~iV{dMAbO0k^H!(6|GBz|hFf=tVG&DFfIAb_vGht&iG&VFfG-Wb5xC2xM^aC;oIy!D;cyuT!AY*TCb94YBVKriAWo9ujH#jyhG&nb5HD)$5Fk>@iWI1MLVq-WnGP(m)2J{0m3_3bVbY*g3bZ>GfV{dMAbRa@$bSfzTBVlG@Fg9d3Fk~||G%{s2Ffuk}GBRRjIA$?5Fgav4W;474R0{M1G7&mDNpxj$VRUbDC}VGKb95j{bY*g3bZ>GdDF7p3Vq!2bH#jsfGht&kWo9=wI5%Q7IAJ+vH#cHtF)?9cz5`Sb^aC;xIy!G~WpZJ3Z*n~-V{dMAbRbD|WpZJ3Z*nFn03%^BGB+?XIbvlvH!)!`G-Na|Fl8_}V_`C6G&wUiV>vOv15^+612PvnI&W}ga$$6Day>mLV{dMAbRbD|WpZJ3Z*nFnAY*TCb94YBVL38pFf=tcH!(3bG&MA0WivN4Gcq}2H8(Y8HfAtpIl==}74!o#2s%1%aAk5~bZ>GhC@COgZ*FsR03%^zVKQQ6HZwFgGGRC{WjADGGcY(ZG&C_WWI1FwVl-sL15^g|12PCYI&W}ga$$6DaxFe6DIjBSZgX@1BVji;G%+@1V`MpGV`DdFGBY+fWH>iDF*G%1VP-cuG&sfsR0i||G6Fg}Z*XODVRUbDD=R1|03%^IGch%0IWuE4VKZYeH#A{0H90smGiEk3HD)q4Gh{Hx161?_G8sBLQ)P5XbY*g3bZ>GfV{dMAbRa@$bSf+$V{dMAbRc$bX=ExX03%^EHDfYlWH&f4I5sq4V>mN1V=`kgGB-CiGc!0cGdVWO15_9E12PmkI#XqINpxj$VRUbDC}VGKb95k6Wpqh&WpZJ3Z*nFn03%^xH90UiF=b&lWM(pAWo9=qI5jaaGG;M2W-~H1GiEf*15^_912P&qI&W}ga$$6Day>mLV{dMAbRbh@bV+n&a$$6DawaJtV{dMAbO0k^F=jJ0F*9LeW-~A~H#uWtGBP(gH8W*mIW#$BH)A<5&I42!^aC;oIy!G~WpZJ3Z*nRqDIjBSZgX@1BVl7f0pGd4J6I5#;lG&N>nW;Z!BIK~512J{0m0y;WxaAk5~bZ>GiD<~-dBVlAVV>K`{Wo9`rI5Ie4I5A>2H#TE5WMnxpHeokrG&R%%RP+Nf89F*vX=QgPV{dMAbRbP(b8A#`VQF+GEFgAoX=ExX03%^IWHDi3G&f^nW@0%oHDYFBG-YHmIAUXAVK+E8FfnA-15_9E12PgiI&@`obSPtQZgX@XLTPj+DIjBSZgX@1BVjl5GBq=wjAY*TCb94YBVP<7!H8f;nH8LxCrW;kOvVPj-8V`b(8R0i||G9NlRLvL<#bXI9)cPL|TZgX@XO<{9uRB~ZybS5kyV{dMAbRc$bX=ExX03%^zFg7(eGh#AgHZn0eVKp{4HD+ToW-?|rW;HlAWnwhw15_RK12PgiI&@`obSPtQZgX@XLTPj+DIjBSZgX@1BVjl5GBqxCrW;kOvVPj-8V`b(8R0i||G6Fg}Wo~3BDF7p3HfAz5Gc#j2Fkv=0W??ZfHDotpI5jY3H!@*nH!xu~@&i=(0RTEWO<{9uRB~ZybO2*)VRLh1bz*OGUol@XV{dY0Uol@Xa%E<0Wn*+{Z*E^PUolN#b8A#`VQF+OXmo9C`2h(CIyzKuZ)|fqIz?`DX>@rYNp5p+Wn*-2aymL?ZggpMc}Z?_aAjk3Z*ovGkbZ>8LEpTjgXK8LOXmo9CBWGb@WH~W8WnyMBG-NY3F=k>nVqs%pG-72rI5RRZHe+V>14{aAjk3Z*l--ZggpMc`a#fb8uy2bZ>GkbZ>8LEpTjgXK8LOXmo9CXb=D|W@&6?UvqhLbY*QWXmD@1b97~GUpQ!Ra4u+cZEO|{5Fo<4AVg(zWpZg@Y-xI7bZKvH04-!?b1rCfZEOGpGXgp~N>fixL}hbja%o{~X?kUHC@BCVVPZ69Ib=08Vlz1~Wi&T6G&nb9Gh#S4W-?(lVq`foWcmYD00c7-Iyz=$Wn?IBY;S07VQy|ZI%;!oZYcmGVKOo_VKF&5WH~lDHf1qmIb&rxIb~&GH#KH6V>LKpIs5}v4gdr*AUZl^Wn*t`aBp*EC}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFgAoX=ExX03%^HG&C|~HDWn7FfwB@WnyDuHDzHkWMVThF=99{Vr4V_163Xc0RTEWN>fixL}hbja%o{~X?kUH0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ucVRT_%F<&uCQ%_DrWpib6X<=+>dS!AhXmo9C4+JYGIyzBxWpa5$VRT_AS8sA`WF{;iV{dMAbRctdWI8%_Wn*-2ay(IWWpa5`WpZskCMf_TVKQPfH#0LfVlgu~H)duzH92E9WHV(qWI1IvH8wS4F#!ZkB@YBE4LUkeb!BpSL}7GcC{cA~a(P5ybYUhYDF7p3I5sskH#TE9FlIM2Ff%w|HDxz7H!))}WMyJBH8U_W0|ZSA4+JX+IyzxvV`X!5WpgMgAY*TCb94YBVKiefH#K54WiVwmFf}(cV`einWn(pCG-Ea~Gi5P3I0Xbv1`h-)0y;W%aAaY0Whf~CBVjl*WHw?lWMyGBVq#%3GGt*hH8?XfGC472VKrkhFgXVVO%DVs0y;W&X=QgPDF7p3W@9;KG&eb6VliemGcz(UI5smfVmMKNZEU>@CP-m(XaGoIb7(GTbZu-U1SbMII#zFZWo%7vWMyn9DF7p3Fg7!0F=Sz6H8(LcW@9rpVK_B5V>C24Ic8*JW;SFr5d=vk1SbeOI%jfeWJ7OtZgeOqAY*TCb94YBVK8H3WHvQrH8Eo~WMwlqWMwonV>3BnFfwE`I5%N6G7|(z1{VY=2q0r`ZgX@1GB9O0Gh$(4FgRm3W->HkVK!l6W@KezI5#jbWM(#D6$D8JB?Kn|Iy!J+Y-MzGWhf~CBVjRPGB{*rVKZZ4IW;*rGGRC~Ic8&GVK^{2FgIl~HZT_iNgD(y6Ch)6ZgX@1Vl*`|GGa1jW-u@~I5=WBWn(jDWivB0H#TH8IAS(283aiYB?Ko8Iyz@^X=EsKbYwa@b7^{IUvwz|BVjTyHZo>2I5uH4V>V?lHZo;0GGj4iH8443F*##2F=iVCNed+eClfk4XL4y|P;YZ-bZKvHD06gVIy!S{dSzd9DIjBSZgX@1BVlAPVl_21WH)3uGdDM6HZ*2AIW=ZAGh#VmVqs%2FgYCrNf9LkCmA|AXL4y|P;YZ-bZKvHD06gVIy!S{dSzd9EFfoWZ8|z>c4cETDF7p3WHd5nWMpA5I59CXIb<*}Ibt|5WjA3lIAUcqV=^=~9|TDkB?KoIIy!7`VPr;fZ*3@JZ*pZiI&EcbZ*qA$I#YCVWnpb5DF7p3VKz56Gh;b9GcaT^He+HlWMwpAW@a`tH!(LkF*jsoAp}VkB?KoOIy!f9X>?^&ZzyALa%DO?ZDnn5a(OyBQ*?4=VQnTUAY*TCb94YBVKFfM+tG%+zUG-EJjWI1FuG-Nq9WMg79H6sK`8}I=DIyzQwcx7x&Z)9a`0Ap-nb8};LVsCR_F<&udZf9w3WnVF0F;;JQWo%7vWMynFXmo9CEd(?=I%HvVVE`jxIb$_rF*RalV=*!}Wnp17H!x#lHDoY2Wj8rxG+|;kEd(?=I&EoiOl5XuY(sB#Zgc=6VKHT7GBRW^Gd49jIW##pIWjadH#cQuH#lT5GdDRiWi13WIy!f0WOQf%BVl1TWMX4AGBi16HeoPhH)CWsV=!YhG&5v1WHmB3Vq`4@G&(wHWoc(N0HWn*-2a$hoVY;|X8ZeKWPaBwbYbZu;d2mmi=Z*pmRZ*Fv9Y+rM9a%FU5Xf9}QZ~$m;a%p;RZggR6Ute={a%FU5XkR#JaBwbYbZu<;0S5>=I#h3OY;!s~LvL<#Z){~cI%98cb8l>AP;7N)X>KS(bz*OGCMf`8Z*FsMY-KHUZ*OcZaBOvFX>KlPbZu-SXJKVDFfuS=Gh{I|V`XM#H(@nnH8^HDWH4nkWHvW6FfuR%LI&Fo2Oz?`AVY6%b8l>A0Ap`%b8l>AEp%^hY%OqXb!TaAE@*UZY-$hyFK2aOa%6KZXmD@LV|8M0b6+uEF=cLNX>Mg-F<&uNNljsNV`x`tWOQgQXmo9CMF;>daBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIKWo~3;a$hoIVRK_)WMyPuUvp?-WN&w0Uu|JTWMOn+UukZ0aAjk3Z*neZaBu)&bYWj#X>N0HWn*-2a$h)TaBwbYbZu-50~jE}yC6<=Y;0j-Y-J!+a$#w704;QKVQF-8EpByeY++(-WiDuRZETtg5f?f-L349ubRcDTaBOdKWpX+?X>D+Ca&%>KP;7N)X>KTEbz*OGIyz-;XK8L_IyysjVsCRMDF7{LZE$aLbY*faaBOvFX>KlPbZu-SXJIlmGcYkXGd5u{HZW#kFf?K_VP!cmV>U82W;ZZlWMeu6Nfnw45g@|5AVG6;Wpp5AcyMfQa%FM=Eop6VZ*p{HaxHLdb!TaAE@*UZY?=lDIyypccvEO;W^_tH_baHiLbYpd5Z*yNUUomBFXK8L_Uol@XR&RJ^Y(sBsY-w|8Z*Eg)VQ^(%F<&u4Z+KH^X=Zd#VQF$MXmo9CYz7NDI!SJDb#x$MZe$>Db#!obbUHdmVQpn_VPryebaZcS04-^6E@*UZY$Io3Ibk+sV>mG|IAt+pVl`wjW@IxkWH>csV>3BrG-72mYz7NDI!SJDb#x$MZe$>Db#!obbUHdmVQpn_VPrvgX>$NAX>TrQbZu-SXJKYAG&wdkV`E}tI5#+DGdVapGdVagFfleXG-F{kF)(Zf3pzSUZg6#UAYpD~Aa8YaaCLM#I!k4F04-^6E@*UZY$Io3G-EO_Vqs-wV>w|qHaIwDF*jy1I5T23VPP^iGBY$WYz7NDI!SJDb#x$MZe$>Db#!obbUHdsZ)9m^X=QSA04-^6E@*UZY$Io3WI1ADHf3ZmF*#&pIXEDb#!obbUHdsZ*_BJLUnX>Z*BlBX>TrQbZu-SXJIomHDxq2WM(%qG&M9hGhsP0Wn?onHDot9V>2``WHoFC3pzSUZg6#UAYpD~Aa8YaaCLM#I!$kNb7etzX>$NAX>TrQbZu-SXJKSGFlA<8GGk*oH#sypH#K24Wj19nF*PwXIW%KsGB!vA6*@XZWoBV@Y;*u;VK!koF)%naVlXpgHexw8WMpPDHexVhVL4$rVP!WsVqrI7F*!0YWHvD|H8x>lV=y&gHZUDb#!obbUHdsZ*_BJQ*>c;WdJQ{Z!TzbZEPcFVK!koF)%naVlXpgHexw8WMpPDHexVhVL4$rVP!WsVoC%SMRsLwbO1RuVKz2mW@cq(H!@;lI5#q3VKZW8W;kRyWi@0qHe+lC3pzSUZg6#UAYpD~Aa8YaaCLM#I#+3KWN&u>EopBqXmo9CBWGb^VrDQjIbtz3Wi&Z8H)AwpVlg>lVr4isIXPruH!(SE1`7{5I!SJDb#x$MZe$>Db#!obbUHd`VQpn_VPryebaZcSRBuysa%pa7C`Vy!WpH6+LUnX>Z*D07EopBqXmo9CBWGbbI5A-{VK6u_H!@>oH843dI51;2GB+|gI5{vgV=`q+1U3z91`8BAI!SJDb#x$MZe$>Db#!obbUHe7baH8KXH;)TVQpn_VPryebaZcSC}VGKb95kcbYwa@b98cPZf7Pb04-^6E@*UZY$Io3WMMNgH8nOeH#jpgG%z<}Hexw2G&E&6GGjDmGiEt3O$0U)Yz7MrIyy;iaCLMbVQyp~Z*_EVb#yv9XJKt+aA9OYcxiJ~Z&P$~X>MmIM`3McaA9OYcxiJf04-^6E@*UZY$Io3Ha0V6Vm4!DFf}=0F=I6}H)Jw4F)(E@GG#YqFl93^PXsm#Yz7MyIyy;iaCLMbVQyp~Z*_EVb#yv9b98cPZf8_)M`3McaA9OYcxiJeV{dMAbRctdWI8%?baH8KXC^5CEopBqXmo9CBWGbYG-GCDI50FbVlp^pW-&N8WMX7xWi~NmWimN1I5Ig=1U3?E1`91ZI!SJDb#x$MZe$>Db#!obbUHe3aAj^+X>Me1cPL|TZgX@Xb97`nI&*Y#X>MmGEFfcVZgX@XXKZacI%#%gV=^WzAYyNCY$*UOX>TrQbZu-SXJKMAF*7)1G+|+7V>B}|WHC53F=R6}I5#yhG&3pFHY;of3k^CtNp5g;bRc1FWFT*KbZ~WaIy!A{b#rAxb#!!ZZd7kmbaH8KXDCf?b#rAxb#!!ZZYcmQX>TrQbZu-SXJKYFI5IS0Vm4!BH)1qoIXO3FH#IReWM*PAGdM6bFf~;KHVbS93lus!Np5g;bRc1FWFT*KbZ~WaIy!T7a%pa7RBughb#rAxb#!!ZZYX1KZgX@Xb97`nI&*Y#X>MmGDF7{LZ!TzbZEPcFVPrF6Gc!0iH8y21GB`11Vl+84G%_$UVmD%BV`gS!GgkyQ5^M$wAi}#KNp5g;bRc1FWFT*KbZ~Wa04-^6E@*UZY+D2=Iyz%-Y;SS^BVlGRIWuB2HZf#5Vq;@5H8N&4VKg*0WI1LrHZ);4WHRsp06IEVNkeaJZ*o#)V{`y>baHiLbYpd5Z*yNUUomBFXK8L_Uol@XRY^l{Y;ST>Wn*+MXmo9CUj#ThI%aZjZB$`$XJvE%BVjaTIXEymIA$c7Vqs)tV`4NoF)}w}H#sz7H8C(WF=1xp1}8c?Qe|vmbZKvH0ADd*F;Zo0VRUJ4ZZ2qaZEV&B055cJZ){?3crIvgZ~$~~Z){?3cwabZaBwbYbZu;B1T_LWI&EQaC@BCVVPs}7F*0LeH#RtBI5spkG&MG4V>2~1W-u~0He@q5GGPQ)X9P7MIy!A(a42(hWI8%?X?kT}bSxlqbYwa@b7^{IUvw-WVsCG3DF7p3H#uTvF=R4fF*Gz}G-Eb0IW%H1H92B9Gc_|gG&C?cV+22{kH8MFiWn(a9VKOo>WnnNgHZ)^qVq;}8Wdv8?3jjJgR%LQ@Wq3k$W@cq_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F;-=AbY*x#b!KK|axQ3eZEPt65+K66AVg(zWpZg@Y-xI7bZKvH04-!?b1rCfZER};0551{axQ3aZ~$mza$h)TaBwbYbZu<01^_Q&a%p5|WiDuNZ~$p-VP|DuGGcORWM^exIB0NiE@*UZY;y!HBRV=oc4cmKQe|OeWpXHEZ*FsRAVqd%Zgfy-aAiDHJ|-+6b97`nI&*1yWnXkADF7p3WMyG8V>K{1GBhw@WH2x_FgP_ZIb~vFWM(vGGh${mYXnara|A5{Iy!P?VPq&N03%^DG&nY5GBz_~Gc!0jV=!c9Vl_8nHZ)@~FgQ0fWHVxI1W$7WEdn|^Vr6G(ZYU`LBVlDWV`O7AV>vT8Ffe5>H#ImgVm3ErW@KhIWo9%uFf?xjPjdt<0y;WnZe%Da03%^!HZ?Y6W-&K8W;r!wGh#VrHaItAVKHSlVK-xCVlXpt1W#xK06IEFc4cmKQe|OeWpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=bLX<}?;AXIW;X>LX<}?;E@*UZY=s0b3_3bja%psBM|ELxWGGZ7EFes8V{0ZRDF7p3V>mQ2F*G?jHZ)-|F=jY7IW;vkH)3UGWi~Q3WjQo4bp%lgg#<4SIyzT!X>?^rbzyR3C|7c6bY(|%VRB?9CMf_TVKFmiIXF2mF=Jw4GB`6eW@b5LFf=nWV=`kgW@I-uWOoEn421+Q0y;WpWppSh03%^$IWssgVPi04W-?_sG-YFCWHVzjH)CdEIXN&lVl_E=1W|GkJ}4;wBVlDWHDWPlF=04kH#lK4Wi(=BVr4gFW-wtlIc7CDVKsdOQF#P02q0r`ZgX@1Fl8}iFgay8W@RyEHDfe0W-&B1W;iuvG&x~mWi?}De*{qmdjv5EAY*TCb94YRVlrelHZeIfIALZnGc#pkW@IxkW@ckyGBGwYW@Kf71W^Wk1TqL9V{dMAbO1SKWH2=_F*Y}3Wn^YJG+{6@H)CUAW;tSHGc`6cG=l_D23ZaOIyzT!X>?^rbzyR30Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ulWo>VAd0#PKF;{YFbY(|%VRB?HXmo9Chy)cnI!$4CL2hYtZ*+2RaCrb{VKy)^IW%KoFfcM=WHvTAW@cnLFgP`4V`MftG%;j0GGSw6WHV$oGBP$cV`ej9WH4hhFf?W~Fga#1HaIb5H#dj`6*@XYZ*6dObY)X@aBy#ObY)}!XJIxlF*!72VK6WLIWRaiW@BVFIW#e3HZoyiHDh5lFg7@0Gh{F`VrDQnVL3B1V>C2nWnyDDV=*yo1`9emM{;3sXlY|}Iyz8tZ*XODba?LIWRaiW@BVFIW#e3HZp7m3pzSSa$#_2X=8IbI#qLFXJr5_XKXHLbZu-SXJIloVmUQ8GcYkTVm2~lG%{pkGc#f~G%{skW;S6mHaL|86*@XXd30p}XJIfiIAbwlW-~KnWHC5oGG#O~V`F1tIb%04WMyPCV_{)oGBh<~Gcq$UWMyJyHDft7HZ(XiWn*JDW??xqI5#(y1Qj|uQ)q8;bO2{zFf%w~F=A#jGh}2jIAk(qG&5skV`4dDH!x&nWHV!7VKXpdVmCB5V>vitV`F4wF)?B@W;i)zHZ(M2G-NPgWR(OJIyy;ibO2{zFf%w~F=A#jGh}2jIAk(qG&5skV`4dDH!x&nWHV!7VKFv1HeohnGcz_~H!)%}He@$9Gc`10WnnQnVK`znGL-}sIyzNCd30p}XJIfiIAbwlW-~KnWHC5oGG#O~V`F1tIb%04WMyPCV_{)5Vl-l5H#Rk5H#IP1H8?XiVrFGxGBPnUV`DR8VP#>J1Qj|uRa0nha&!P^VK6f|V=-c8Gc#mlF*sy0Wi&HmV`E}DV>d8lWn?pBVPRxuWj8oAW-&7}Gc-45Ibt+7GiEtCFfchcGcsZ^Vq=vA6*@XqNp5riXJIfiIAbwlW-~KnWHC5oGG#O~V`F1tIb%04WMyPCV_{)1Vlgr~F=b?BWHvJ~G&5miFf=zXIX5veGB-3gI5lCF1Qj|uPC|KfWdLVkFf%w~F=A#jGh}2jIAk(qG&5skV`4dDH!x&nWHV!7VL4_pF*7tZW@2MyVqrFBF*r3gF*jpoIb%6uGBILhFqH%qIyz2MXm4_K0B2z^GdN>0VrDZlWMnZoWHMzmGh<_8VmV_sFl1$9Gh<<4F=IA1Ff=hRVKrqqGiGEkGcaX1Wo0sDWim20Gh;C{l>`+!I!;wWd30p}XJIfiIAbwlW-~KnWHC5oGG#O~V`F1tIb%04WMyPCV_{)9I5jvmVmL85G&N*lVK8DiH)b|7Ic765V`5@9VKO(B1Qj|uPE}KAZ*p`1XJIfiIAbwlW-~KnWHC5oGG#O~V`F1tIb%04WMyPCV_{)5FgIdiWH(|rWHvT1H8Ex~WjSJDG-EYoH90afV=*|D1Qj|uMr?0kbO2{zFf%w~F=A#jGh}2jIAk(qG&5skV`4dDH!x&nWHV!7VKOpdWiVwjVmLWvHDxnoG&eV9IXF0DV>32nGcq?aVr&KrIyy&kVQ^?^V{RC#b^04-;1E@*UZY$Io3Ff%w~F=A#jGh}2jIAk(qG&5skV`4dDH!x&nWHV!7m;@C%I#p9>Z*p`1XJIflHZwM4He@$pI5ILdIWl5nI5smgVKOl?H)A<7FgamlW@R@xHD)n0GczmW5Ghs3@GB;y6GcY+}Fk&$>IWc8qWn?xpF*Gw_V=y!~FgZ6dF)}waH#jw6Yz7NDI!AJ0aA;{`b2>UnZe(S6MsIR$VRQg3XKXHLbZu-SXJIflHZwM4He@$pI5ILdIWl5nI5smgVKOl?H)A<7Fgd*h6*@XnI8#nn@DF*!G5F=o946*@XnF*Z|9Z*pw_XJKSyV=*^3FfcVTGcYkUFlAz6F*7kaVl`$pGc+HoG&Ey2Ff}tYWi(}EW-w+nIW}ay1Qj|uQb#ybPH%E;0B2!jWMeTmH!v_YGBYqSG%#giV=*%^Ibto3tWxWIyIyzD~RZeemZ2)IsWMpG8H#aaaH8L|WF*Gn`Vq-BgF*#y2W;HW3GB`LfVL3N8VPs}DVP-WkF=a6|F=jM2Gc;jiIbkt1HDfVhWW59xIyzD@HdRhxCrGB>>h6*@XnM>thZZ*pw_XJKSyV=*^3FfcVTGcYkUFlAz6F*7kaVl`$pGc+C56G&M231Qj|uQb#d1RZeemZ2)IsWMpG8H#aaaH8L|WF*Gn`Vq-BgF*#y2W;HW3GB`LfVPi5hHDNJjWiT}|W?^MvFl9DnG&MFdWHw?mH8nV4W4#0wIyzEELP0oHPH%E;0B2!jWMeTmH!v_YGBYqSG%#giV=*%^IbtK~jV>n|qIW%HpWHU8oWjHXs1Qj|uQb#d1Q%P=g0B2!jWMeTmH!v_YGBYqSG%#giV=*%^Ibt>h6*@XnM?yg{Hd9G%bO2{zWMpG8H#aaaH8L|WF*Gn`Vq-BgF*#y2W;HW3GB`LfVKOvfVK-uBIc7C5VPs-tGh{S2Vlg%{V_{}EFflYSW4#0wIyzD~RY`7i0B2!jWMeTmH!v_YGBYqSG%#giV=*%^Ibt4F=jO~Ib$(7IASwny#y6HI#Ne5HdRS(bO2{zWMpG8H#aaaH8L|WF*Gn`Vq-BgF*#y2W;HW3GB`LfVKO*mHa0XhVq-WsH8(gnF*r9iVq`TkGBi14WHw}CGQ9*9IyzEELP0oHNp5riXJKSyV=*^3FfcVTGcYkUFlAz6F*7kaVl`$pGc+NmF)+OZ6*@XnF*ZhQZ((!*XJKSyV=*^3FfcVTGcYkUFlAz6F*7kaVl`$pGc+8@;Y;R$70B2!jWMeTmH!v_YGBYqSG%#giV=*%^Ibt9H8VCdIAt?pH)1z7W;tWM1Qj|uQb$5FGDd7~VRQgzVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF<~_@Ibtv}WHdQAWHVwmVPiQqF*Y?bH#1=}F*jy7V>rD86*@XnM?yg{Hb!i3VRQgzVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF<~|{HaRzBF)(B>HDqErWim8jW;ZrtHZo&0Gh;DgH8i~h6*@XnM?yg}GDd7~VRQgzVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF=1t5GGj0>VK_E5Wj16pH#22sVr6DGG%;diIXO9DH8Z^g6*@XZWpH$8F*X2aVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF=00|Gh{L}H#IgfG&DCbIc7CBIb$_rWMN@tGht>oIc2>B6*@XZWpH$8Gco{YVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF<~@hWHM%CFfn9gFk@sgIWaP3VKOl|Ib$?7H8f!`G-bU66*@XZWpH$8GBi_kWo~0>Y&ZaCVPs@uF*i3bFf}qWFflYRWnyD7Gch@0HD)z4G%`3iF=012F*q?~G-fqqG-5L_Vqs-wWn?yEFl1pcWMw!xG-kR4I8$_GZewX|H~=$aIAt+8F*h<{VKXr_F=I6_W-v5nVlgr{Gh{PmWjAaF3pzSSa$#_2X=8IbI#gwNbairNMsIR$VRQg3XKXHLbZu-SXJKSyV=*^3FfcVTGcYkUFlAz6F*7kaVl`$pGc+bmn04-;1E@*UZY$Io3G&wb9Gc#jkH8C(_I5RmpIWuNuVPiI9W;rx6HDWSjYz7NDI!AJ0aA;{`b2>UyWq5RTa%DzoY;2^3VP-HhIWl7~!UPpMIzv|gXJIrmGG;kqFl9G6H8eLcFgP+bWi~QnF=RG0I59CYVl-hnVP-QiFgIZ^Ha2E9VlZT7W@0g8VP<16G&wnDHf3bO1Qj|uLqk^pXJIrmGG;kqFl9G6H8eLcFgP+bWi~QnF=RG0I59CYVl-hjIb~xtWHmQ4VPa%3F*If~VP!I7GB#sjIW{t7IAdmP1`9emM{;3sXlY|}IyzTrZe(e0X8Mqy)R04-;1E@*UZY$Io3HDfn8Wiv8kIAStoVKq2rH8nY7H)Jt5Gi72mFk>+?Yz7NDI!AJ0aA;{`b2>UwVRLk4a!qe!WdJQ_Y%XYYZEPcFVP$4wG+{VqV`MO9I5{$6H8W#2G-WknH8(ggW;HlDIcx?CIyy&kVQ^?^V{LvL+xVRB^vEoW>lXmo9CBWGb|FlIMlF=k<8WjHWlV>e@EVmV|oI5}lwVq!QkV=!cF1`9emM{;3sXlY|}IyzHyWo~0>Y(ZmmX>V=-EoW>lXmo9CBWGbXV_`TrVKp;kWo9`tFg0T~IWsmiH)LctG-5C{IW;zH1`9emM{;3sXlY|}IyypZWo~3fVPkY}asVx7Y%XYYZEPcFVK!zoFf(N{V>vQoVL320V>vTnWM()rG&eXhVmUK0Fl+`3Iyy&kVQ^?^V{LTqJjWKVDaEoW>lXmo9CBWGbaWMgADI59RdWMO7xG&p22W;rxrHe)m}He@$6HDx$#1`9emM{;3sXlY|}IyzHyVP|CkEoW>lXmo9CBWGbUWHm80IX5sdV>n`BVq`WsG&W*0F*GzXH90kAV>3By1`9emM{;3sXlY|}IyysjVr52QV`Ts>XKXHLbZu-SXJIsCIXO0AIWROhWi>Q0GB`P5IAJ+8F=SyeHexbjWHi$R6*@XjZ*FA(XJKSDIWlE4Vlg*0Fl1smI5jshVK6u_V=`ejGd5u|IW}Q7VPs}GH)c39VPj@CG&M71G+{PjG-5F@H!x;1H#IcV1Qj|uR%LQ@Wq3k$W@cq_0B2!jH90b6Gh#6}H85miIXE>pF<~$`Fk>=dHZwM1GC4M3F)%bXF=jD2V`O4AVPRxqVKQc8IXO5sVr4coFfd|d(*zYdI!SJ1Wq3k$W@cq_0B2!jH90b6Gh#6}H85miIXE>pF<~$`Fk>=dHZwM1GC4M3H)At6IW;jcHZnCdW@a!nF*jv3IAS(3I5uQuGB;x|(*zYdIzw-6b97;DbV7AzW@T~!XJKSDIWlE4Vlg*0Fl1smI5jshVK6u_V=`ejGd5u|IW}QtFgau}WMngAFgRspVPa!7Vl*={HZVD6GcjZ^VK`&c1Qj|uNo`?gWkF+OWpi@?XJKSDIWlE4Vlg*0Fl1smI5jshVK6u_V=`ejGd5u|IW}QoH8(e6W@9%tW?^A9F*P({GG#I|GBY+ZF=jb9VKHXY1Qj|uRAqQ{b#i4vV`F7=a{y;yWHmW5Wiw(iH#IP1VmUZ9H!)!_I51-}VKy^1VKO;3VL4+kWjA6tIAvuwFfd|bWo9xsWn(xqIXE>oFf(OiHPZwYIyy#jVQpn%b!KK|asX#xWHmW5Wiw(iH#IP1VmUZ9H!)!_I51-}VKy^1VKO;3VKg#gVPs@EWi&Z3Ffw5?V`XM#VPR%6I5;*pVPs@DGt&eWIyymYYyf9rWHmW5Wiw(iH#IP1VmUZ9H!)!_I51-}VKy^1VKO;3VPY|3IW%KoGG=09Gi5h8W@9rjFg7`3IAkzpFflebFl+`3Iyy&kVQ^?^V{O=WFwa(O~wa&l>9a&rJJXKXHLbZu-SXJKSDIWlE4Vlg*0Fl1smI5jshVK6u_V=`ejGd5u|IX2e>6*@XnWnp9hXJIumGB-9jH!)^8Ib}05WHw|tVPrNjFlA&lWi~QlWH(_qVKHGfW;10sIc8*IIWc8qW-?|qWnpAFWHvToVq!Gc1Qj|uS8{1|WdLVkH8L_cHaIsiW;r=!Gc#m1WH@1DHZd?|WHn_rGGSylVKFf>Ib$$oG-Nb0W-??kGBGwaGGR9}FfunWGGk_DHq-<;S8{1|WdJZ?GGRD0FgQ45G%z(`GG#MnF=aDhV`E`qF*Y|cGi(M6Iyy&kVQ^?^V{L1SZOb8`SKXKXHLbZu-SXJIumGB-9jH!)^8Ib}05WHw|tVPrNjFlA&lWi~QlWH)RE3pzSSa$#_2X=8IbI!1C~ZDnG0W@cq_04-;1E@*UZY$Io3V>dA|IbvjHGB`6gG-fnpF=8-dW;9`AIW;z6H#1{pYz7NDI!AJ0aA;{`b2>UwVRLk4a#M6+bY%c7XKXHLbZu-SXJIolH)b_sVP<7xH)UlsV>LB2Ha9XbH)CdGH)J$3Wnydw3pzSSa$#_2X=8IbIz(k~bZAp_Wo~0>Y*Tb$bY%c7XKXHLbZu-SXJKPGI5A`~V>L4|VP;}BIAJw8V`MjEH8(k8GdM9hGc{}m3pzSSa$#_2X=8IbIznt^Ze&w*VRU5xEoW>lXmo9CBWGbbWimA|IWlHuH8C|fG&p25V_`KpWMnX8V`XJAFk>-n1`9emM{;3sXlY|}Iyz8kcx7x*VPk7Tb!KK|asVx7Y%XYYZEPcFVK+H9Wid5oFl8`fW;ir9V=yscHZe9cIWT25VKXo_HEae8Iyy&kVQ^?^V{Q(lXmo9CBWGbUGBGkVWjQ!EHZfylH8Ev5H8x~5IX5slF=k|CF=SlXmo9CBWGbTH#Ib5Wi&E0Wj8Q4WH(|qH)Js~H)Ak2W-u~kVqrOK1`9emM{;3sXlY|}IyzKkcyx7gWimtnEoW>lXmo9CBWGbSVP!ZuFfe2{V`DWjWim4{G&5vmHe)w8V`gSDG-fy71QtPZa$$J@H!@{rGB`OgVK-zlGh$(4I599YWHe!9W@2MzF=AshYz7NDI!AJ0aA;{`b2>UyWq5RTa%D3_04-;1E@*UZY$Io3WH(|lVl!hjHD)+AFk)dbW@R#FVly~nIb}CxWMMEcYz7NDI!AJ0aA;{`b2>Uhbz)^rVQ>H~XKXHLbZu-SXJImCV=!hpHaIwAH8o;pG&M40H8?kAVmUHoV>U23Fk|8b7C~}yVR-;GF*RmpWHK}}HezBqIb~)tFgP=0W;0@9Fk&}3GC4VH1`9emM{;3sXlY|}IyysdZgX^DZgfI*W@cq_04-;1E@*UZY$Io3Wo0)vI5A-|I5RXfVqrBhVlpsfHDNI}Gc{y4VKHVmYz7NDI!AJ0aA;{`b2>UnZe(S6LUm?lWpV&5XKXHLbZu-SXJKVFGGk;mHf3RDGdVS3Gc;p4VPiBiWMgJDWM(%vV>WCC3pzSSa$#_2X=8IbI#y+JbY*x#b!KK|asVx7Y%XYYZEPcFVKOjbGGjC|Fg7?jF*Ra1Gh#P5H8VFhG+{I_VKy~4W^4uvIyy&kVQ^?^V{R%LQ@Wq3hya$$J@EoW>lXmo9CBWGbaI5ILaH92KuWMVQjH8(IaWim4|VKZbfGc#mmV`5@#1`9emM{;3sXlY|}IyzHmVPs`;Q*>cxWdJQ_Y%XYYZEPcFVPr8kVKFsfV`ejDIXPxGVK^~mHfA?AVlg%}H#lZEIcx?CIyy&kVQ^?^V{Q)ppiWpYqyaAj<1Ze;*1XKXHLbZu-SXJI&IV=*~6VKgy0V>2>iI5{(8IAk|9Vl`wjVKgyiGc{}m3pzSSa$#_2X=8IbI#Xz2WMy(fX>Md`Zf8($X>N1?EoW>lXmo9CBWGbXV>o1EW?^M8H92HBI5RY2H(@hkHe+LAHez8jW;QZx1`9emM{;3sXlY|}IyzKoZDn!*EoW>lXmo9CBWGbaHDY2nFgP_aW-&EkH)3OBVl*^4Vl*>1G-EM1FgP}B1`9emM{;3sXlY|}Iyz8kaAj<1Ze?UtX>Db404-;1E@*UZY$Io3V`gPEI5smlFf=tWH#IY6H#0V3FgIjlW@9rsVl^``LsddgQ(r?*Qbk`!OkYhwSYJj`K}|(MRYpcdQeRRpG&nRjGh#7fH8f;0I5symLsddgQ(r?*Qbk`!OkYhwSYK2{SX5O~MPD*RUqMn*L0Ml@Nm@k!XL4_Ka9>|zZ*pZVXKXHLbZu-SXJIorH#9dmH#sz7Gc#f|Ib$+3HezNlIXN;hVl*)}HDW_mLQhj)Lr+pgUq?(|O+i>+LsddWO+ip!K~hpdSzl90T15b7a&L8TUteQya%C-NY%XYYZEPcFVPRxBV=_26V`MfmG%+}4V`VrpI5%N3FgYuuHDot7GGsC~H840gWkXd$Pg7q*Pf|r+M@(N$L0DfyPfk-*K~7X(LRCgaMN(fyOhrvaPE=n`K}|(pQ%PDy0B3SlXmo9CBWGb{W;8c7WjSLqF*i0cGB+?ZIWS^2V=!SdWHmTBGG=8%RYFfwUqeq)MPEluUrj++Uqeq$Q&d4tR9`|>Mn*+aUqwtsO+`*rUqeq-PE-JAa&L8TUteQya%C-NY%XYYZEPcFVK-$nWHmEpH92BAVrFJFWo0-xG&5l~G%;g0V`XDAFhf;BPg7q*Pf|r+M@(N$L0Df_MN(8nSYJU>QbAc?MNCCaMNU*-Lr+ysQ~+mkZ*_2AUt@1_Wi4lHE@*UZY$Io3Ib&vGV`gGuH#TB0F*9Z`H)1hlW;Qu6VKQZ6FfuVULsddgQ(r?*Qbk`!OkYhwSYK8}QdC7)UqMn*L0MlyRYpcdQeQ()RZdg@XL4_Ka9>|zZ*pZVXKXHLbZu-SXJKSxVP;}6HDqRHHDxzrF*0U1Wi>fuV`E`rV>dH4H#BSp3n0R~AV+dxaA;{`a{w)8Y%XYYZEP(M055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIVcmY;#{Sb7gF0V{~b6ZeKERY;|X8ZeKWPaBwbYbZu;E5CAW8bYX5}VRB?&b98cLVQnsGaBu)~bYX5}VRB?&UvqSFWnpb!IB0NiE@*UZZ2ANxIyzxLV|8M0b6+uEF=cLNX>Mg-F<&uNNl9&CXJsyEbZu;>1_&U+yC6kFQvfYxV{=I!1D3WgtUgZDn#{Iyz=@Wo1KQZDn#{P;7N)X>KS(bz*OGCMf`Ba%E*LV_|J&a$zlSY;|X8ZZ2qaZEPcFVP#@uHZ(P2Vl`wlIWRFdH#Re5Hexw3F*P?eGcq(YF#H5T2KfO8Ai}#KMsj6kAVXnoWpZHvW^!d^En{JAWpZIHaBOvFX>KlPbZu;q2Lvx=ZggpMc>psvHZ)~7He@(uV>D$qGdX5sGBjc}Vq!TkVPs=7VP-C9bZu--69g}3X?ksMa{yyyG+{C~WjQ%wGBGeRV`gGEIc8%uVlX)|I5B24Wi~EobZu-41t>K-I#Xk1Ze>DpX=G<*C}VGOWjZ=?WoB$;V{~b6ZaO+td2nS?WoKz~baHttAY*TGWjZ=?WoB$;V{~b6ZsLHZDF7p3Fk>)gH)CTlGB{;nV>UG~He@+uGc!0iGh$>kH#s*r0R>7k3k4_wIyz%-ZE$aHWo~qHC@BCVVP#@4HZ)^lH)A<8VK-!EGcsdiF=9DmHeq2iWMO7FHUkAp3k4_wIy!P?Y+-b1Z*FraDF7p3Ic8=tF*!9eIWsdcWMpPHIXE^jF=jM1G&y8sFg7$X1qDhA1t>8(I&5!YWJYptZANKqWhg;&b7gdMCM+OhZ*FsRAVF?Mg-F<&uLV`Xk-LUL(jXJsyEbZuMmOXmD@2-^GB9Ri4+TjTnhOyi!n+_uWny(_XJv8#Eo5b4b!TT~axHLdb!TaAE@*UZY#;?QIyyvUb7gXAVQgu7WdI{#G%{m2Gczf0rIc70AW->5gFkv@lWo9)wAO$lzIz(x6V{dk4a#VS6Wpe-{VPZKlIAvrvGhs3@GBP=2IW#h3VrF7tV>U2hHe+EiV;}`H0y;WWd2nSzY-wd~bSNnRBVlA?HeoY0VPZ64W@KeKF*P(XW;ro1V`MowVqrKiVq+8qRUid3FFHD5WMouwVQF+IVsCG3EFfcVZgX@XRC#b^CM+OCWpib6X<=+>dSxsiL}_zlZ+2yJRC#b^b148LVKXo?IWl51IWS{nG&neAGdVeAWnyD7GBz|~VPiKnGZqC^Eg%ImB04%@WMouwVQF+IVsCG3EFeT>b7gXAVQgu7Wh@{>X>((5c4cx@d2nTODF7p3FgRv2I5{vmWMw!xI5cHqVmD(sWHDniIXO5pF=1mc7zI@zAO$lGIyzxwWK?-@Whi5BZgX@XRC#b^CMf_TVKOyiH)Aw5GGj7kF)}qVHZU+aIA%09Gh=3CG-fqsHyQ<13m^qE0y;WjWMou%aAhbd03%^CVL4+kVKQZ7VKQW7WHUBpIALO9W@a)mGdD0~GBafy1yvvgGZ#8KV{dM5Wn*+GZDnn5a(OyBQ*?4=VQnTUAY*TCb94YBVKO#3F*7(gIAJh0HDP5pHf1w8IW=K9GdDOhI51&hH68_36{Qd;Lu_efZgc=cY-wd~bS`LgZEVs7055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIVlbZgXaDa&2ESaBOvFX>MOQXmD^YXmo9CNe}=pV{dJ6Z*FC7baO9ZV`Ft~b!=gDWn^DtZ*p>FV{~b6ZZ2qWZ~$RrV|8tHY+-a|WM5xnZ*p>FV{~b6ZeKWPaBwbYbZu<;0S5>=I!0-DWn>^!X>Da7Q*>o;Iyz=)cx7Z$bY*Z*Y;|X8ZYV=_VsCRMDF9|^cx7ZQb97~JEpTjgXK8LOXmo9CBWGbbI5RUbWHm50V`5}9IAb(oVPR!sGB{#5Ic7FuG&wjU1waP*0S6$$yC6nscx7ZDRB3HxAX9W@Z~$g$cx7ZQb97~JEpTjgXK8LOXmo9C`2hzAIyzHhWo~6UI&))XZe>txb!TaAC_{B(Z*wLo0CQtyZe=ZSY;|X8ZZ2qaZEPcFVKrkoH(@Y0VKHQ7Ic8!uF=S;oH)S$4VmM+rVL35oH6{f+2KfO8Ai}#KQ)6XrWdL(yWo~6HaBOvFX>KlPbZu-^696x8WpZMsi_oWny(^W@U0HV{dMAbRb4@VQpn%b!KK|aztfwV4tmF)=t{HD+ZvGc-45HaTN8HaRQ>PYZ$tEf_jFV{&C-bY)Uub97~LQ*>c;Whi5BZgX@XQeks+WpYz=VRU6gWpiUDDF7p3Vl_EtH#ajlIb%3CVq!BeF=a6_Gh=2mG+{M0IAS(9E(K2(f(0!NIy!S@bW&k+bY*f=bYXO5C{kf_bY*f=bYXO5DF7p3V`expV`DRBVm4+sG-PBsH)1n4HZwLhV=y-}H)c3BFa=Kwf(0!eIyz%=Wnpw>L}hSvXj61$ZewX|Q*>c;Whi5BZgX@XL}hSvXj61$ZewX|Q*>c;Wkh9jVAGdX56Ff?K@Wi@4HG&wLcIAky}I5#vnG-fgdPaJ{;EfYFAb7gcyWpH$8Q*>o+V`*$tbYXO5C`4s&bZAp_Wo~0>Y*Tb$bY&?3BVlA=VPrFAHeoqqGBGtcVl*&iVq{@3V>ec;Wkh9jVjIW=WtGcaamH8V3|WMno4PZfd%Eetw3b7gcwY-Mg_Q*>c;Whg>yWo~3sbYXO5DF7p3Wi&Z4GchqTIAk+0G&yBCV_{)1H8(b9Gc#f_FfchWI0a7%f(0!NIyz%=Wnpw>P-%E&Y*1liYeIEqW@U0Hb97`nI&*1yWnXkD03%^JG&nM1Wj8P~Gcsj0F)=VQWI1CqIA%CEVPrHkWHmH81y2it1uYahI%9HWVRU6vVQp}1WpXHEZ*FsRAX8y&aBO9AL}hbhCMf_TVP-fqG-G5jV`DiqIA%0vHaIq8Wj8Z9Gd5y3VKF%~WjqB>5`qOS7CJg(a%Ew3WmIK&bairNF+?b1Z*FsRAXH^|bairNF+@aVb7Lkc03%^EH)c3uH!)-|IAbw5GGjJlFf}zeVKrhmGiEhnGdE&B1y2-$1uYgjI%9HWVRU6wWq5RTa%D0^C}VGKb95k7Wq5RTa%D0^L}hbhCMf_TVKHGgF*jv1IALWmGBaT`V`eyFW;QT4H#0IaVl-i9GC&1S6oLgU8#+2;a%Ew3WmIK&bairNGDJaga$$KWV{dMAbRbk^cyx7gWimuTa&lpLL}hbhCMf_TVK-!EF=J#gG-hOGGGR0|GGb*pWMN}BIbt0F=IJ1VKy`}F=H`A1y2-$1uYahI%9HWVRU6fbz)^rVQ?s8Z*FsRAVYOxWldplL}hbhCMf_TVKX*3IAt+qFg0d1F=bvi7F)}h`GG=9CH(_HnIWRamHAn?d7lH*XAv!u^a%Ew3WkYXnb97;DbV7AzW@U0Hb97`nI&*1yWnXkGAY*TCb95kfZ)s#IEFe{LVP|D203%^yH8(UjWin+qH8El{VmLE2FgQ16GB7bYVm2{3G%z$u1y3J>1uZT*I%9HWVRU6lZe(S6LUm?lWpXHUbYwa@b7^{IUvw-WV{dMAbRc$bX=ExaAW3dyWq3w!a&2LBEFe{LVP|D203%^zVPiNjH#RacF*s&0VK_21H#9h7IAdcpWo9`wG&o{R1y3x31uYFaI&)=oNp56ictUk%W@U0HNp56ictUk%W@U0I03%^AVKO;5F=H`iGh#I|H8?b6W-&K8H!w71I5RRfW;HZU1y2it1uY>uI%9HWVRU6yWpZ?7ctUk%W@U0Hb97`nI&*1yWnXkGAY*TCb95kfZ)s#IEFe{LVP|D203%^#WH~ZnHD)(9GG%2lFlIM3Fg7t`G-EksF*G1uYmlI%9HWVRU6yWpZ?7ctLVyW4LUk=Wpq|$a&%>QL2`0oc_>z8a&%>QL2`0oc_{!RVPa-EFg7_eVmUNqV>CH7VmL8kGch(cH8^H5HDWV2I8+5s3xWkL6goO%a%Ew3Wm9NjWMy(wbYW*@C{uJ{XJsrPV{dMAbRc7BVR9-d03%^#V>2{1H8^24Fk@skH8C<}HezHkW-~BhGcY+hW-~EX1y2%!1uYsnI%9HWVRU6vXklb!a!_e-Wo&6~WhhfcxWh@|5Xklb!a#M6+XJsh>BVjONG&D11IAmdDW-~E4VL355VKQPdGGj4jGh;O}VlY?*PZ)v)EhjoUV{&C-bY)X$VPs`;P-$>wY-w&~C{t)*WMy(wbYW*@EFe>8VPs`;Q*>cxWh@|5Xklb!a#M6+XJsh>BVl7QHZe6}Vq`ZrWHDxAGd3_|Ha9RiVKrrAW?^ABF)&&MPbGo{Ee$$4V{&C-bY)X$VPs`;P-$>wY-w&~C{t)*WMy(wbYW*@DF7p3G-6|BI5uTBGGsVmG-YKrW-?_rWHn?mFf=x1G&eLjTm?@Hf(0!QIy!S@bW>et1X>MgGQ)ppiWpYqyaAj<1Ze=L|BVjc;WjQu8Wo9^KGBRXgW-?_mWoBYzVq{}vGcaW}Gd5lYPY!|wEdn|^V{&C-bY)a&ZDn#ODF7p3V_`KjW??xsWHDhdVrF7xH90adHe_KrI5cKtIAJp|Uet1X>Mg?RB3HxawsVPBVjN$V>4wiWH@6pI5J`|GBYtUH8*26W;8ZtW-w%7GG$@~Pl5$496CBbVF}!Z*nMebYwa@b7^{IUvw-WW^8X^bSxldY;R$7EFflVZ((#SAZBcDVRR_~BVjZ)Fk)jjV=^&hIX5_EWMeQlVP#`CVl_B0Fk?0~GBaicPbY!}Eg?EOV{Bz%a#Ue*XJvFlZ)|UJD06gVIy!S{dSzd9EFfuabSxlgZgealX>N2ZAZc!NDF7p3F*q|fGGaD0WM*PDWid50Wo9-oH8M3}Ib&fpW;QZoXa!Fnf(0!HIyz%)WnpqeWpH$8C}wPLVRR_~BVjc#F*IZ_WnnomFflVRFgRgmHf1q1F*#ylVlX*4H#cepPX&SnEd@F{V{Bz%a#M6=ZewX|C~0nVDF7p3W-vK0V`DivWn?pEW;io4Ff}z}F=jbqH8VD0HZ(alYz0pPf(0!aIyz)>VRuYvZe?>Qb97`nI&*1yWnXkGAaitNIy!S{dSzd9DF7p3H83_eW;rr7H#T7~VmUc8Vly;3H#9ggVmM)BGc+VRuw=X<=?>Y-MvOb97`nI&*1yWnXkGAaitNIy!S{dSzd9DF7p3G-Eh7I50LgF*7tYH#RdkV=-c5WH&N3FlJ#gH)1q2a0O2of(0!aIyz)>VRuw=X<=?>Y-MvvZe(S6Wn?IGbYwa@b7^{IUvw-Wb97`nI&*1yWnXkD03%^FWn^S#WjHo4IAJs}HZwP7VKQc6I50S2WMN@sVly#v1y2})1uZ8!I%INTcT{p|VQyz^Wphbxb97;DV`XG0b97`nI&*1yWnXkGAaitNIy!S{dSzd9EFg1qWI8%?X?kT}bSVHMVPQ39VKri9I5ROYF=j9^F*Ra0Vq!HgF=RM2Wn(!pHgp9~C4vPlCptQ0a$$E=a%o|1XKZD2Np56icx7ZsZgX^DZewL+D06gVIy!S{dSzd9EFg1qWI8%?X?kT}bSxlqbYwa@b7^{IUvwz|BVl1TG-YOEF<~%aHe+EpVKFc{WHvK5WMwimG&43ZH(_=KPbGo{EhjoUWNCA7VRU0?LvL+xb#!GYb97`nI&*1yWnXkGAaitNIy!S{dSzd9EFg1qWI8%?X?kT}bSVHMVKp^oV=*^jV>VVAc|u`wa%p99C{1N;Z*qA;VRCY5WpZ;V03%^#H#jgkF)%hTIWjS3H8eP7F*PzWH90V0Wi~i6VKOy(1y2rw1uYahI&)=oR%vB-aBp&SC~0nVEFfuabSxlgZgealX>N2W03%^DGB`IkG-NnpF=S&hV`VUAW@KbyGG;VpVK+H7He)t?1y2%!1uYahI&)=oQ)6j!b8m7eX>N2ZAZc!NEFfuabSxlgZgeRCBVjjUWo9!sW;i!7GdVFfGi5P3HfA?CWHU80H#TNBHer4RPZEL!Eebk1XJvFya&K^Da&&npP;zf@WpZ?RDF7p3VPR%8G%#d0He)t9IAl0BWivN6WivQsGBIQ`V`gDEfCWzo^9TSsI#OkBWMy(hWp-&}WdLJrVRLh1bz*OGUol@XV{dY0Uol@XXKY_FUolc;Ze(S0L}hkqV`VOAbZu-f696w`VQ_PGY-KKJaBu))Z*pZ{GHGsOY;|O1UovBLVsCR_GGlLYWnVI9Wp8a?GGk$Ib9HQGUpQ!Ra4u+cZETbUECM<@a%FR6bSNnRBVl1NGh#F`FlAyjH)An2GBsv1H)S$rH#jw8GG;S2V`PK{PLu^K4LUkwa%Ew3Whg;%V`yb`d2nS(WGMh6VKFl{HZ(CaG&N>qFf%Y>F=jP5WH&cuHeqHoGB9E@WrhV#3zP*c3OYJuWpi|LZ+R$nX>N2gGGBBl03%^$VKikjI5}owFl0AlVrDsIF)%k}VKiefIbmitH)CUn1x^T*1uPdjI$?5SXk~PHaAhcUX>N2gGGBBoAVG3tXk~PHaAiqkDF7p3F=aJjGG;SnGB-6iGBaW`HZn6ZGh{O{G-YLEH!(9}iUm#;lm#phIyzx;V`yb`d2nSYb!l#NGcsRvDIjBSZgX@1BVjQ!H8?OdGhs4jG&V6YGiEepGGR1jV`5@3GhsDmH8G3@P7ag>ED$<6XJu|>a$$67Z*C}cX>N2gGGBBlAY*TCb94YBVKihpW?^DDVKy^iVlXpgF*G$dH)CQrG-5YnH83(^HjV{O4wMBf4mvtxZ*Fv9X>M~UMQ(Iyba^QtV{dMAbO0k^IXE$5HDqLEHeoSlW@9j7VKOmdW@KSGV>U1}I506~kOfW*lm#pZIy!S{dSxgnAY*TCb94YBVP-QoVP#=9V=_50W->N4WHK^gVPs@xH8?O~V>M$oGLi*O2EhjaP;YN+0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&udV{>0IUok~)bZK;XP;YN+E@*UZY_JO!Iy!V{a%Ev;0ADd*F?48hWnpA4Xmo9C#Rm@{!n+_vc4cmKa{w)6c4cmKb1rCfZETSb055lPX>?_BE@*IY0C#d}bY*g1IB0NiE@*UZZ2trRFJW?HXk~PHaAjX@rmXmo9C@BsiiI!SGCb!>BG0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolB-aCK~RWiDuRZET+fEIK-NVQh6}03%^yHf1n1HeoX}HD+ZnG&W^4GGb;oH#jz7VK_5nWHn`I0{}WYL2_qxZDnqBa{zO6a&=>LV|8M0b6+uEF=KCXWnVF0F=bvgY1v3;nI&W}ga$$6Day>mLV{dMAbRbk=XGvrxDIjBSZgX@1BVjUQVmV?lGB{#3GGjS3GB!3iG+{X~Gh<{nWHn=CW;me*RTAX~06IEUVP{EX0CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uIY+-J0WpZCJUoli+XGvr(Xmo9CP7?$#cWG{9Z+8GPVKZhjFf=qaWH~ZpVlZMeI5cE1V`emFG-NV1WHvA^Xmo9CN)Z4rb8u{FbYF90a%E+1E@*IY0CR9`X>?y-b7OL4Wo}w&_bZKvH03%^EH!v_YVPa)AWnyMAGBRRgWj8csVqr33WjJLrVPrOW2LL)cQek-jb98cbV{~J6VsCR_F<&udZf9w3WnVF0F;Zc9V_|c2Uol@XQek;6Xmo9CCj$g8Wo~q7ba`KCZgX&DV{~tF0Aw&>V=^!>Ghs7hF*##0F=RJkVmD@HGG;I~W@2SyGcIU!ZEUOsDLOi5VQp<;03%^CGBq<{V_`UCFgQ6kGdD3YH8f;2V`DO7FfwL0GcYi$1t~f@Wq5FJb9HiM03%^$VKOi_Vm3E7F*9W_Ff(IjFgQ74GBai}H8VFkF*!Ey0RTEWRBvu&O<{0wX>Ml#b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;s7EWldplaA|I5E@*UZY-bJtFLYsIY-MvUXmD@fuuLV-a1uz#nI#YRbbY*Q)WoKz~baHtpV{dMAbRbiCb97~GQe|gpb98cfCMf_TVL4?rW@chBHDx(4G&5#5VP!ZtV`61CWivQ4GBG%0VzC8M6~_fI7dkp`aAk5~bZ>G!C}VGKb95k6d2@7SZBk`tX>)XPc_t|UBVlG@FkvubGh{h3WH~WmFkxX~H8nY7GB+|gHZwD0WHz$}QWeJqFakO{a%FR6bSNnRBVl7PGB-0aWnwunH8x@~Vlp^1V>dE4H8wJ4H8^24IA*m4QpW`_8#+2+WMn9FbYwa@b98cPZf7hYQ+acAWoWoWWNPc4#x#B6FNF>VQpn7LvL@6CZb@V*AY*TCb94YBVKioCGh<{lVq-aCG&wUiWim2jWHw?rGB{&7FgQ3jIl%=|5yu5E3OYJ-d2@7SZ75TDb97~GNn|MiBVjZ&Ff=nWF*RmnWHw@AGc{&1WH~crW@KeIH8e6}G&I8nQV7QdFbz67V{dL`X>@6CZYV=V>xWGMh6VP;`tGd3_`GB+?}Ib>oqVlrlBV>e)XPc`j&lZEVB=054;2Y;SU3a%E$5E@*IY0Ap`#Z*pH>a%E$5UpQ!Ra4u+cZEVd2GZ8vELTPSca(Po_a%o{~X?kUHC~akJZ*qA$I#YCVWnpb5DF7p3WiVnmVrFJ#Gi7BtGG$_6H)dfrHDqOBG%#Z^Ic8xr$puvp%>^?iIyz)!V{dJ6Z*yfRV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAY*TCb95kfZ)s#IDF7p3He)h5I5RXcH8VCjVKOo?WH>NpI5jglV`5`DGc__X%LP>=1pxp$Iznk~VRCs>WpZg@Y-xIBasXp&VRLh1bz*OGUol@XV{dY0Uol@XWMOn+Uol@XLTPSca(Po_a%o{~X?kUHE@*UZY`FmhFKKT8H#0XjVqs%qWI1IvGBh)0G%__}WHe(nHe@t7Wn^SIE@*UZZ218P2s%1cZ*OdKIyyvUVs&RALt$-Ya$!0;WMyJ?XG39aWpZIqY;|X8ZYV=_VsCRMDF9?;Vs&RNV_|J&a$zlWZ*OcZaBOvFX>KlPbZu-SXJI%nWi>HoVl*~kWH2#fWj16sG+{G1GBh?bGd49bW;4$PM+Vyt2Oz?`AVg(ib!Q+$VQpn{VE|-hVs&RNV_|J&a$zlWZ*OcZaBOvFX>KlPbZu--69g}Ga$#p6}I5T4~W;HiAGdW{sH8C+aG-NPjGG#P4HDobkVPa%r)deg%I&g1kZgc=6VPP_3F=jD2V>V=EG%#f`W-(%8V`gJzGGZ|>GGjDkVR;7tIyy*cbO3X7a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uKVR>U=b97%ZUol8&bS`LgZEPn41TS=NZ){?3cmOeGWiT}~FgY|gW-&1}HD)n4H8(dgGd4LlVKp>nIc6?sbZuNN;m=03%^BGBagjGh#MkH)A$tWH4l5G&wM3GBILiH8D0fGBsl51t|hLIzeP)a%FRKC@BCVVKOs0H!?RcGi5hoWil~2IW=NsG-fh6FlAz7H8?hAH`xVCb8{#u03%^JV=^{5H8e6dIbt?qH8*2pFlIP1I5}lFHDftAWi~b21xw`xDF`|`bZ=91a%pa7C@COgZ*FsR03%^$GdMYAWHC55Vq|17W-~BmGh;VpFflkbHZ^88F)?G^1xp6y1t}ytI%aZjZAnmeG$?gxZgeN2lUvw-Wb!l#NIA3%uAa!YObU0shDF7p3H(_HkGczz{H#A~qGBji~HaIdgV_{}6VP#@DHe)n2-vvt|N2gGGBBoAa!YObTcwvbSxlsX>N2gGGBBoAa!YObTcwvbSVHMVPiKkFgP$YG-fhoVPMa|b!25fixLUL(jXJsfU03%^BWoBh&F=H}hIbkzmWi@0qGB`CeG&MLdW@2MAI5=hM1xfG)CowuYY;R#?Msja$MrmwiC_!^`Wpr~UEFfcVZgX@XL2h|Lb8}^MCM+OhZ*pZiI&EcbZ*qA$I#YCVWnpb5DF7p3GdDP4G-P2lVmLTCHaIwDG-G2kWi>QnI5}lyG&eXj>;*|L@C7F|Iy!SVAc{(~%bmD-fDF7p3Vq-HnV>vlDG&N;0IAvusW@a#9HDO{lG-WYjV`DHi?gdFR@BsiiI!aSdPC{~NWM^dnV{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XN>fixLUL(jXJsyEbZu<;0S5>=I#o$JIzw-4Z*m|~Wn*+YI(2DDZDD6+P;7N)X>KS(bz*OGCMf`QX)S4OVP|D6aBOvFX>KlPbZu-SXJImBW@2PBGG=2kHZeJ3VmUWsH8e3fH#jvpH8?UkHf8YzJ_Za13LwI}AVY6#Z*m|~Wn**zX>DO=Wi4=Qb!TaAE@*UZZ1)cUFLq^ebY*xhXmD@2)?Ib||oGBjg1Gh#9^V`DTiVq-EgV)X@13kEDBIyzxwWJ7Okb!~1aLvL(#ZEi_qEFfcVZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMf_TVK!zkH#aacH!w3|W@ceEFf%kVWi@3mIb>vGH!(M1IrjxlAqxg93OYJ)b#rJ!VPk73b!l#NGcsRvDF7p3V=!efH(_HpVKiniW;r-EH!(P7GC4OnIWaadHa9t8`2|i03kEC-Iy!TAVQ@uqVRL0Db!l#NGcsRvDF7p3G&y87Vq#@xW;bSJIAt<5GhsP1GB-A3WnnUAF*Rmo`vp!23kEC~Iy!TAVQ@`vc4a7aX>N2gGGBBoAVg(ub7fRvVr*q5DF7p3VKy>kVKO&3WHw_oHZ?G0V>M$oH8El~H)J$4W@9)o{RK`H3kEC@Iy!Q1cPMpfZgev;Uvw!TV{dMAbO0k^WnwTjGcaQ^Ffce}Ff?XiWMw!vGd4A2Wj8rEIbt?r{{>DC3kEC`Iyz-;bZK;XD06gVIy!S{dSzd9DIjBSZgX@1BVji*V`FAyI5;<9W@0!qFkxY1Vlgx@WjHotGB+}2I5PnTP7wx3tFkv+V22KVG1}q9XI%98ab!~1aLvL(#ZEi_qDF7p3H#jpiHa9dhHf3UBH#THBFgRjkW@IyDG+|>iH92Ks1qMzC1qLnMa|b!25ZeKERY;|X8ZeKWPaBwbYbZu--3Is1?Wny(_XJv8#F*i45Wi&W6Gc#miVlg>3G&5v0H#lWCVq#`yV>352E@*UZY)%RUFLPsMZe?F(WNCD7asXjsH#cHpFf%nZGC471GG;e9VmV_mWHn_sH8o*0G-EDkbZu<#0RTEWRY^-_WpGewcx7x;X?kSMh60Ap`%baH88b#!TOZZ2qaZEP9_GCDeBVRT^tBVl1SIWl7~HDoztGhsJjWiw=EWH@GFGiEtCWMnolH!vCoGCDeKX>d$sc4cfsZ*^{T03%^CFfnB^VK+E7IWc5pVKZhmH)b$nGi5YlWHw?kVK!wN1~NK2cWGpFXaFN&H#a#qWiU1~W;SABFfw5@H!(IiW;Ho6H8?goW@TeE8U`{tI%s8SXJ~W)BVjjTHZ(CZW;ZcmI5RV5F*ao|He@wpW;r%7H#RsjHf0(HGCDeQX?kSx4DWHdH8VP!QnVKOvjWn?uqVlXf{VKg#jV)F<9IyysjVr5NXa6xi%VR=Mlb7KH=baHiLbYpd5Z*yNUUom5Ea%EpJUomHFUol@XLv>vQ8Vq`L9Vq-BgWjADHFf|(nRRlE#GYUF7WpZJ2WlUvebSPtQZgX@XOeQG+BVlGRHf1?wI5#+BW@TYCWM*VHWiw_mG-EL{GGQ|}IXE2#RR}c(GYUF7WpZJ2Wm0KpXmluJZ*FsRAW|kN03%^IG%zz}VmCB6V`XDEH)CZnIX5yiW;Ho8GchtZH!w9H22}_(1~VEuI%98cbYW?3b0}kPZgX@XOeQQKV{dMAbRbeDDIjBSZgX@1BVjRRV>o0uF=aJmWjQc1IA%6tIb}98Wo9`uIb$<4HZ&myRTwn}GY~pDV{dMBVQFr2Ol4+tC}VGKb95j~CMh6eZ*FsR03%^#HaRe4I5T85WH~c8V>dW3Wo0unH#s&pHZeIjH8x};22~C<1~U*kI%98cbYW?3b5dz%XmluJZ*FsRAW|kNAY*TCb94YBVP!ctW@9&HW;A3mW->W9FfwB~I5jXiVmM}HFf%z~W+ety4mAcd5IQo4EW@BYzCk9mxH3l;fIyzx=QfX&sbSPtQZgX@XQYI-NV{dMAbO0k^GG$~nVq|7BG%_<~VKZVlW??fkV`gD7H#22pH8(UeDF#&zH3l;RIyz%)WnpqCDF7p3H#RV4H8LhV{dMAbO0k^V>M$pIAvvFI5=fEGBagkV>MwmH)b$4HDow3H)AnmGX_-#Sq=a?I#q6Oa%5$4Wn@BWZDDW#V{Bn_b7OU4Z*yNUUom5Ea%EpJUomZEZEtdUUol@XRc>!`WMy(?WI}0eVQ?;JbZu-t1~N4|I#G3Ha(Pl^Y+-a|WKM5nWhiNGbSxl5VRT_sd2nS(WGoV$kGC43~VqsxqF=k;fWHts=Gd>0~2s%1tb98BKVRU6EDIjBSZgX@1BVlGVGG=BnVKy={IX7fDVKFv2Wic~mWn(d9GGZ_{H8(g0R0ci1bY&=4Z*pv8CMf_TVKOi?VKrqjIAmouFgG_hV`4ZmG-YEjW;HS}V`VX8IXVVZ20jKdB|188Wq5QbS8sA`WF{;iRAF*wWpqtpb89RhNpxj$VRUbDCMh6eZ*FsR03%^xVm320F*!6bWie(oV`5@tW-&E1F=JvhHDfYjGchnc22>+I4_Ze?r$Ic7LHGh|~qGC43cFf(K~GBr0fHezEkFkxb1H)Aq5E@*UZY$pQ*FJo_Rb8l>A05W7^Ha9RcWi(}GVmL5nW@ThHG&wS6IW}W9V>C1~F)nCyZEQjYD>^!DVRQf^VKp*2VmUK5Vr4dEGGQdQ6Fz^8YIyy{mV_|GmZ%|=!Wo~o;b98cbV{~J6VsCR_F<&udZf9w3WnVF0F-&h`VQf@yP+@XqZgehabZu-!1~&~lI%j2cLTPSfX>MmwZ)t9HC}VGKb95kMXkl_HDF7p3F=AvjI5;t5WjQl6He)b3Gd443Fk?AoWi~fvWMO7CLk3w3;0pjcI#Xz2WMy(tX>et1X>MfzV{Bn_b7OU4Z*yNUUom5Ea%EpJUomHFUol@XX>D+9Uol@XQ)ppiWpYqyaAj<1Ze=cLbZu-$1}Hi@W@&PBbV7AwYh`pvWB?;!Gc!3dH#ufGH)UgDFkxmnW@KSyV_`WpW-vK9HaBKw@BsiiI#OkBWMy(qWpii%b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;Zo2WMy(qWpijQXmo9CJq-XaVr*}3Z7yhVZ~$U#Z*Og1IB0NiE@*UZY_J9ZFLrNuWo#~JaBu*2Z+K;FUpQ!Ra4u+cZEREqD@rkAVY6#b!~1*WGMh6VP#}6V=!hmH#RV0Wn?ioFf(H@G&eV4WH@FyV>mZrGE4?dAXEk`7&VEWhg^$Y;|pJNn|V_Q+acAWonF*jvnI5sg-22BcR0{}WYPhxXra&~2Ma{yy(VRLh1bz*OGUol@XV{dY0Uol@XWn*(+F<&uHVsmA3c4cyNE@*UZY!wUyFKlUNXmoP`HfAw2Gh;Y5W@0ojH8L_aH8(e8GBq?eHfCirH!(C~E@*UZY-R>50y;WSa&Kd0b8{#u03%^DHfA<5F*G@4H#lN9V>LHsW@R{GVKz8sF)?N~H8?R=22N%MEDJh1P;zf$Wpi^VP;zf$Wpi^TCMf_TVPiNjF=1t9G%__aW-vKnV>UE3W@2VGG&y54H8C+{I9LWw31$W?3pzS)aAk5~bZ>G!C{S{5V`X!5CMGEWBVjo;F)}hVF*jvlIXN~nGBP)2IXGlAGGj7gVmL5jHaJ=aP6=iPEHyehb97;HbSPtQZgX@Xb97`nI&*Y#X>MmGEFfcVZgX@Xb97`nI(B7abZ>Gzb97`nI&*Y#X>Q_xrYQg;VP-NgG&3<_GC4G5VKF&1G+{6~WHDi7Fg0N@WMpMEG+YKwGiC-X0y;WtX>4pLDF7p3V`DHeWn^M7WH2;lFgH0lG%++eHZe3cWoBYAVr4QlUItEP1}p+PI(K1dbSNnRBVjORG&yEvIc73rIb}IFG%+$_I5K83GdN=~Vr6DyW;kF5PG$xy20A)-VQF+IX>N2TDF7p3IAl3xWoBkLHZnFhFg9d4VmLB4VPr66HZ(S6V=y&jVg^nGW(F(>Iy!T7VRCe3WGE>hV{dMAbO0k^Hf1qkH(@biWMgGEGC4CdWMyV%VKXu|H!)!}WjSUyWCl(Kl?4DgI#6)XPc`j&hZ~$~+Vr*q!GIMZYa&u*0Uvgz^VRUJ4ZeKETWoKz~baHuLIB0NiE@*UZY-|P)0y;WjVsCPEC@BCVXJKJwWH)AGV>V%AGGaM2HDNb4F*RmlWimKrVlg>1FfwQcGX+CcLQhj)O+{2vNkb?uE-onmXL4_Ka9>|zZ*pZWXmo9CBWGbSW;iorVmUBnH#9k6F*h|zZ*pZWXmo9Cat1LvI%9QgY(;KiVr*q(03%^BVlifAIAvyLWjHxyW@0sCV=yr`VP$4!IAb<2Vm4xO1~EE1V|8q7Mqy)R03%^yFfcS>GGQ|_W-?-9IbtIX5skV>mW3IX7ixG%-0jVKFpeWo0=wGC4M6GC6VvF*-VPV`+19Z*oO$VPb4$WB?;!Vl!hnWH~uEGc-0~W->J~W;i)9GC5;nIAk_4HZw6b^9TSsI#OYCbY*f=bYXO5L}hbh0CRM5bz^j6bz*OGUol@XV{dY0Uol@XXKY_FUolc)b97~LQ*>c;Wkh9jV=icPZER)^054%Ma|b!25MfzWNC6=Gd5vmGdVe9F*z}1V`5@9VK+HtG-5YlGd40eG&wOcE@*UZZ218PIyzEiZe(S0IyysPb7Ns-Wn>_8Xklb;cOY$HaC163V{&C-bY(+fb7Ns-Wn@!mVPtQ2O<{0zRAFZTa%FC0WpXWJVRK_)WMyP6b7)~?Z+9(iVQ_OTaBOvFX>KlPbZu-SXJKSzH8eFgWHdK7VPs`9H)A(tH8o~7F)?N~IW;jgV>9^y2Rb@ZWo~3;aymLgVRK_)WMyO^b7)~?Z+9SVVQ_OgI%INTcT{gfVRK_)WMyPiXklb;cTHh%b5vnx0CHt+WMy(KV_|b+VPs`wEpupLWN&vZZDDY8EpTjgXK8LOXmo9CBWGbXGh#G2FlA;oFf%nZWM*PGFk~??IW#$DGh#S0GB`2$0S5>=I#OkBWMy(XIzwS|V_{@vWFT{BVPtQ2AZ=lAb2>U>VRK_)WMyPiXklb;cTHh%b5Lw`XK8LILv>KlPbZu-SXJIiiV=yvfF*PtUVKp~6Vl!ekFg7_gF=b;lGc;s2GBS7uQ3j?64j{t2AVXnuV_{@vWFT{BVPtQ2AZ=lAa{yyub7Ns-Wn?XLXklb;cP(vUaC0qiY;|X8ZZ2qaZES!BF*-VPX?kSZ5H!?UlW@R@vVlXo`G&wRkI5;?EWMpJBVq!LAfCe!-I%8pTbY*f$WB?;!Gi5hsW-w+nFfd~`HD)(7WH>ovWM*MvG&5piHD)+sfCe!eIyzHqZ*(YUY;8I^c4cESEFfoWZ8|!3Wn(fdAZc!NDF7p3G-G2hG-5boG%#afWHn@EH)dloF=8_@IAJz3W;ii9eg;z+5CH%>I#XLV|8M0b6+uEF=cLNX>Mg-F<&uLXklb;cR_S)VRK(GUolf`Z*(qbbZu<;0S5>=I#h3OY;!s~RB~Z%b7pUHZ6HT!dTnnyI&^YjZgXaDa&1RxdTnn|Y;|X8ZYV=_VsCRMDFAeGVQzC~Z*pxdXK8wEZ!L6hZ)`1aY;|X8ZZ2qaZEPcFVKz2lH8n6aHDYFCHZnA3GB7w}HDzI8Gi7ElVqr8mFo6b22HOq@Ai}#KRB~Z%b7pUHZ6HT!dTnn2a$#KlPbZuMV1c`j&hZ~${MV1d0#kaaBwbYbZu;Z4*)N7aBp;9V_|c2WpXZPaBu)~aBp;9Ut?i&bY*g1IB0NiE@*UZY=;ITIyz=yV{~tF03%^DVKz2nWHDheV>o1CIWaS2WiT*iH#ssnGh#PoWidDK0RTEWQ)6LlWdL(@a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uLV_|G%E@*UZY<&*^FKusRWo%z!a%p5|WiDuNZ~$#@WMyn$Ut)4;WM^exIB0NiE@*UZY?=lzIyz@^X=DH+VKrnlFlIDkWHvB3Fk>`iW;SJEI5;yoH(_EkF*7+~Vwwgp0y;WYZ+K;FLvL(sX>)0BZc}JsaAhbd03%^yV>mK6Hf1wnWM(%qVPiBkG%#j3IbvZpH!w72HZ?Yi22z>^FcLaCR&RJ^Y(sBsY-w|8Z*Eg)VQ^(AL349ubUapXcx7xya%p5fDF7p3I5c82G&N#mGG=2lWn*MwVlrf9I5uWDVPrF9Ffe8?j0RE=ng%ceIy!z)0BZc}JsaAhbd03%^!Gc+|YHfCitFfcb}GdN>mH8Np2V=*-`G-fh5G-EK122z>^Fc&&HR&RJ^Y(sBsY-w|8Z*Eg)VQ^(AR&RJ^Y(sBsY-w|8Z*Eg)VQ^(8CMf_TVP-NjVrFD8FgY`3Fkv!eHfCfpV>LN2W;8QpHDWn1Vvq(>6`BSx96CByZ+K;FLvL(sX>)0BZc}JsaAhcCZ*FsRAXaa9Wo$!lY;0+BX>V>*Xkl<=CMf_TVK6ynV`5=qFfuneGBaj5H#j*oVPRorH!v|_V>UNtH2cx03%^EIW#vpG&D9gG%;jhWMMKjF)=V?HaBHvW;rr9H8?hw22wAY1~3RZI%j2cLT`9wb0{ewV{dMAbO0k^I5;pfW;bOtWo0!tW-((jWnwrtHZfslVlZShVK+EpmV>*Xkl<=0Ap-nb8};LVsCR_F<&udZf9w3WnVF0F;;JQWo$!lY;0+BX>V>*Xkl<=E@*UZY@h}uIy!S{dSw73VPi66GGaM4Gc`A4G&f~8VmL85VrDouGi5Y5WHB&iIG_e4Iyz%)WnpqlVPi2jG%`41pavy6I&g1uX>@6CZU7@;GdVRgFl9A4GdD3|I5{{uH)S$rVKruEI5aXgIW%Eopavy6I&N=rZDDKxBVlGSH!(P3GiEk7IW{z7VmC7|GG<{lV>4nmGi75jGB%(FB|17`Y+_|(ZvZ16V>vZ5HZwUhGh=3AVK!wjGh;F`IAJkmVq|1w@BsiiI!8ivW@cq_0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUol5Qb!KK|axQ3eZETSb055Q9aAhuNaBu){X>es4W;bLtG%+zTIAk$5HZWpgGBz}2F=J*iGB#miIi&_FIy!K2Wpi_7WB?;!Fk)t5VmCK4Gch(YFgRj4Ib<Fl1zAV`4TqG&VCZ!UzC5I!k4FMRsLwbO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F==mKF<&uDWqCz*Wo~pXXmo9CYz7M;!n+_;XmVv?WNB_^04;QAa%Ev;E@*UZY(`~abairNAV+m+WMu$mWnpx6a%FQaXmo9CkOu)TWO;63ZE0gJXmD@)XGV{-sCIAUXCG&4D7Wo9>IGBROiWnnfpG&o{qWHw?qWinMe1cP?mfZ~%8{Ze(wFUpQ!Ra4u+cZEX1g2M9VkR&RJ^Y;!s~c5irPY;#a-b!TaAC_{B(Z*wLo0CsP9Wo&aTaBOvFX>KlPbZu-SXJKSHIbt?pGGaJ5Wi?|lGd442V>vitG%+(cG-P5lF*d9QJO=pz2Oz?`AXaa9Wo&Z*c5irPY;!GeY;|X8ZZ2qaZEU{_054;2ZggQ|bYE>@ZfRz3Y-BEIaBu))Z*Fv9V{~6%ZDDR{W^Zg{UpQ!Ra4u+cZEU{_1TS-FVQ^)005mpZHeobjGchnRHaR#kGB7kXW-vKoVKy-{HDO^hHZEv%ZEQ{x1TSfAVP|CkWM*M9I5}lEVKQbpHa253Fkv<_H8W;qG-WV1IbvaCE@*UZY_G!Jt$*uZgX@XLUm(nWpqhoCMh6eZ*FsR03%^JFk&z?V_`QmGcYh@Vq`ZpF*PtTW;Qc5F=R3^H#ao223i%G2mm@dLUm(nWpqho0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolc;Ze(S0O=WXvP;YN+Uol@XLUm(nWpqhoE@*UZY{>>I0y;WXWN=e&V{2t}C@BCVVPi03H#uTvG%+zSFkv$|Wn(yHVq!C5VK-zmVK6i|W48uP$p$L|Iy!z;WN=e&V{2t}C@BCVVKz53FfuqYH8(RgGc-9iIW{meW;r-xV>e`DWi~iCFu4Xz$p$MDIyzNka8qw%Yh`pOV{dMAbRbn^a8qw%Yh`pMDF7p3GBq+WW-&BlHe@k2G&5r}H#KE9V`F1BIWS~lGGt2{kI5K23Gh{YmWMwloV>MwmHa9jfy#`GX$p$MRIyz!$Ze%ERX>N2eHeYlsAY*TCb95jb8{vsAY*TCb94YBVPiFAG&wglIc7FyHZx&nFgY?fHDoblFk&=gWiw?tGrtB+9?1qP0y;W%ZenR}WGE>BBVlDTW->T5W@BPFG&p8tIW#vpF)(5{V>B^0VrDZkGdRHpP00o;J32aZWo~3BV{dMAbRc$bX=ExaAaitNIy!S{dSzd9EFfcVZgX@XL1bidWpi^TEFg7hZgep=;((?pAY*TCb94YBVKq2rWMVWkV>V(nVKz5mHexYlWn(flG-Y9BH)b_uVZ#PZImreqGCDePWn*P&c4a7bZ)s#IEFg1qWI8%?X?kT}bSxlqbYwa@b7^{IUvwrcAVFkga%FRKCMh6eZ*FsR03%^CWin$jW??sEW;J6uG&eD1F*If~WH4nmWMgDzW;JBR22C)@1}g?SI&)=oLTqniYiVw0C}MAKY$*UEVKFs1GBPt}I5}fwGi5e7W->KmW-&QoWH>P}FfnCjW5)(f1h5MLIy!D;bUHd!WN=e&V{2t}0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&umWprOLUoll=a8qw%Yh`pUXmo9C@r2BVlAVVPrEkG&p58GGk>iI5A>5W;iu5WM(usIb>vFIWgo0EIK-4Z*6dIZe?zC03%^yF<~%cF=AveIbt(nVmM?pH)S(4F)%P;IWRb3H!x-71}r){a%F5`bZKvH03%^DIb&gFVKgu?W;8QlF*aglW@9xrWMX15GcYzZFgP~k1}p_SI&EQVWkqguX>@rgX>N2W03%^EI5}c4Wi~lCHa9aeG-NYnIWsaeWHx3qGcaaiIWjiR22KOy1}qUeI&EQVWmjo*XhUypaBps9ZgeO_VRT_sd2nS(WGonW->7{GGb;jWM(pE(gscsRWhi5BZgX@XRC#b^b0#bxV{dMAbRctdWI8%_Wn*-2ay(IWWpa5`WpZskCM+OxbY$XyrYQg;VKFu_H#a$DF=03`V>xDHGh;PmF=I6{F=jV6VrDTjIoJkHGvo#=Ejl`MZ&P$~X>MmIV{dMAbRblDaAk8QEFfcVZgX@Xb97`nI(B7abZ>GzQFUcG}W@TkEHZx&2F)}n`V>e?lHextoVlrYm+y+ht1}r8zI%98baA9&~C}VGKb95k7d2nTOCM+OhZ*FsRAW?N?a(Pr`a&0ClAY*TCb94YBVPP|2F*!6eVPY~gHDxh2G&471He+I8Gd471Ib>!qFyaPIBtH)TRAq8)0CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uJb!BpSRAq8)E@*UZY$6i?FK%ySWiN7NY+-a|WG-lMZ~$^;Y+-a|WM4RFaBwbYbZu;q2LLa3Z*pv8E@*IY0C#V4Y-C?JXmD^YXmo9CcMbqAbYWs_WiDuNZ~${~VRCb2Ute-%Y+-b1Z*E^QbYWs_WnVaGaBwbYbZu<+4*)N4Z*OcaXmD@Ma|b!25CBpFf}e{bZu--696w^b!2I8FJf|OWM^eAXmD@LV|8M0b6+uEF=KCXWnVF0F==mKF<&uFZ*_BJLUnX>Z*E0)Wo~pXXmo9C6$}I~b7)~?WpV&AGiGCBWi~lxV`DO5Gi769GGu09H#IgnGGt{oFgY|XXmo9C^9D2mIyz@%bX0k8Whf~CBVjc%G&eIjFk)jhVKZbmW??WeF=jDhVrDTgWjHx9Fl6xtR^ST&IyzHmVPs`;Q*>cxWdLJrVRLh1bz*OGUol@XV{dY0Uol@XXKY_FUomNIaBN>OUolf?VPs`;Q*>cxWiDuRZEO+@1YdGtb97~LX?kUH0An;`HD)zsHaIY3WH&H4G+{U~WH2{mV`XGwV`X76FfM3xZEXDpEgL#IWo~tCWpZJ3Wkh9mX=7z`D06gVIy!b`V{~tFJacqpIy!T7a%pa7J|-yuBVlA>G&N&oHZx&kGGaMqVrDsEIbt$2IASn4G&N#nGBx!EPZ|9NEh0KPV{&C-bY(iWidB5WMeWhW;r)7GGQ|@GBY+YHunZkApHg{6*@X&a%Ew3WkPjkW@U0HV{dMAbRc$bX=ExaAaiMYWnXkD03%^zIW#miFlJ;jHDqEqIWsdcV`gP$GB;*qFg9a3G+{CM22T_H1}y?QI%9HWVRU6EDF7p3V>4noVq-QnV`eooH#0FbV>vJ}HexX|Ff%Y=Wo2Y!`vyUVsZggdMbS`LgZEXJp054&3V`yb`d2nT4XL4b1Xf9}QZ~$R)V`yb`d2nT4UuSY*aA;pRXmD^YXmo9C0|zELI&^YjZgXaDa%})3VK`%DI5amhW;QiqVK+8qIAvoqVmLK9H#s;nI5;z5WdjE$Iy!7`V_|GTK|(?RBVjURGh$<7IAt_6GGsV8WMN`5G&wjiIbtw1Vqs=wHZcPSCOSHIZ*pv8K|w-703%^FVK6l?HZw9aVr4O6Wj1DHGc{vmVP$1FF=l3CWic=V2PQf?ZDDd}X>I@`VP-HlFg7qbIAb?rGBGeRW;kRsHf1z8V>CEnGBGnSWAFh0IyysdY;0*{WpV&>baHiLbYpd5Z*yNUUomBFXK8L_Uol@XLvL(sX=G(`E@*UZY{dr;Ai}#KL349ubaMbLVRLh3baO6fbZu;52Q&gYI!0+_Y-Dp(a$#w7C@BCVVP-gCH8nFaIc7LGHa0amFf(R3Wn*SHG&W{AH83|hH3bJ&VFxr1Iyy#aWo%?~RB~ZybSOq?Wo%?~RB~ZybS5S#03%^GHaIyrGG#F|Wo9ujVl`zpG-WVmH)b+1VlZVlIX7Vk2UZPX2Q(%+I$>mFMrmbiWGG{AZgX@XRC#b^CM+OxbYwa@b98cPZf7hYL1bidWpi^+W-2KFBVjUPIbmgEV>e_pVK6mhG&DIkV`VU6Gchq{W;Hi4VKE5@RwQ8uG$}edcWHEJMrmbiWGG{AZgX@XRC#b^CM+OxbYwa@b98cPZf7hYL1bidWpi^+W-2KlCMEzQVK-(oVmUctGdMLkVrFDGVlXo}W-w!BW;SAEH8e0dH46t;Ct(LP6*@X$WMoEZWo%?9b97`nI&*Y#X>MmMAVwfhIyx#T03%^HV>mN5I5RakHaKE7V_{-sGh{V6H#TK3G&wgiH)b#m2UZhd2Q(NuI(KPwXhvyeY-A{NbYwa@b98cPZf7hYMj%f*Iw~n3CMEzQVKp&jI5{ygH#aabIA$|tH8NsmGGjM6Wo0sBG&wS1HxCC^7GVc88ag^=X=Q9=C}VGKb95kcbYwa@b98cPZf7PbAY*TCb94YBVK+21GG;MkIbvcqHa9b3HeqBrH#j#jVPs}zGiGFEV-W{d7-0uA2s%1qWoKz_C@COgZ*FsR03%^JW;J0rWo9`xFfw9eW;Zi3I5IY2WieqmFf=h@WI1IM2UZ4Q2Q&yeI&*1yWhf~iV{dMAbO0k^Gi75rF=A#gVP-dFVqs!1Wo9*FH)dvLF=aJjV>vN26$e%ZVFxq~Iy!b~Wp^lcZ)s#IDIjBSZgX@1BVjQzG-Y9AG-5JgWHn`EG-NVkHDfbmH)JwoG%++YWMUTwRtsSVG!r^Hc4=jIC}VGKb95kfZ)s#IDIjBSZgX@1BVjNwWjSVJFk&(>VPR!9G&DJ4GcqtZW@b4vW;J0nH#ZpvRuN$bG!r^HXJvFKV{dMAbRc$bX=ExXAY*TCb94YBVPb8}B-Dk%UXVKzBrIWl20GdE!~HZ){8VK!njWjSItIXO9EFfe5}FdYY0Bw+_M2s%1+d2nSYDIjBSZgX@1BVl7K}$2UZ4Q2Q&yeI&NinbSNnxV{dMAbO0k^VPh~kH#9IeV`eZjVKOsgGiGLCGc{v0H)doxWi~NnBL`LnVFxr0Iyy;oWpZJ3Z*nMOZ*FsRAVz6rY-B1a03%^zI5=T3GBhw_IWuK6HaRh3HZVD4WHnGhC@COgZ*FsR03%^#WjQfnGiG8kHe_KjGGR0{VPs`BGi7BpFgYn|uIb&lj2UcMRG#ffPR%vB-C}VGKb95j^X=Q9=b5wF+X>=wmAa-wQWGX2DBVjpVIbt(0Gh$?AGBY+~H8Nr`GdVdkIWsb2HZnP8W@Il1RvBRjG!!~IXJvFKV{dMAbRb4)Wo%?7DIjBSZgX@1BVl1UH#KB5G&Ev4VKruBHZm|}V`F1EGGsG0VmUN9Fk>+XRuW+cG#WZOXJvFKV{dMAbRctdWI8%?baH8KXC^5iV{dMAbO0k^Vly@|I5jghW-~H2V`DHjV=`oAF*i6jHDow6G&5ylGY3`}VFxq_Iyz!yXK8LIDIjBSZgX@1BVjpaHDNeqW;r%6GGb$9H#0IgGB#mlF=03`G%;diIb{=wmAY*TCb95kfZ)s#IDF7p3GGa6^GBG(aV`epCGcjUhWHMwiIXE#gH8wP3W;ilpIR{oBVFxr6Iyz@%bSPtQZgX@XMrmbiWF{#fV{dMAbO0k^IWRG0He@qoGi5bmWjSLtFgIm2GcYkUV`VZqIWst7I|o)0VFxrCIyz@%bSPtQZgX@Xb97`nI&*Y#X>MmGDIjBSZgX@1BVjmXVK8GjGB{#3Vlg!}Gi7EnGB7nXIAdaDGB;y3IAuKtRv2LiGzdC6Vr6G(ZYU`rV{dMAbO0k^Ic7CsIAvxzHZU?`V`euqGB`3eVP!F4I50FZVq`gG69-lXUk5e_AY*TCb94YSWHe=AHZo;lIAmooG&ndnHaTTxIAvisV=^&0IWb~42UZ4Q2Q(WxI!Sb8a$$6DawubOZgX@XR%vB-CM+OhZ*FsRAVz6rY-B1a03%^CVPrBiIbvlrI5K54Vly%@G-GBpFgIjkG&3<|GcjgE2UZzj2Q(2nI!Sb8a$$6DawubOZgX@XNpxj$VRUbDCMf_TVKO;oH)LTnGc#d0V>dBjG-EI{Vl-hlVPQ8hGiEn1Vnqj54`By17dkp`aAk5~bZ>G!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^BH#ayqWi~ZpGB_|bGGsDgWH>l7IW;vkGG#I|Vl-n%2UZnf2Q(KtI&W}ga$$6Dav?n^V{dMAbRbD|WpZJ3Z*nFnAY*TCb94YBVKFo|IAUaGIX7lCF*jsnWjJOxF)%VQVlp{lH8Eo`Vo3*96=4T72s%1%aAk5~bZ>GhC@COgZ*FsR03%^HIAt<2VKg)`Ght+5H!)^nW@a}uWHUB3WjA9rGiGB;2UZ4Q2Q&yeI&W}ga$$6DaxFe6DIjBSZgX@1BVji=GGsF`HDh5nWH4nlI5{?CGcq$|W@0#FHDoY0IAu)-Rt8}QGy*z0Z*XODVRUbDD=R1|03%^GFfw8?F*jsmH8*2rHZWu~Wn(omG%;Z_V>n|uIb&lj2UcMRG$1-UNpxj$VRUbDC}VGKb95j>Z*FsRR%vB-CM+OhZ*FsRAVz6rY-B1a03%^!W@9)oHZ?b4IXPxGW;SLrHaIpkGG$^iW-?(jHZo&T2UZ?o2Q(2nI!Sb8a$$6DawubOZgX@XNpxj$VRUbDCMf_TVKO;oH)LTnGc#d0V>dBjG-EI{Vl-hlVPQ8hGiEn1Vnqj54`By17dkp`aAk5~bZ>G!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^BH#ayqWi~ZpGB_|bGGsDgWH>l7IW;vkGG#I|Vl-n%2UZnf2Q(KtI&W}ga$$6Dav?n^V{dMAbRbD|WpZJ3Z*nFnAY*TCb94YBVKFo|IAUaGIX7lCF*jsnWjJOxF)%VQVlp{lH8Eo`Vo3*96=4T72s%1%aAk5~bZ>GhC@COgZ*FsR03%^HIAt<2VKg)`Ght+5H!)^nW@a}uWHUB3WjA9rGiGB;2UZ4Q2Q&yeI&W}ga$$6DaxFe6DIjBSZgX@1BVji=GGsF`HDh5nWH4nlI5{?CGcq$|W@0#FHDoY0IAu)-Rt8}QGy*z0Z*XODVRUbDD=R1|03%^GFfw8?F*jsmH8*2rHZWu~Wn(omG%;Z_V>n|uIb&lj2UcMRGy*z0Wo~3BDF7p3Wiw+rWi~M|W-v7{I5=ZDFk@wAFk&}kVL3KoWHvK3Uk6tB0RTEWMrmbiWOGz@aAa%E+1Iy!T3Y-w~;V{&C>Zd74s0CHt+WMy(Kb8u{FbS-mZa%E+1EpTjgXK8LOXmo9CBWGbTI5}fxVmUT2H8wOeH#B8oV>C54IWjphGB`9cH)Ue^0S5>=I#OkBWMy(XI#Y0LX>@aAa%E+1Iy!T3Y-w~;V{&C>ZcuD>XK8LILv>KlPbZu-SXJIljHZ^5AHDxq2H#RjfWnwmCH#aagF*0FhVq!2gF)(8XNd~3}4j{t2AX9K`X>@aAa%E+10CR9`X>=`fV{&C>ZY^+Zb!TaAE@*UZZ14sEFK}#iXK8LOXmD@Ma|b!25MOQXmD^YXmo9CYX?s{I!$4CX>E0F0AV;YGBIU0Ib$+6IAvosF)(H}Gd4FhV=y!@H90gmIWlVpPdYkHb!>ELaBO)1VP!HkH#0XjWH~W2W;0?nGhVnVhIyy~hcu;b0aAk6Ic>p6}Wi~W9FgG?cG&VUgVmDMDgO=)-lV=yu{GcYzbV`MZpHZf&3F=b*oW@KeyF*Z3hGG;X~@BsiiI#6hNb7^C9O<{Cpa%o{~0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolWMrU(uo!n+_%Wpii%ZDn(4EpTjgXK8LOXmo9Cs09EuV_|c2C{cA~a(O&OZggpMc`P7fZ*FsRAWUy#VQf@yS8sA`WF{;iV{dMAbRa@+ctdY&Y~p~XDF9<^VRLh1bz*OGUol@XWo~C_Ze?FFUolc)d1GO7bS`LgZEPc9FfuV^W-~ElG&eIbH#IO}Vq|4xVqq|4H)Jw7G%{s1bq7W>c?To~Iyz=)a%Ct|VRU=b94Y>Y+-YAV|8M0b6+uEF=cLNX>Mg-F<&uKVR>U=b963fbZu;Y2QNB0b#rBNS8sA`WB?;!HZ){1Gi5k2GB##mH!xyiW?^MzIb}FBFlI1eWMMHgeg`i)I%HvVVN`i=Wpe-{VP$1zVqs!3WMerpF*i9fWMX7AI5RgjI5#sjG&L|VGkymz8#+2^ZggdGb7f<6b0}kPZgX@XQ+acAWoW<4*)@9V`X!50CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uLd2@7SZ9!vWWpi^bXmo9CXb=D|b97;DWMOh-Utw}%XlZt3E@*IY0CRLIWn**zIXGfuFgQ0dV>mZBWHx4DGGsVmHa252F*h_gG&f=~E@*UZY=s9hH99(VaAaY0WhirWWI8%?X?kT}bSxlqbYwa@b7^{IUvw-Wb97`nI&*1yWnXkGAaitNIy!S{dS&8(rYQg;VKZf9H#B2oV=*&jFgP+{VL3ErGc;o`GGa6}Ff}nXW`PG(Gld5-0y;WpWo~71VRU6pX>e^}aC0ar03%^HH8^82G&E*0Ffe5>V=*u{H#K8nI5#vkF*s&0Ib~&o2UOq-06IEUWq5RTa%D3_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F;r!EbairNGej^!IVPt7_a{wb@H#j*qF=1k2IXGrGG&wjmF*If}F*RglVl`o6Gcsa1j|VF{I&5WbXLM))BVlGSF<~`fGGQ}gI5svpH#K8qH!?C~IXE*lW@TeHHf4_oD+f9{b8u*7a%CuHY;R$7DF7p3He@t3Ffd^-F=aV6Ha0gjW;i!BV>325I5T2qW@IvDi3d#uj|VFVIyz`&X=iA3C@COgZ*FsR03%^HH(_NrWHw?qG&MIcGGRAnH)1hmFfd^^I5amhVl`rm2TcZ#2P+6VI$>dAVkjvfV{dMAbO0k^V>D)BVPa)8Hf3cwW;Zo6WMVd9Ha284GB!3fGG;VljR#Ez#|Z#BIzwS_b9HQG0CRM5bz^j6bz*OGUol@XV{dY0Uol@XXJv0~Uol@XLt$`pb!=rWXmo9Cxd8+(Wn*&yVm4%9VL3T4VmLWAV=`kfV>L4|GBz|aH)S+rIX5_DE@*UZY@7!&Iy!V=a%W|903%^GGiEV4GcYzXVKq27V`elkWim23GBRXiWM(-rW@9s)2QoT3Xk>B#BVjf*HeoqAH!x*4GBq?cIb=06H#ayoVPR!8W;Zf9G&YV%9VmUc7GcjUhWnwomVVnmtIy!J^V{2t{03%^!GG$^kGcYnUG&o~9HZ(M2W->K2GiEYlW;A7HWo9;<2QoT3WMy!4XaFN&G&VV7Hf1(BFgId2He)n4H#st6H)S+6VPrOBH(@w9lLs_XVRLk4a%p;HasXs9WiVuAWo9xrWn^YDH#KH4H)J_9H8nUgV`5}sW@4NNGCDeQb75})BVjo+V>vc9I50ObW->5hVq-ToF=JymWi~Z8W-($oV_}>JGCDeRZ*FBxVQ_G1Zf5`^VK!khW??a6Ib||7IW%TsVK6f{GcjZ{Ib||5F=k;mHk=1CIyz)!W@U16Wn@!mVPt7;X8?O#a%E+103%^DG&4A3Wo9`wGh#M3Ibt(pH#9RhW;ruvF)?8`I5}aQ2QoT3Vr*}3Z2%)-GhsC~VKz5mWo9uoWMnjAH#jsnFl1&qV>dG~Wnnlp%?Bk!WoBV@Y;EVE@*UZZ1@NOFLQKqX>MmMn8E@*UZZ14d9Iyy~Zb8`T5baHiLbYpd5Z*yNUUomBFXK8L_Uol@XO<{9$E@*UZY@`PyIyzxvbZK^F03%^FVr4ctVlrZ7Vr4fnHZWu`He)k0H)Jz5G%`0ZHZftO2P8T=aB^>IWn*+{Z*Bl1VP-isV>K{iF)=waVq-aBV`DjCIWsskIWsV2IWl53Vx$KoIy!nzWnppvBVl4TGBRRgF*P(~V>D$rI5II}GB`ImH)3REWMwuoG%}LV|8M0b6+uEF=cLNX>Mg-F<&u5VQpn{VJ>KNZEPJ9055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIC{ZWMy(+GIVclWnW)yVQ_G1Zf9RIaBOvFX>MOQXmD^YXmo9C@BsiiI!te2WKv~rWMy(zZ+K;Fa{zO6a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uEZ((FoWo~3;a#nA6Wo&aUXmo9C5)1$@b7)~?Z+Bl|bZlXBE@*IY0CQ+zWN&w0Utx4?VRK(NXmD^YXmo9Css}GRI&^PvPiAIwWpn@|VP-QmIXE;lWjJGDVmC2iI5jXgFgY?YVq!UFGh{MjG^z(LIyz!+baZcRPiAIwWpn@|VPP<1I5jb0H#Re7H!?RkV`OGHGB7b>H#1>0W@9pAWbgq1IyzNJR%LQ@X=7n*Q*?4=bYo}$b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;z)cWpZ?BV_|GlbaG{MV`wgDbZu;Z4+Ae`X>w&_bZKvHVQgPxVRLk4axQ3aZ~$dvbZKvHVQgPtV_|c2WpZCQXmD^YXmo9C6$}I~bYXI5Wpn^#GB_|WFg7wYIXPrEFgRvrGd5!}IAS?4WiT*dG-fa^Xmo9CISv3XaBOvFX>KlPaBu*0Z*OdKUov!Mb8}^KVRUbEUovxYV_!0KWpi_7a$$6Db6+xPZE$aLbY*g1GH`5lXK8LmXm4k7VQ^?^V=icLZ~$*|bZBp9a$#_2X=7hFXmD^YXmo9CFAWhO!n+_%Wpr|BV{-s4ZDn+FX=8IPXmo9C!3QZiI!$47YXBo*Gh;PnIA$?oV>2{1HZwP5W;tSIWH4kgGGSpjGh;b1!3QZiI%#fXWq1H1VP#}uV>LBoG+{VnVm4%BW-v81Wo0#EVl^`}WH~rBV!;O~Iyz@%Ze?;|bZKvH03%^JI5;vlVm3E2V`VjAFgP@rgDF7p3WHn+rV_{@7G-5I_IW{pgH#9jgF=RGkV=`elV=!bivj@rgb!l#NGcsRvEFg7hZgev;Uvwz|BVjo;GB9IdGGQ<{W-u``F*ag1H)1w3Gi5n7VKz23IAyg5OA^5cDGxe2MQ(Iyba^OaZ*FsRAVqF;X>@reDF7p3VL3NAV>viBHexn1Gc#dgIAvyHIb&ruWn*J9W-~ctw+BlN!3QZ1Iy!G~WpZJ3Z*n~-V{dMAbRb1;bZK;XCMf_TVPrBkVPrQsH(@YgWHK^1G-Y99FgG?gF*9RiVm4!9HMs{%4Z#N~6*@X^aAk5~bZ>G!Jt$*uZgX@XMQ(Iyba^HzAY*TCb94YBVK_23G%_Mx6Gcq(dFk~|`H@gQ*6Tt^56*@X^aAk5~bZ>GYJt$*uZgX@XMQ(Iyba^HzAY*TCb94YBVK`-CHaKQwGd5*mG-5e8VK8E2H#IjlWi>f4IAmioIK2l;6Tt^52s%1xb53<^Y$z!pV{dMAbO0k^VK8PeGBh+aVlXi_GBq?}GBGt_GGsJmGBY${HDh8izXwYOXafK`Iz?`DX>@r2b98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUok~)bZK;XE@*UZY$6i?FK%ySWiMfJV`yb`d2nSeXmD@G1EpuaKZe=ZHWNCD7axHLdb!TaAE@*UZZ1fKRFLiZkWG-lMZ~%36X=GnGXmD^YXmo9C%?BzvI&*1yWdI{#Fg0OgHa9jnH85r{Vq`KoIb<+3Ght>pF=S#eGhs1g%?BzvI%aZVZDnG0W@cq_03%^IWMMZkGB;#1H8U_cIAmloFlIAmVq!EmV=*`|HfCha2P!%`V{Bz%a%E%yBVjW%Gcq(ZIX5sgIc8*IGBYw{Gc+|}W-v52WM(ioVP^0F06IESWo~3;a#Ue*XJvE%b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;Zo2WMy(xVRC0>bS`LgZEX1g2M9VkQe|#rWpX+?M=e5iW@cq_AW~s-bY*gBdS!AtI%h(4W@cq_Qeks+WpZhHWpYq#b!TaAC_{B(Z*wLo0CHt+WMy(KXDwoNW@cq_EplOVbY*gBdS!AgaBOvFX>KlPbZu-SXJKJuGh;PlGBRQ`W;r%yGBjjjHfA|yIb=68V`eZmWMj?;PzFH=7a&q$b97~LX?kUH0CHh-bY*gBdS!AgaBOvFX>KlPbZumFD06gVIy!T7a%pa7DF7p3V>dTqVPR%BVKp^3WHmTpF*h`3Gc#g0Wi(_rV=*@})dx!pfBH#K22H(@blIW}ZCGGs9|IN1kF1?2}R4mvt?VP_~*VP{EXEFe^2XGvr!03%^yV`MiuWo9>JH8nXnV>x6vGcz${G&p8vFfwChGi71h2TKg)2PqCZI&X4hWpXG~VP{EXEFe^2XGvr!03%^yG&MLhGh$+4V`ed8V=-YiWn(gAW@I%mVq;}8IWS}02TKg)2PqUfI&W@lc}Zp{RAFaHWGo;7`VKp*hWHDnhV=^@}VP@Y4OA_S=DHJ+7a%FI3VRTn$X>4UERAFaHWGo;hV{dMAbO0k^F*7h^H(_QrHaIykGBY0IUolW@VQy|^axQ3eZEO_`1TS-QVQ&CAWjJOxWiw@CI5aV2IXGrCIAt5H!x&3F)?CfGGk_9Vlrc7V(ZboTrbY*e?BVl7>VK6W@Wn^YIF)}zXGiEhpIWjqBVKFi=WnwpGIAZVzEjl`FVP{5ZY;356H90mlV>MwjWHmWCG%#glVq|47IXN@%2Q4}}ZE0|AVQ@xiY;V(pF=H?^HezNtGGa1gGh${rFk)oz2Q4}}ZDDvpZfSFGbaHQSc>p6}GBz@1W;HM{W;QZ4WMwinVl`zkF<~@hVmW0sHDWYk^9TSsI#Xe7aBO9AL}hbh0CRM5bz^j6bz*OGUol@XV{dY0Uol@XXKY_FUolf*ZE$R5aztfwV=icPZEWxX06IEUZ*p;UWdL(@a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uMZ*p;UWiDuRZER`~055HCc4aPTaBu)^Z+2y0IB0NiE@*UZY|aG$FJpCbb8m7kXmD@KS(bz*OGCMf`8Z)|L7WMy(KXK8wEZ*whlZ*OcZaBOvFX>KlPbZu-SXJIinV`e!xVl^={WiVklIWsdiVKy={W;kPHG%;l|VPW+LN(S2w2Oz?`AVY6#Y-wa=av(=(dTnoW0Ap`#Y-wa=axG_RdTnoWEp%^hY%OqXb!TaAE@*UZY!C=00y;WLZg6#UL3n9%C@BCVVKy;jH8^H9GB##5FgG$cF=RF|Gh<>lVK+E8H8(gkVfY6~5C|qUIyy;iaCLM+cxiJeb97`nI(B7abZ>GzNp5g;bVF}#Vrgz+bZKvHJ}e+}bYwa@c4cF9Z*n|IZg6#U;((?p03%^!H#9aiWMVO5FgZ0bVL31`Ff=w}G+|*hVlz27Vl`#@2S_sl2q_34V{dMAbO1LqI5jmkVPQBpVK+BrWid5kGG=3CG%_|bGdMRhWc&w61_THw2q0r`ZgX@1H8(Y7HfAy~GGRD0W;SCsWH&Q5IWl8nVKroBWin$p{s%|~1_&t#AY*TCb94YQG&wk7H8L?aW;J0jGC5;nHaRdgH8o{5IAk_AIWzzWNCprHCIUJ-aBp*IbZK^FC@BCVVKO#mVr4dCF*G)2Ic8!qGh<{mI5lKqIc8&HGGRAkGy(`n5C|p$Iy!D;XJK?{c4a6j03%^CF=AsgFgG(bWMeltVmV|mG%+fuWMeZnGBz?eH3$eu1`r4)2Rb@-VQh6}C}wPLVRR_~BVjl-VlZMhW-?(gV>e+nWnp7AH#0RkH)LXCW;Qo4Ff|GYNCglGCI~t@WMyGwdT(xJC@COgZ*FsR03%^zHZU32oVq`F8IW{;qVPr852uKA<0UbejX>$NUcxiJkXmo9C`2hzAIyyvUW?^+~baOg7a%FC0WpYGiW?^+~baPN_b!TaAC_{B(Z*wLo0CHt+WMy(KWMyVyb!>EVEpTjgXK8LOXmo9CBWGbYGcaOfWHMqhG&eUjWi>E1Vq-F6Ffm~`H90XbWn(ZA2t@|@0S6$$yC6hmW?^+~baMc5Wo~3;axG+KW?^+~baO3mY;|X8ZZ2qaZERT%06IEGb#7yHX>V=-V{Bn_b7OU4Z*yNUUom5Ea%EpJUomZEZEtdUUol@XMs;pubZKvHE@*UZZ218PIyymfb7gdMIyymfb7gc*WprUuWnp9hVRLh3baO3mY;|X8ZZ2qaZEPcFVK-tqGh{bqFk@pmVKFx_H8?prWi>Z9WH&c3Wnp76Hu(VuIyymfb7gdMIyymfb7gc*WprUza%psB0AX`;Wpr~baBOvFX>KlPbZu-SXJIllI5T5mGdMRlHaB82Vqs-BH#0S4Gh$(5Gh;C`IAZw$2Rb@Ib8}^Mb2>Ufb8}^MQe|Oe0AX`;Wpr~baBOvFX>KlPbZu-SXJKPyV_`C4IAmovWH2#gIWaV5H)J_uWi@7IW@I!lVKw;y2Rb@Ib8}^Mb2>Ufb8}^MS8{1|WdLDwb7gdMEpTjgXK8LOXmo9CBWGbVVr6DxG&wOcWH~itFgZ74IXGftHZnJ1IAu3uW;r+c0S5>=Ize-DWpr~oI$?8jWpr~;Y;|X8ZYV=_VsCRMDF9(}b7gdMEpTjgXK8LOXmo9CBWGbXG%z+WVK6o^HDftsIWjajF*7kRH#0OdF*z|XG&wRE2s{S)0S6$$yC6Yxb7gdM0AX`;Wpr~baBOvFX>KlPbZu<;0S5>=I!9@GZEtfrI%jEmZEtf>Y;|X8ZYV=_VsCRMDFA0_dTnoWEpTjgXK8LOXmo9CBWGbSVlXr?H!?9{GGa0}H8(P0G-fe5F=96|IAddDGhs0t2s{S)0S6$$yC6qtdTnoW0B31>ZEtfeaBOvFX>KlPbZu-R2rW7~X>M+1asVS?FflMRGC43YFf%n}GBIX3WnyDBH#THrVKz27Gc_0IUolT&b7gXNWpYVmE@*UZY%B;WIy!A(bO0k^HZU?~Ff(H`H)1(AWj8r8H#cNCV`F4AFk&}kWi~K1EC?zHIyz}?c4cyNWhf~iV{dMAbO0k^VrFGAH)3HjI5K5nFk)n6V=`eiIAdZlW@2P!V>f0sBnV6fEC?zHIy!f6a%^N!Z*ysMX>V>QDIjBSZgX@1BVlA^Fk@phI5IdhGB7YSGGj7gG%`3bW@IxtHaIjnH8v&)Oa?3nDhN6{cW-iRWKwT*VRUJ4ZYU`rV{dMAbO0k^F=943HD+ZpWjSUuWHvcDW-&Q9G-WbnG&yB7H8Nu~CdE5Vq`QqHZWmkVmUA|IWsgfWid1=2uud>0RTEWOmAahY*cSoZ*pv80CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolK?V_|GmZ&z<}Y-BEIbZu-@0{|~@VQgh|bY(7RaBu)}Wo~3;a$hobZ+K;Fb6+xWVQgh|bY)*SXmD^YXmo9C&I|xAb7gXAVQgu7WpXZPaBu)~WpZg@Y-xIBa$h)TaBwbYbZu-k2tqnKWo}_&Y-MBsBVl1UFfwH~Gh#D1VmCA~V>MwmH(_KqH#TKrVPa%tWivGhLOMEfWo7^)VPZKnIAvvKH#TBoF=I9}WMO4wG-Ne1Ffn5_H)drxIW-7EIy!P?VPs8Vb87%2VKp)^H#jk4WHK``H!(IiGB9K|WHvQoGBRRhVmM|pIW-7EIy!f9X>?^xVRLH$BVlGVVl_E3Vqs!rIXE{mVKOl^Gch?iIW;jeGBG$YI5#y2LOMEPVPk7XVPjVq`T4LOMETa&K;QMqy)R03%^BHfA$oV>o3sGdMA1GBY?hFlII|Gc#i|I509cH90UH12Q@~Q*>o+V`*#vUol@XQ*>o+V`*$IXmo9C_y_Mp`a%psPE@*IY0BLS$WpZhBb6+@UaBwbYbZuD+90ADd*F==gZY%XYYZEOz%054;2ZDMI|VRUJ4ZZ2qWZ~$X(ZDMI|VRUJ4ZeKWPaBwbYbZu-W0|YN{Y+-p{aA9?GWdJfbGB;!}F*r9iIc79rI509{VP!LBGGsP0GBGqXH)bwqbZu;@1^_Q`Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_Uov!WZ)|g4GG$|PUte={VRUJ8bZKLAUovoPb!TaAUpQ!Ra4u+cZESrH055Q1Y-MzGWiDuNZ~%61cx7yJUovoEY-MzGWnVaGaBwbYbZu<;0S7udQe|#rWpX+?M=e5iW@cq_Iyz%=Wnpw>M?!UGW@U0zVP^nxWo~3;axG^qVs&O_WpXWWY;|X8ZZ2qaZEPcFVKXvgVKy*fW;r-AHDxzqF*Y_gWi~WrIbmZpVP#}AW%&UIIyzEiZe(S0Iyy%!LUm?lWpX+?WO8A5RBuN@b!KK|a#Uew0CHt+WMy(KXDwoNW@cq_EpTjgXK8LOXmo9CBWGb`G&W>3Wic^jGcq@2Ff=q|V`OAEWn?lkVPr66F)=s!0S7udQe|#rWpX+?M=e5iW@cq_Iy!P;b97~LX?kT;Z%0CPW@cq_RAFZTa%FC0WpXWNEn;KlPbZu-SXJI&GHaRjjIX5|GWHT`_G-hQmWn?foH(@e1V`DI7WnuXN2M9VkQe|#rWpX+?M=e5iW@cq_Iyz@Ub!KK|a!_n_XK8LILv>KlPbZu-SXJI!uV=^`|GGj9{G-fblWM(j8WH4f5HaTQvV>2=_Ff~62MFyq_4j{t2AV)1ib!KK|asX#7Vs&O_WpXWWY;|X8ZZ2qaZEOz%054%V>{IB0NiE@*UZY-4p|Z*u@{VQpn|aA9L*V|8M0b1rCfZES-G054^1Wo>0{bS`LcZ~$d&Wo>0{bYD1VaBwbYbZu<>2n1hpVRLk4a%p;HasW1FGG<~iWjSUtHD+OCH)dowW@KYFHZw9|GhsJkWH2shbZu;@1pqH_Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_Uov!WZ)|g4GG%UbX>@sCUukZ0aAjk3Z*pHUaBOvFX>MOQXmD^YXmo9CQ3x~wIyyvUZgXW+VPb4$Qe|gpb98cfC@BCVVK`zrH#9V3W?^DsHZe9cVKXx}W->8lFga#7Gc-9eWk(2BQ3x~wIy!P?b7gcWDF7p3V=*!@IX5^oF=04lWim8lG&444I5=WsFkxXbWMMfnNeEU^2s9HqI%98cbYW?3b0|S_V`yb`d2nS(WGNtHZ*FsR03%^yH#228G&p2qIALL7W;kLrFfw8_H!(CgH#KE6G-5DI2v!kM2s9=-I%9HWVRU6EL2_egWpsIPWl3Z#AVG3tXk~PHaAikwVQ^?BEFe^QaAk8QDF7p3Ib}FvF*qLB4GGsJ0VL3K3WimD~W;kYHO$b&bQ3x~*Iyzx=C_!>#Xk~PHaAiqkDF7p3VKy=}G-fw5Wo9vBWH2)_H)1nmVq#-9H!(G0GBPnSPY6~E3kD}rWoKz~baHtBQe|gpb98cfE@*UZZ218P2s%1cZ*OdKIyzTxa%^NENp5p+Wn*-2aymM9Z*pv8Np5p+Wn*-2a!_n_XK8LILv>GkbZ>8LEpTjgXK8LOXmo9CBWGbZG%z-0IAS(8HexX`W;JDHVPY|2Fkv(?Fk@vlV>V$@2ucRq4hJB@yC7F@a%^NENp5p+Wn*-2asYR4a%^NRX>N0HWn*-2axHXkZ)`1aY;|X8ZZ2qaZEP_K055W7XK8bEa(OOjaBu*0VPb4$UovE6ZgXW{GIC{SX>)XPd0#kaaBwbYbZu;12o^dzRB~ZsWdLVkF*sslV`DfrIAk+7G&eFeG+|>iFfuhYWHU8kGG=2iVPs@9Wn(a5V>D$oIA%9vGcsW?F)}nXVP!cnF*Pt^F2)^H8o^2HDNMlV=!T1HZU_eFf}wcFl91fHDWkpF*9X3Hexk5Ib~)rWMW}m2o^dzNp5Cu0B2z_IAUXCV>mWAWHUE3H!?LeVPi8eGBq`1Gc{o{W@9j6G%z(eVlXl_F=jS4VKF#kVl_5qH8eCgGB`ImHaIsmT?iIBI#*$GZUARtF*sslV`DfrIAk+7G&eFeG+|>iFfuhYWHU8kGG=2iVKp{2GBsgkHZ){2H!x!`Vl*^3VPi04HZV6aFlA;jH(dx8Iyyyia&K|~XJIioVq;@tI5s$BGdDChGBq?|V>2)^H8o^2HDNMlV=!SkFfw8=WHmKrWMpM#HfA_vHZ?J3Wic=_HDWhpG-7032o^dzLvm?!X=7n*0B2z_IAUXCV>mWAWHUE3H!?LeVPi8eGBq`1Gc{o{W@9j6GB-G6FfnB{VP-WpGB-0~VP!F5VmUcsIXGf7H!x#lT?iIBI!|V10B2z_IAUXCV>mWAWHUE3H!?LeVPi8eGBq`1Gc{o{W@9j6WHB`}Fg0X1VKikkG-WU{G&nh9H#A{2Wo9)rGG;S2atIVUI!tADWo!T=XJIioVq;@tI5s$BGdDChGBq?|V>2)^H8o^2HDNMlV=!_E6bCvwY-M(3Y$!}+c4cfS03&B%Fkv(}W-(%9F*rFeW@2SyH8C?ZF*as5W;ZuuV`VdDUI;e@atIU)Iy!7+c4cfRDIhIAAWUU;Wo!T=XJKMAGh#SqG-NY2FfunbVKic6Fga#2H8wM1Ic7OAIAvf6HwkG77hhCTK|@6VVK8AbG-Eb5F)}q~Fl9M8Vl*=`IXPoxHDNU|GG#F}X$TizL`6bXM*uP~F)=V^V>vZqVL320VK_H8Fk@t6HDqQpH8?plH8^Pq7hg$EMo$1UW-vB6H85r~I5sjcW;Hi5G-5GkFl9M2VKy;1V>4lC2p3;hK~hctG%z?dGiGHpH8nG4VK*@{VrF78HZ(IZF<~$@V>M$mX$TizMN(2vQUGH)VKgx@HfA<5FlIJmVl^;kH8No_Fl1#lV=_25W@Tvz7hgkCNmNNgK}-NLW@0fiI5sz7HZwCgV`gD8Vlp%_Ff}wbIA%04G&wM72p3;ZMn(W)H!(OjGGSshIAb_tG&eJ4H)CaHWi>KkWnyAwIb&l(RYFfwUsOd*Ura?-MN9x^a&L8TUteQya%C-aWo#~JbZu-SXJIyBFgP+cFgRm4VK-wrIX7fuF=b<9HZo&2G-Y9CF)|H9RYFfwUsF&)PAG0+ZDlMVY-M(3Y$*U|a&L8TUteQya%C-aWo#~JbZu-SXJIokHezEpG&473I5;&hGdVIaIWaJ1H!x!~IW{w8W;bdGHwy+sRYFfwUsF&)PG3n*Mo%biVQpn80B3S|zZ*pZVbY*NVXmo9CBWGbWWH>W8IAUWqH)S<6H8o;lW-~Z5H#TH9H8?Y3G&4DF2sZ=a&L8TUteQya%C-aWo#~JbZu-SXJKVDV>UE4V_`8kHZoy1FlIC|V`O4BW;S9qF<~(^Fkx^AHw0`33oUeIYyd5EWo#~JbZu;R2rLL7V{dMAbO16pI5J^5FflS=V>L4|Fgav3WMX4vHZox|V`OGIFlKWIOa^%fEC?WDZ*FsR06AtjIb>pGHZ?OhF=l3DGG%6CHDfqrVmM?rH#IgnGIa<{273r90y;WjV{~b6ZgVIp03%^zWM*VzWHd2jGBYtTF)}n_H8e3aWHmH0Ff%h`H83-G2uynjDgrt>VR&V8C@BCVVKX*mWH2%^IW#soH#uWwIb}IBVl_53WMVfoV>V+rFnI_}NdX-~X>Md`ZfA1Mn8E@*UZZ218VAVE+`04-r~X)b7VZEU{_054;2Y;0*{WpXZPaBu))Z)|L7WMy(+IB0NiE@*UZY=Q_%Iyz%-ZE#_7WdI{#WjJ9uG-fwrVPrEoGBaalWo9!uHDottWMMEkF*q}0f(S}FI%Z*MYycx+W->QrIb&lvGh;C_IAddBVKg&1Wn*GAF=a3`IWRalf(S}FI&figa{wb@WivB4Wo9>HV>M(qH#s0%^VKOx}V>LK1G&eRiG-75qG-6^oWid4}H8V3gG&M3|V>JjpIyy#SV`TteF<&u8VPj=3Xmo9CW&i{)V_|M~VRHa6WM(ihGc;smVl!f6VqrEhG%`0gW;ZfrV>K~jH#TH0Xmo9Cng}a1IyzEiZe(S0O=WXvP;YN+C}VGOWjZ=%Y&tqpWo~3;aztfzX=7z3EFg1qWI8%?X?kT}bSxlqbYwa@b7^{IUvwz|BVjpVF=J#kGh<~nV>2>iGcht_VK*{3IAtn@CVK6x{G&VVAW;bCtW;QrxVK!kgI59Ukh6qg+ng}ZwIy!G~WpZJ3Z*n~-V{dMAbRbe?Ze(S0O=WXvP;YN+CMf_TVP#`wWjHxBHZ(CgWHVzpIAvimGG;e2WoBYEGBIH|WQYh&6`BYu2s%1qbz^H~bVF}-ZgeOqAY*TCb94YBVK!knV>UK0Gh;I_WH>lDV=`nlIAmlnVqsxoWMelnGl~dJ2AT*f2s%1qbz^H~bW>@1Whf~iV{dMAbO0k^F=8<{IWjb3Vm4(mH#A~3H#0dkGiGEtVKp;0G&E*3j0jBzng}ZhIyz=@Wo1HjV{2t}LvM9%bSNnxV{dMAbO0k^Win!BHDxwpIbkw2Ff(IiGc!12GGaDlIb}9BHZx&0jtET#ng}ZhIy!b`a&%>QLUm?lWpXGfAY*TCb94YBVPj)3WHC2nHfCjJGB!0~Gc#m4Vr4irWM(rqG&EskG>`~Q2AT*fCOSG{Y;131VRU6EV{dMAbRbe?Ze(S0O=WXvR%LQ@Wq2wqAaitNIy!S{dSzd9DF7p3GG#bqWMX1AWMea9W;J1CFgIppVrDsFGBGe?H!(9gk_b&Cng}ZjIyz)!VQg$~V_|e=iGc_|ZW;SADFgZ9fFflY?WRwU^2$~2h5IQ<`WpZ?7ctdY>ZgeO@bz^H~bV+0>AY*TCb94YBVKXo=W@9*EF*#y4GBRQ|WHvW8H928qWHK{lIb$a7<-(Wo$!lb#8P3BVjpXFl1yiF*jy8GC4OfH#K8rGc_?VIAmpIIAt|uHZY+GEjl`PX=HS003%^xWid2jHZwM2IAmmGIb=3wWH>Q2WnwisWHm5jH90w<2rW7~Xk}?J~Vlp>1Wn(xpVPj=tFfw9cWHB}{F=972Ib)#+Ejl`8Z*py6bO0k^WH~T6I5B29VrFDzH#RsnIW#geWH~owGdE#nH8CMg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GGTLbWps02GH`5lXK8LM~aXmo9C`2hzAIyzEiZe(S0IyzHmVPs`;Iy!S`VPs`;P;7N)X>KS(bz*OGCMf`NWo~3;axHUcVPs`;EpTjgXK8LOXmo9CBWGbSWMncoFgY?|Vq#)3F*IQ?Heoa|F*r45Ib=36Gcz!!2tx*@2o4~^yC73&VPs`;0CQ+zWMy(KaBOvFX>KlPbZu--5Dy^2yC6?ub7gXNWpV&5Z(?(0a&~2ME@*UZY_kX|EIK-KXm58YV{dMAbRc7Ia%DO?a%E<0Wn*+{Z*Dp|RC#b^CM+OhZ*FsRAa-wQWGX2DBVjl)W;kYHFg7$fIXE+BW@a}uIW}f8GBq|aG&f>2VKS=-Oe(VoDkeHQWn^h|C}VGKb95kMZ*pZiI&x)ZY-M9~X>V>iI#hXZWhN{jc5i89Dk%UXVKg%_Fg7w`HZwJ5Fg7(XIAdftWj8ouWMwfmVmUc6HLVCtB(n%A3OYJ-Xm58YV{dMAbRbkFDF7p3IASwpVPY^bWjQ!CV`gD8WH(}EG-72rH8L|dF=H_|uLw*Cvj{2#Iyz-!X>=%5CMf_TVKp{nG&C|}H#cT6VKgx@HD)G1V{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XL}7GcNp5p+Wn*-2axQ3eZERHr055QFX>N2bXmD@KSf03%^!WimE7GBG%2G&o{2I5IL~G&40hWHm4|Wn?m8WoBfx2wAxZHv&33Wo~3BDF7p3Gc-6hH)b_7GcYqWF*i6eW;A0lW-&B1WHn+rI59Fcw+LC_3jjJgP-$>wY-w&~WK?NwWpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=uRFF<&uhZE$Q~F<&uIX>et1X>Mg?RB3HxaxQ3eZEX1g2M9VkRY^KJLt$=qVRJeKS(bz*OGCMf`QX)R-6ZgydFEpTjgXK8LOXmo9CBWGbTG+{6_IWT2oW;kIqGBq(~WHB^lF=R4jH8nRhFgawp2tNi41_~g;yC6ehZgydF0Apcpc42cZaBOvFX>KlPbZu<#1^_Q&a%p5|WiDuNZ~$^;Ze(S0UovxOVPs`;Uov8HX=G<*UpQ!Ra4u+cZEPn41TS}Qa%^N@X>N0HWn*-2asW3rG-5V6F*9W~VK6f_Vl^-}Gcq-1GdVFhW-&8mWH&BobZu-71q3f*a%p5|Wpe;xWI1AGGdW{2V`FACF*7nUHaImnGch?cVlXmdG&o}}Xmo9C4+a1)aBOvFX>KlPaBu*0Z*OdKUov!Mb8}^KVRUbEUovxYV_!0KWpi_7a$$6Db6+xKWny(_XJv9KJZ~$R+VP80CaBwbYbZubS`LcZ~$p-XLV^`GIU{bXJvF>IB0NiE@*UZY)%RWFJW_YWprOKlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVINXMl#EpBCWcW-iQX>MmOXmo9C%m^?#I&pPna(Pr`a&2<}BVl1PGC5^qGGs7iGB#v2HaRsgW@0!wW;bInGGS#lGGfdKFgiMKVsmA3c4cH#VRC0>bO0k^V>DzmV`exuVl*^2WH32lG-hRGF=Aw4GiEYjVK^~3*ADmZ3IXE<9I5A>1V>mcuHZnLgW@R;HV>L86W@R|H0RTEWO<{CnXaI9`a&=>LV|8M0b6+uEF=KCXWnVF0F=bMl#b98cbV{~J6VsCR_F<&udZf9w3WnVF0F+^o%WpZ+5WK(EiWNB_^E@*UZY-|P#Iyy~dZEtdUIyzHjWou7zX=iC}04;50ZEtdUE@*UZY$Io3GhsPnVPrWtGc;r{GB;*9Wo0-qIW%E2V`XAFWn^M7Yz7MhIyy~dZEtdUIy!TAVQ@lubY*iWR4D*0ZDnn5a(OOjbZu-SXJKVFIAu0tGh{bmVP<48H#1~3WjHc8Vl_21WM(ulV`kO}Ist433j#ViO=WFwa(OyBX>&|zbaZTGMQ&tiVQwfX04;50ZEtdUE@*UZY$Io3H#lWDW->HoVm2@`Gh#V8V=^-`V=`kmHZd|eHZx>6*a$jo1`7i^I!$G5Z*qA$I%aZjZA@u&bZlisZe(d;ZYWeK04;50ZEtdUE@*UZY$Io3Vl!hgFk&__WHB&gH)1wrVK!o9Ic8#II5RV3Vl**0+6X!UYz7MhIyy~dZEtdUIy!W3OlfpnVlXu~VPR!tI5RmoF)%qXIWjpkF*GvV2s#051`7i^I!$G5Z*qA$I%aZjZ9-{hMQ&tiVQwf?DF7{PWo>VAc`j&lZEPcFVKg`~FgZ3dV>V$iGh<;fIALXFF*sp4H#KEtV>UBmX5I)o0c-{f13EfQWo>VAc{)0DZ$fEjMQ&tiVQwf?DF7{PWo>VAc`j&lZEPcFVKp=|V_`HmHDNR}IWl8qWMMfnHD+OAHe@+6Ffd{=HsA<40c-{f1v)xSWo>VAc{)06Z+2xUR3;`V04;50ZEtdUE@*UZY$Io3Gh<{kHeqBkHeqF9W;io9GB-J7VPs`AGcz_YFk&+};s`neYz7M?Iyy~dZEtdUIyz==a(7{JWGHlbaAj^`ZDk-*Wo>VEWm08kWpZV1V`V&4J~}#7d2nSWDF7{PWo>VAc`j&lZEPcFVL4+oWM(;GHDoqqI5A^5H)b$mV=*^lVKX#gF*IQ_VdMxpB5Vc=Ai}#KO=WFwa(MtPZDnn5a(OOjbZu;d2mmi-cyM8EWG-lMZ~$d^aA9s_UpQ!Ra4u+cZEX1g2Rb@ZWo~3;aymLlL{d6BV{&C-bY)0HQdD7Q0CHt+WMy(KXk>CNaBOvFX>KlPbZu-SXJI%qH)b<3I5B2pV`4KmHeoU_H#0V2IXPoDGBGk@IW_qK2Rb@ZWo~3;aymLlL{d6BWO8A5RBuQ`QdD7Q0CHt+WMy(KXk>CNaBOvFX>KlPbZu-SXJKMuI5aUgWnpGGV>LN4WjHlvV>LB2I59LeWi@6vVPg3K2M9VkQe|#rWpX+?NJLUPI%s5aP;7N)X>KS(bz*OGCMf`NWo~3;axG|NaxHLdb!TaAE@*UZY$Io3H)J+AWHC8qG-769GBPtTW;kOtHZeFeVmLQ6VL3E6>IgsvrU(uo!n+_yL{b1~WO6NVY;|X8ZZ2qaZEX1g2M9VkRBvx=b2>UxWps3DZfA2KNp5p+Wn*-2aymM5Wps3DZfA2zZgX&DV{~tFP;7N)X>KS(bz*OGCMf`OWps3DZfA2XX>N0HWn*-2axHXkZ)`1aY;|X8ZZ2qaZEPcFVKp*iF*G?gW;QorHD)w8Hexq6VPQBmW;SIrGG#V5W$g$}2HOq?Ai}#KQ)P5?X>Mn8AW3d>aAjk3Z*l;0Wps3DZfA2XX>N0HWn*-2axHXkZ)`1aY;|X8ZZ2qaZEVs7055Z6VQghCXmD@et1X>MgEEFe~8a&%>QL2`0o;((?p03%^zG%++}WMO7xIbkz0WoBVwGc+(VFgY|ZG&L|}Ff=jo2tzZl3l=&$XKVmpF<&ufY%XYYZEQ{u40^VRU73X<=+GXmD@V>{IB0NiE@*UZY=jX6FLZKYX>@Y{I5lQ5Vl`r8HfCZtWi~J}Wj8c1HaIddF*i0aVrF4wE@*UZZ218P2s%1MWoBV@Y;EVEpTjgXK8LOXmo9CBWGbVGch$|V>f0rG-WelWn?)wFkxdkWI1LuWHdK7G&ME(2tEe+0S6$$yC6hmW?^+~baMb?WoBV@Y;KlPbZu-E34xBHZox`Gh}3CI5c57WH2~1E@*UZZ218P2s%1aWo~3;aymLgVQpn{VLCcvVQpn{VNh&!XK8LILv>UD~W;QrEVPrUAW;rxwGG=3BW@2SyHDon5F=hY>Q3eN06a&%HVAc{(~lZh2N=Y;|QR03%^!F*!3gGBILhW;QoCG-6>nH!)!}IXGf5IWROcH(@aX2~iLj2`?EsI%RTUb7fLxb8mHWV`V5~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlD_WM(roVr4dAIAk+2G&wLaF*!D6FgZ3cGh|^nH#P(bQ5P5qF9JF`V{&C-bY&$bZK;XEFfcVZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+O!Z)s#IDF7p3GdMChH)CZsHDP3AV`VXAF*P`1F*r9fG%zq?H#9Lb3<*&t7zr;SIy!P?ZEtpEC`E2`X>@rkAY*TCb95kbWoB$;V{~b6ZaO+td2nSWDF7p3GG#e4W;irBVL4(nV`gDCFkxdjV>o7EF*P`1H8e724hc~o7zr;hIy!P?Y+-a|C`E2`X>@rkAVqF;X>@rkAY*TCb95kbWoB$;V{~b6ZaO+td2nSWEFgAoX=ExX03%^DV>MzjGG#eqHextpV>UQ5WHT^hGi72pGG=8rI5s&D2~jQ>2`?!+I(2SxWo%(|Whg~%bZK;XEFeX0bZK;XEFfcVZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMf_TVKHH3H8^87VKy=`HDNF~H!@=~FkxXcHe)p~Gh=39HWCR@Cm0DYAUZm5b#rJaZDnn5a(OyBMs;pubZKvHJa%tsWGGi}a%^NKDLyFxBVlGYVK!niWiw(pVPRr0G&VOgI50IiV`MWnW-(%8Gi4MBQ63lxF9JF`V{dJ3X>=$l03%^CG&MCgH8nF~I5szCIWsaiH85l|W-w+mW-(0IUok^(ZEaz0WI}ajW@U0NXmo9C@BsiiI!SJ2a&&270CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolB;WpZ?BVJ>KNZES!C055QCb!TaAE@*IY0CaC}Y;#{SbY*jMWpZJ3Z*yNVb8=%}GIV8gb7gX2bZ>KCGH`NlYGq?|UovoPb!TaAUpQ!Ra4u+cZEPzEA_zJf1GGGj4eWHB-`FlIA3F=b>oIb=CFBMC$cD+wYJIyymac|mh?WppTWbYwa@b98cPZf9S1X=QgQ03%^zVliZ7H#9S0G&nY8Fkv?_WM*YzIXGoCGB9B>F=J#U2}BSp2_g|XIzeuEL349ubSPtQZgX@XL2h|Lb8}^MCMf_TVKFjhG+|_9VlrblW-~W8V=*;2W;QW5VKOvjFflMUVJ8Vh4=V{G3_3bNZh1j-b7gcWL2h|Lb8}^MCMGEWBVlDRHa9tCFflbaWM*bHHDO^jIASzmW->7|F)%qZW@9M{L<;Z$06IEBb8}^M0Ap-nb8};LVsCR_F<&udZf9w3WnVF0F+p>4WpplRbZu<80RS&b8{|eaBu)&WMpz>b8}xfXmD^YXmo9CE(t3-I$?8jWpn@|VPQ8lVKQVlIXGoFH)J_tF)}wdH8411HaKNtIWS=~GENErIyymfb7gc>Wo%_*bY)~kc4cmK0CRM5bz^jNWpi_7a$$6Db6+uEF+p>4WpqKlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIKWo~3;a$hoMUteN%W@cq_UovoPb!TaAUpQ!Ra4u+cZEWBR06IETVQp}1WpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=uRFF<&uhZE$Q~F<&uLVQp}1WpXZPbZu;B4g@b`Wo~n20An#?H90jmWnwTjF*0H~IX5^mGcaUkVly;kIW{#lVlHTOZEQRVE)qIAQe|OeM|ELxWGG{AZgX@XR3dT7Vq`ElGBh$WF=9AnHe)$4WH&M~WMwi5P!K!`E)6<5Qe|OeM|ELxWGGT)VPr>jVRB?9CMf_TVP#=AF*aplV`XJEW-wtkWMpMCV>vM}WimEqGGsDkWi$y;3p@!f2s%1vWppShAY*TCb94YBVK*^iVKOo`Vm4-FWiU2kGd3_`W@ch#FgP$_V`McqH#P}S20RHa2s%1%aAk5~bZ>GhC@COgZ*FsR03%^JWHvH3GcaN|Ibk_9F=kVAd0#PKF;Zn=WJh&ja%3)ObZu;E5CAV_Ze(d;Zf<3Bb1rCbZ~$d)WNBe;Ze??GUpQ!Ra4u+cZEX1g2M9VkNo`?gWjZ=(ZDD6+P;7N)X>KS(bz*OGCMf`EZDD6+EpTjgXK8LOXmo9CBWGb@Vm38qVP-NnWn(vHGB`IeVr6ABWn?xqVlXygGBY?n2|EV)0S6$$yC6wzVP|CkX>DO=Wi4=Qb!TaAE@*UZYzzY!Ai}#KLSb`hV<1&?VP|CkEn;DFX=5&EbZu-_2`vITI#gqDOlfm;Wo~71C@BCVVKz89V`DipHe+FAG%zq@Ibt|vV>35qH)c6uVl-qkH9`qbRtYTvIy!z-V{lAqb97~HWpXGf03%^#GG%5tVKii9GiEeqHaKEsF=9DpGBRUiFf=$hVKp{H2~SoDEfhLBRAX>VX>)XCZe?;PV{dMAbRbk?a7<})bY*U3awaJNBVlG`H#jzCFf%k|VK*^3VK8K7IbmXEF*!0~I5#;pF=0jtPZCxMEfhLBZ*XODVRUbDJt$*uZgX@XRAX>VX>)XCZe?;NDF7p3G&E#0WMwlpV>C7}Gc{#7Wi~W1G+{VoV>dT8Fl1t7NC{68RtYU1Iy!7=b97~HC}VGKb95jb8{vvAa!YObTKwxbSxlgZgeRCBVl4>WoBe#IALZqGcaRiV=y^5Wi&HoVKp*lGc`A2GcigDPaReXEfP99VPj)uaC9hCV{lV+a%Ev{CMh6eZ*FsR03%^FIAJznIW}f9IWRCdHa0mlHDY9DIWb{2H#lWDIAS?~G&MP4IW=WrF=jYoW;r%vHZ?gpWnp7Z2~SoDEeJX~c42I3WGE>hV{dMAbO0k^H#a$DI59V7WiU8nGBr11He)qoIW#n7HDxhkH)Jt6Pzg^4RtYT#Iyz}?Ze?;PDIjBSZgX@1BVjQyVq!31H#0Y5WHn-8HZ*22I51^mWi>HlG-EYpVKh<+PX<;AEe1L|b7gcwY;R+0X>MmIVsCG3DF7p3W@b1rGdVJ3WHMqgGGaM2IALTrIAl3EWHMtlFfwE_R0&T6unPb>I&NijIyzKia7<})bY*U3asXp&VRLh1bz*OGUol@XV{dY0Uol@XZe?^|F<&uMV{lAqb97~HWpXZPbZuWny(_E@*IY0A*rzXJ0sIaBwbYbZu<32>>s1V`Xk-E@*IY0CQtyZe?FMXmD^YXmo9CTL~~aI&fufWpr|3bZKvH03%^AW@R;EFgP|bGGk*hVmUNsFf}(}IW%KtGc`A3He@wh2{1Z3Zf|mJVQc^+VPR%7IX5*iIW#afWMyMwG-fztGB`P6WMyVEF*q0st>?Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_UovuKZe(S0UovoMV{2t{UovoPb!TaAUpQ!Ra4u+cZERi%Njf@cVQyq>WdI{#Ib<_3G&43hV`XGEFl1pgGBq_cFf}w{H)dmHWMMNmKnyH8I#gwNbairNGDJaga$$K?VRC0>bO2v5Uoli=cyx7gWimuTa&lpLRAF*wWpplRbZu;q2LLZ(Y;|RDa%paKE@*IY0Ag%)WpHw7ZggKbXmD^YXmo9CV+kobI&*1yWdI{#WHDuCG-5L{V`4KnF=1geGGsD0G&MG2I5at8Fg7(fV+kobI%8~QVRB_;03%^#IA%FFIW;(9Ib~%zVl^-{G&5y4F)?N~VliQ6H#cKr2`M@{bY*ySb#i3@BVjRNHe)nqGcq_fGBh}0H928oGi7CAW;ZcrWo9)vGBNN006IESWo~3;aztftbZ7u`baHiLbYpd5Z*yNUUomBFXK8L_Uol@XQe|#rWpYGiaCB%cXmo9CNe}=pV{dJ6Z*FC7baO9eZ*pU0E@*IY0A_D;V`X1BXmD^YXmo9CYzZ$qI%HvVVE`jxH!v|{G&y27HD+RBVP<1xWMpA6I5lQ5WimKoF)%YRYzZ$qI&EoiOl5XuY(sB#Zgc=6VP!L8VKrf9W-&D~VKHVlW@BbJHDP5pHf3ctIbu0BIcy0pIy!f0WOQf%BVjT%F*syoWMwjCVlrYkV>UN3GB`P6WnyMFV`MdCV>N6EFFHDCWoc(2H!?CeYzZ$qI%H*VbZ7u0VK!l6HDfkmW@TbBGB9H`IAJz6GBr13IWjUdVrDQhFl-4gIy!Z8VP|CkBVlDWHZ*2tH8wOhVm3HoGC4ChGc#f^Ffln{IAUQjIAv@JFFHDAZ*py6bO0k^HfA(tHaIyrWjJLrGi5YoHf3QkWo0uqVlp^lVr6AA^9TSsI#gwNbairNGeksXb7KH=baHiLbYpd5Z*yNUUom5Ea%EpJUomHFUol@XRAqQ{b#i4hL_}qCV=icPZEPn41utY}Vs&RGBRQ_Vr6ACG&g26IXE<8Ib$<1Ff(E?I5IA1bZu-50~jE}yC6w!Xk~I~baNn7a$#w704;QKVQF-8Eop9OWpZhBb1rCfZESxDGYvXAQ*>c&WMOh-Q*?4=VQnZzNlZm5EFfZUZ)_<5BVjXRFfd^=HDxnoV=^~oH8W)~H!);kFl8`gHZx^6WixLHRSSO!GZH#FQ*>c&WMOh-Q*?4=VQnZ=bYX5}VRB?sbaG{3Z6+ou03%^JWHDxDFk~<_VKXyiV`ejEI59FcG%_?^MV{dMAbRc$bX=ExaAaitNIy!S{dSzd9DF7p3H#1^kVKibeGh#PpV>vi8V>o3vFf=kTIc798HZn6abqQ4%e+e@PIy!V^Y-}hgAY*TCb94YBVKrtkV`edAW;ropVq-UCIAS(3G&wV4Ib|_7V`4NhHFpVB27d`N7dkp~Wo2t9aCCBHX=Y|$bSxlKWo2tma%pF2ZYcmGVPrBiVKy;iWiU5nWinoHDNJfVPY~fG-GBqHexkoVmLTAHa9R~V|xiz27d`N0y;WyWo2t9DF7p3W-?-8IW=N9Wj8Q5Wi)1DW@R`zW;i%EHaIjiHexk7eF;@r4gfkjQ*>c&WMOh-Q*?4=VQm0oY+-YAV|8M0b6+uEF=KCXWnVF0F>PgSZ*qBGF<&uLbYX5}VRB?sbaG{3Z7yhZZEX1g2M9VkNp5g;bUHd|Zg6#UP;7N)X>KS(bz*OGCMf`EZg6#UEpTjgXK8LOXmo9CBWGbSI59LbGcsXhH)CdEHDowAWnnjCH!(9}WH~ryIW%Q}2|EV)0S6$$yC6w!aCLM5X>M?JbS-dfb!TaAE@*UZY?KKrIyzKga%W|9O<{9u03%^!Gc{o~IAS?tFgay8GC49eI5A~8VPj=EHDNP0H8C}m2`f4}O<{OcVRC0>bVF}-Zgc=6VPj!8HDxqmHZ)~8Ght#dFl9GkGd411G%zz{IALUFHmJ~GGkM~UDIjBSZgX@1BVjT&GB+_{IASwmHf3REF*jp0VPQ2gWMMTnGcsj2WHX8hO$L++D+oF|Wpi|CZDDj}C@COgZ*FsR03%^DI5{*qHf1q6WH2#fVKOr`Fk?6|W@9)wIWlHBWH4fk2~7r+2`dOXI(2YlVRU6ES8sA`WF{#9BVjgWH8N#1V>U84WH)9tHZVCfWo0xqGd5#kWMVWiHe-$nO$L++DnFfe8^GcjT@kO@sAlnE;ZIy!J^ZgVJUZgeRCBVji*Vqsx2IW}fyVPj=xHDfn2IAvvGWMyMBGC4V7Gc%G2O#?pMg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GGlLSY-w|8Z*Fs6GH`5lXK8L0CHt!Y-M9~UpQ!Ra4u+cZEPc9FgGwbVPP<4I5T8qGd4IdF*0N~F*apkHDP8pGch%0gb@HQa%E<0Wn*+MXmD@UA~V`4ctI5B20W;JAFHf1tmHezElVlto!R12~RG7~yFZeeX@D06gVIy!S{dSzd9DIjBSZgX@1BVjXSF)?FdGBsf}Vl*;0GGRD5FfwCdVPZ8oGBRN`VKt%&R1vZXG7~yFWNC6`V{~tFc_?#qWI8%?X?kT}bSWTXZ*FsR03%^!WHm8mFf=eTV>2={F=jY7WH>fvGi5hqVKHH1VPj&X2~-iX2{H&eI&x)UWKV8vc_=9$V{dMAbO0k^HZwLfH#B89Ff(E~Gd5y5VKy*jWo2S9Wi&ZtIWsmkrU_IAvI#O1Iy!J+a%FCGD06gVIy!S{dSzd9DIjBSZgX@1BVjf(GGsSlIXO5pVKg)|GcqzcF*!IfHZn9gGd5#3WiqGMmIb97`nI&*1yWnXkDAY*TCb94YBVK`=DF*h(dI509bV=*%`F*#y2W@9;FW;ZoqVly&1G^zfcR1vZXGAlYdZ*XO9D06gVIy!S{dSzd9EFeZ{Y-Kt+NMUYdY-KDUMrmwiIyz5qWo}JxWMwG;BVjc)V>dHoWHx0sIWaIXHZw6aH)LctHZwV5WiezoG-9p^R4K9vG9fxTa%E>}b97~LL}7GcC}VGKb95kcbYwa@b98cPZf7PeAY*TCb95j?VRT_8DF7p3Wo0rmIXGfDGC4OfV>2@|VlZQ7W-?}DVK-(sIbk?uunANj1pxp$Iz??_Wn^S!WI=LcXlZt30Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ucVRT_%F<&u7ZDM6)WMyPQa${&|c4aPTbZu;A00b{-ZDD6+0An^{F*!LfW;Z!BW?^MEH)1z9V>mfsFf=(gWH~rFWiDuRZEQ{x1TS-AWo~5vGdN{AW@0clG&M9dFgP}3Gc`FhWj8QkG%;p2Vlp*1E@*UZY{v;BH99(JZggdGb7f<6b0}kPZgX@XLT`8`EFfcVZgX@XXKZacI&EQeG$t${V{dMAbRa@+cqS|$V{dMAbRgn@rYQg;VKy>lGi5e7FgZD6Gh{PjG&W-~Gi7FBGB#u~IW#n8X0-`LGsg)dH99(Tb#!QDa%^F4WJqshXKi6_Lu_eqaA|I5C}VGKb95kcbYwa@c4cF9Z*n|mY;8I^c4cETJ|-+6X>N2ZAY*TCb95kMbz*OGI^uw)DF7p3WI16nHZU?XGBP$XVqr2jGchz~IX5ykIA%FAGC4P5w+Tfv#|a}fIy!J{VQytbWM^ebZggdGb7f<6X>V>QV{dMAbRc7OVsCRgI%98gWjZ=%Wp8adI#6t3Ze=DcAY*TCb95kQY;8I^c4cET;((?p03%^DVPP~dHaTQwV>UEnIbmfvH#9OfG&walV>viCH)1)t2}Lu<2_rK)I&g1kZgfd*P;6mtWhi5BZgX@XXKZacI(B7aGbSt`V{dMAbRc7OVsCRgI%98gWjZ=%Wp8adI#6t3Ze=DZ03%^CVL31`F=aMmV`gPFVrDoqF*#yoWim52F=aJ2F*i252}Lo-2_q^xI%j2cO<{OeWpZ?7cu8(ScxiJeX>N2ZAY*TCb95kQY;8I^c4cETTU{(5V{dMAbRcJJZ8|!3Wn(iYDF7p3HZU|cIWjdcWMMTjH8M9cWjQrsHD+NsW;i!uG%+<}y$MAq#|a}fIyz@%bV+VwX=G(?bW&wzWpZV1V`WfpYU>Z*pZiI%j2XZ8|zaZ+IpwAY*TCb95kQY;8I^c4cETCM@EBrYQg;VKFl_WH2~6HDfhoIAUTjIAb|7F*0N{GiEVnG&MFfFuw^!Gsg)dC^|Z4WpqPqZ*ygHbWm?;ZgfRtXJsg3Z*FsRAZKiCIy!b`V>2c!AZKiCIy!b`V>2uuXKZacI(B7aGbsQgVL3EoHZVD2Vl-i9G%zt`G-G6BIc7IBI5agmVP!TmG{Ff)CdUaQF*-VDWpqPqZ*ygHbWm?;Zgfy@YBBVjQyW-?-CGh#SoH8^BAV>L2nW-(HYOQP2r52s%1ub#7yHX>V>QDIjBSZgX@1BVjo-VPrXGIWuHoHDNF_GGaJ5I5jdbI5adeHe)bkF*VK!Q3hxO06IEEd2V5CX=6}qb!TaA0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&udV{>0IUok{^ZeeX{V^C~$XK8LOXmo9C{{#RpaBpvHE@*IY0Ap`*WnVIBZewh9WMyA6V|8M0b6+xJZ*pZ{GG$|PUovHGbZK;XUovoSZ){&UXmD^YXmo9C+X*r{I%RHQVr*q(03%^xWH>WoF<~(^F=1mkG+|{lF*9Q{W->N4GG#e5V`F672{Jl5b#8NGVQgh&L}hGrVN_{tWdI{#GB-A5Wid85GG#S3Ff?OjHDfepVm4(rH8VM5Gc;m1+X*r{I&5KdWpZI`03%^BG%;jlFgQ0kG-fg~W@RuoWH&K6FfcbaH)CUDWnwVf2{Jl5c4cyOX=7n*03%^GVq-8fIW#jcGdN*kWHB~lG&W>pFkxY4Ha0e9IXGe42{Jl5Y;SI7X>@gDX>MU`03%^$VKXr_G&W{7H8Ev3GB;*qGBG(ZVP;`9G&3_~H#s=l2{Jl5b8uy4WB?;!V=yygVK6c{F)}zXHDNb2F*0FcIWaLbIAt_3V>LE6+X*r{I&)=ia{wb@H!x!|W-v22VK8GfIW{(8Gi5SkHDWk0V>4kmGBPqa+X*r{I&f%d03%^FVP;}AH)LZrWiVtgHaIXjWi&BjHfA?tG-Ww5Gc+^X2{Jl5bZBLCVE`jxVK!oBW@R-pHDY5nWo9&DH#IS1FgQ6iGc`FfIW%H6@BsiiI!1D3WkX?YWpZIdZ*FvQZ)|L3asYF5a&=>LV|8M0b6+uEF=cLNX>Mg-F<&u8a%E*hVQpn{VMA|jbaHQOY-MsTXmo9CtOo!ubYXI5WpplRaBu)}Wo~3;a$hoZVRC0>bYC)bVRC0>bYD1VaBwbYbZu<+2{9TvIzn}3W@U0ybaG{3Z76ncX=ExaAaitNIy!S{dSzd9EFfZUZ)_<5BVl7XG%+|aGiEk6I51)}Fl0AkVq-EnHZx^4G&p27H89-?QyBLNF&a8LLUm?lWpYz=a%Ev{C}VGKb95kfZ)s#IEFg1qWI8%?X?kT}bSVHMVL4B^1W@R%pGB-5g2~!LA2{9EqIzn}3W@U0ybaG{3Z75@JZgX@XLUm?lWpYz=a%Ev{CMf_TVK^}~W@chFH#RslIAvrtHfA+uGdE#5G%-15VPY~eGvf(U6ZZ)*5IQdQpGG$~jWHvW6W@TbCFfru`Qx5kDF$g+3XJvFkb!KK|awsVvV{dMAbO0k^GG$^kW;r!BW;SLqIWspnGGjS1GGsSlGcjg4Wid8o=Lu5=_X#lwIy!T7a%pa7C@COgZ*FsR03%^EHZWy1GC5;mH8e3WWHT^jI5;yfFfcG>H8e3fWHvPE2~!652{9BpI&x)UWGHrTX=ExaAaitNIy!S{dSzd9DF7p3Ffur1HZU?}GBaW`F*rA2VKO#1Vr5}vV=*!}F)%SV>j_g5_X#l?Iy!f9X>?^MV{dMAbRc$bX=ExaAaitNIy!S{dSzd9DF7p3F=J&gF=aG4GBh_cH8U|dF*#%~H8D71G&N%}W-w%9?FmyD_X#lwIy!V^Y-}hgAY*TCb94YBVKy~6F=l0DHaBE8FgP+dHDfb1IAmiuHDO~jIASw4IPVEl2KNau7dkp~Wo2t9aCCBHX=Y|$bSxlKWo2tma%pF2ZYcmGVPau9VmLBpFg7?cWMyVyG&E&2W;SADGBsv7WjA6rG4Tmg7551-2s%1tZ)PYdAY*TCb94YBVKp*hHZ(RdH#RjnWHmH6W;A6sIb}IHVmW0oWnyDuWb+AA2KNau0y;WyWo2t9DF7p3Vlg){WH&Q7H#j#rWi(@BGBY$aV`64uVlZMeVKHN4^$Am14gfkjLUm?lWpYz=a%Ev{0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ulWo>VAd0#PKF+z1_W@U0ybaG{3Z7yhZZEOGvN*6jhX>N06a&#zDaA9(DWm08qVRUJ4Zd74nY-LGgDF7p3H8*5pFfe2>V>UBoIWjjnGh;F^WjQf7WiUBoV`DWm_z7$k018S7Iyz=@Z*3?kAY*TCb94YBVKrhgG-5C?Ff}HTb!A^TXmD^YXmo9CzY72_a$$L6VRLjYXmD@5DO<{0wX>Mm!VP^nxWo~3;axHXkZe=ZPVQ_G1Zf7lUY;|X8ZZ2qaZEPcFVKZenVly>lI5#$9Fl1siW@R;HI59b8F)}z~I5cE5V)+3F2s%1aWo~3;aymLxZ*FBEO<{0wX>MmaI&^PtWldplaA|I5P;7N)X>KS(bz*OGCMf`NWo~3;axHXkZe=ZPVQ_G1Zf7lUY;|X8ZZ2qaZEPcFVK+26Fkv!eHexhpWHDr9Vl*}~WidE3GC49hWHm82IRpwx2BruOAi}#KRBvu&AWdO#aA|I50CaC|Wi4%CaByjEXDx7Sb!TaAE@*UZY#9nP1v)xWb!BpSL2_egWpsIPWlnEoWhiNGbSVHMVPRo5IWsh5VP-ZkFk~=gHDWbnH85c}G%;Z~V>L1`I0p(=0~rc53OYJ>X>@2PLvL(#ZEi_qDF7p3WMpD7Fg7H1IWlEqVK-%FG%#gm2?|yS845HCIy!f0bZBpNbSOh_Y;|pJNn|MiBVjUTW;r-CWj0}9FlJ_BH8L||V>dE2I5{vdH#9RgHe?G5RtOmiG$A@VWpQmIbk(1H)1w2VKrlBW@I;JGGbviI5IFeH8N&nHxCL{1{n%82s%1pa${&^ba`-Pb0{ewV{dMAbO0k^GdMFgV`XD8W->K4Gi5k8Wi&Q3FflV^GBGz}H(@zB5eilY845HAIyz-@bZKp2bY&bWLG%Yb+p1bY*g3bZ>GdDIjBSZgX@1BVjo+IW}cuH)JzoHZU?`HZ(OgGB+|YGh|{hVPZHjG-ekHRwF+TB0+LvXk~PHaAi(!WMu$Ba${&^ba`-PPH$voE@*UZY?=!Z7dkpYb8}^MAZ2)PY;SU9aymL;b8}^MMR;&*Z*paFP;7N)X>KTEbz*OGIyz-;XK8L_IyysjVsCRMDF7{Db8}^MEoFFcY;SU9axHLdb!TaAE@*UZY$Io3IA&!rHeoO^Ha0M1IAk(mFgG|jGB7bYWil{hVK`x98VXMpnhOyi!n+_rb8}^MAZ2)PY;SU9asVx1b8}^MEoFFcY;SU9axHLdb!TaAE@*UZY#s_mIy!A>a7<-(Wo!T=VP-HnG%#T>WH~rBI5uTrIc79uVPiQtHZWo|VL4?vGC&M0Iyy#jVQpn%b!KK|a#Ue*XJvE%Uol@XMsi_oWny(^W@U0zVRC0>bS`LgZEPh9Hv&33ZDDXIDF7p3H)UjFW-&4{G%+wVWo9&GHa9sjHDxzAGh<_6V>UNq9|~C|3O52eI(2SsVQ?rZ03%^xGBRN^G%;p4WH>Z2W;SMJVlg;0V`XGHGBspnV=-eP3RxuzHyS!RW@&6}C}VGKb95kfZ)s#IEFg1qWI8%?X?kT}bSVHMVPrREIX5t4G-hNuGBIOgVK-qhIX7cuG+{AfGBq+~G9wCE7~l&4IyysdZgX^DZgfI*W@cq_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F+*=|b97;DbV7AzW@U0NXmo9CEDACaIyyvUVs&RzWpZg@Y-xIBawu(OZEtdUIyzHya%Ev{CMf_TVP!XEV>x7EGh$&gHaKHrGB7bQIAmsHHfClrVlpsgHYN&G4=f5Y20A)$a%FUMc_?CUZ)_<5BVjo)V>2}~V`DNfW;rlnF*jmmG-G5pF*Pw|W@RxpIb$daR0J#vGA24YWMyM-ZE$aMWhi5BZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+OhZ*FsRAa-wQWGX2DBVjl(Ib|_2V`VdBHZ(CcIW{vlH#Rn6H8wFfI5J~mHexCYR3rrf06IEEWny(_Q)O~#VQgu7WpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=SzMVP7#{F+^ozb!Ss$a%o{~X?kUHE@*UZY%vNlH99(VaAaY0WhirWWI8%?X?kT}bSxlqbYwa@b7^{IUvw-WV{dMAbRc$bX=ExaAaitNIy!S{dS&8(rYQg;VK+8nGd4ImI5s&rG-EMkVlXmfF=S&mGh$|CV>C2nWi1L+GcgJ>0y;WpWo~71VRU6pX>e^}aC0ar03%^BW@0#EGB{y1WH>lAHDWh5Gcz_}FfcYVWMVWjVP-fl3RK_=06IEUWq5RTa%C|@0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ufY+o^7F==gZY+o^7F;r!EbairNF+?tCbZu;r4*)N6WnpAxaxQ3aZ~$^;VPs`;UpQ!Ra4u+cZEOw$055TMWpa5gXmD@V>iI&EQVWkGIlZh38Qb#qjCaAhcCZ*FsRAY*7@aw;q!V{dMAbRc7BVR9-gAaitNIy!S{dSzd9EFg1qWI8%?X?kVifTk$`EplaMY-M9~X>V>WXmo9CBWGbaG&3V>iI&x)ZY-M9~C@BCfa%E<0Wn*+{Z*DGVbZu-SXJI&HVPj)uIWuBrWHB*iG&MP7VKp{1GdD3gIc8-uHfA;oK5PaH0y;WUWoB$;V{~b6ZaO+)b#!k-Z*FsRa&=>LX<}?;RB~ZybSNnREplaMY-M9~X>V>WXmo9CBWGb{V`MlnH#9jmGcaU0G+{DgVPQC7W@0!oH8wb6VmUN83O)rxRYFfwUr<3qODHZbE-3(Ka&L8TUteQya%C-YWoB$;V{~b6ZZ2qaZEPcFVPj@BVPZFAF<~$=F*PzZIb%38GB`3fVKgvgF*9N@H#!PF14C6pPg7q~MMg|TLsS4~a&L8TUteQya%C-YWoB$;V{~b6ZZ2qaZEPcFVPi97G&nS3Gchq^V>4wmH!(IcFg7(aVlp^6IX5?9V>}8T17Ar^P)sOPDF9++G-Ea~V_`WrH#9dmF=b{kFgIm4G-fzCG&wXjHZwg6J^?%m9tmGmMNLplK~zOwNlj2pC}DDEb1WcKDF8WUHe)woI5IFeH8440VK_8qHa281I5A~1GB`74IW<2DJ_kGs9tdAWSX4z)PC-mxL`6ePUsOd+P)tEoMJQo#X)GXADF9+JG-5O{VKF&1W@KhCH(@d~HZwRgWH&TsWHmT5WH&(yJ_bAr9tdAWSX4z)PC-mxL`6ePC}D7EEFe@V05~!+Vm4(nI5{yhHexhmG&DIlIWuKsW@I>IIW;h5VM7W&20RKL17Ag0R7FxwK}=ssO;AiIR4D*4I5IV3Vly%^G&4CeIXPuEW;HT6VKrhiG-YCDFl9DH3O)fm3LXhxMOaitQcgikUsOd+P)tEoMJQo%XLBqdR4D*AGBr6dVK8MhVKFpjFl1q2Vm4-GVK*^mHa0e5H#Ij$3O)w~LsddgQ(r+&Pfl4)PgPT2Qbk5gMMG35E-o%90B3SV>WXmo9CBWGbaF*ju~H#251Gh}69Fg9ahVlZVlH8f^3IWaIbH8(R!3O)mD1`8mwmSHf3crHaTTCG&eb7IAUZnIWjgfHZn9bVK8K2WnnokXmo9CTM8yCIyz8tZ)#;@bWLGyVP|D>C{uJ{bY&(iAY*l6Z*w|2Wo~C_Ze=<;L349ubaN&wAVg(ib!TT~awaJNBVl1THZwUeH92E7GC4S9F*IW_Ic703IXN&hHa1}~H#AQQNGV$iCK@_AZ*XO9D06gVIy!T7a%pa7EFg1qWI8%?baH8KXDI+9VKFi>WoBVFGBjp2H!xv2WHT~kIW=Q5F=RM5W??sFW>E@A7+VS^2s%1%aAj^NDIjBSZgX@1BVjXRGGj0_IAmgDGc+|bG-Eb3Gi5U|W-w)DWHB)`H)B%@NCsO9CIUJ-V{C78Whf~CBVjOPIXN{nF<~?^V>vltG%z-1IbkvNNLvaf0y;WuVRdd}XecQFBVjdRW@TYwV=`o9HeoO}IbKCF<&uIa&Ky7V{}bnZeeF-axQ3eZERu+F9JF`R&RJ^Y*1lrWps39LUL(jXJsfU03%^CF*9Q_G&nRlHaIY0Vl-rAIbmjIGcq|iGi5nuFfe6Y3Q=MTFEKhgY;R#?Msja$MrmwiC_!^`Wpr~UEFfcVZgX@XL2h|Lb8}^MCM+OhZ*pZiI&EcbZ*qA$I#YCVWnpb5DF7p3H8nFaHDNbnVlgr>F)?LkI5K24FlIA3V=*#eWHM$jUJ6k!VhS%cIy!SVAc{(~%bmD-fDF7p3Ff%tdWnnovIAb+rV`gSDW;QiqF*r6kGG;kAWi(|pU>r}Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_Uov!WZ)|g4GGt|9b!T5+V_|J&a$#RGaBOvFX>MOQXmD^YXmo9CY7hV~VQzU}c4cF9Z*neZaBu)&Zh2o{c4cF9Z*pHaXmD^YXmo9Cxd8w#Ze?^Yb#!TLb1rCbZ~$&)bYC)cbZKmJUpQ!Ra4u+cZESlAH4QpCX>N06a&#zTZ*FsRAXIs9WhN;ABVjc+GiEd~VmW0sW@0roF=J+CWHU5lV`VlmV`DfrF*aukR||UzH5EEKX>N06a&#zTZ*FsRAXIs9Wm08lX>)XPc_t|UBVlGXH)CO8Wo9ujWHdNtWjHlrWM(rmH85i}Ibu0CGB#-nR}*^*H3B+1X>N06a&#yu03%^#H#j*mIWaP2I5}iuVKHGgVPrRBVKp*lWHm51Ffuu73RimyH4{2IV{dMBVQFr2C}VGKb95k7d2nSWDIjBSZgX@1BVjTzIWT59W@I&FVq!LCH8No`WHmBkVr64DGG$>mH8X7rR}p&(H3&L7V{dMBVQFr2C@COgZ*FsR03%^AV`5`9GB`ChGc+(YGB;y4FfcY`VPQ67W-&BnIX5tG3Rebu3N;!!I%98cbYW?3b0}kPZgX@Xb97`nI&*Y#X>MmGDIjBSZgX@1BVlD@W;ZxCHD+cxH8f>2IA$_1F*h(aWHVx7VK^`|W@d2;R~UN=H5xiPVRR^CZ*FsRAaitNIy!T7a%pa7CMh6eZ*FsR03%^!G&eA2Wiw_rV>dEoI5jskG-G8pGB7hRW;9`8Fkv%u3Rf6=3N;8iI&*1yWhf~iV{dMAbO0k^VlrZ4WnyMHWH>Q3WjA6mG-hKpFkxjeVK-xAVl-tkbqZGodkQrOIyz!yXK8LIDIjBSZgX@1BVlAWV`4QoW@0%oGdVP6F)(H|GB{&lG&N#kIb)XPc>q#nXK8bEa(OOjbZu;a3N$)8ba`-P03%^FWHvcAG-f$rG&VG3WHLEpVK`!9Ff}n{H)3XFW@BT33N$)8c42IFWdI{#IW{#hI5J{4V>o4HG-Nh3Fg7zZVq#`wFl9AiIAbzlfC@A^I%RHjX>@r2BVl4SFg0T}I5ILbFlI4gH!)-~Fg9T_Vlgo>H)J_7G-QAZG&(wVVQh6}03%^CGh{eoHa25rHfCcvF*!71G-WVlW@a-rWMpDEH!^1Q5&$|nQe|vmbZKvH0CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uPZ*pv8Uol@XQe|vmbZKvHE@*UZY>NsfB|17rX>4Uea%p5|Whi5BZgX@XV{dY0Iy!P?W^83+bZKvHIyzK&aAhVeAYyNCY$*UEVP!NlHeqCAFk@jbI5}fxV`gDEIAddEI5IJ2F*!M6VSx%sBZ~?r8ag^`Z((F8L349ubaN&wAY*TCb95j4tiW`zn#9*YVmF*-VIZ((Fca&K)$X>4UEL349ubaN&wAY*TCb95jI&)!mWmIoQX>4UEV{dMAbRa=Mg-F<&u8X>4Uea%p5|WiDuRZEU0pFBv*Ib7gcwb!KK|awubUVsCRgI%98gWjZ=xY&tqZb!KK|awz~KVPa)CH)dfuHeob5VKX#gWMN}5FgY?gF)%bVHa0n7IgAQX7o-X=5;{6_Wpq$)b7^#GZ*C}KZ*FsRAZKiCIy!b`V>2cx03%^$W??g7VlXgaGdVb9W;8cqFk?A6Ffd|aH)divF*!Jn3Q-WG3NI2mI&)=oR%L8&V`+4GC}VGKb95kQY;8I^c4cETCMf_TVPRo4H8VJ3F*Y}3VlZSlGBRZ{Fgar~WjJCoWH@CrF^~#T5Tpt(2Rb@)WpqbjX>KTHY;R$7DF7p3IWRP2H)1h2V>x9oG%++YG&C_~WM()vH#B24W;A3sk_u4;qzW$wIy!S@bWmw@V`wO5Y;R$7DF7p3GBh+YWnngCVK+HqGB;y6Vq-RAF=jSpW@ceBHZwRflnPM=qzW$vIy!S@bWCq=aA|I5C}MAKY$*UEVPZC7V`MgCV>dHnWj8QpW@9upGiEh8Vqr5fWn?&JHkJxe1f&Wt8#+33Wpq+yY+-b1c4a7Ibz*OGIyz%-a%DO?VQe}&Olfm;Wo~71DF7p3W;il2G%z?fH#1^mG-hREIc8)rG&VD1Ib$_BWMesDmLSmb97;DV`V62Y;R$7DF7p3G&VS8VL3T6FgG|hI51;2Gi76BWHDu9G&MD0IW{(8oC;9|qzW$;Iy!S@bVF}$WhiEBZ((#SAZBcDVRS4YW^8X^bSVHMVKy-|H8eCbF*r3fGc-9jV>2;gIAt+1WMninW@0xpW1b386Ql|+5;{6_WpqPtZe>Jia%E$5X>V>QV{dMAbRcJJZ8|!3Wn(iYDF7p3VK6geVmD=GW@TnFWMyGCV`DQhHa0b5WH@CvI5RV5pbAkCqzW$rIy!J{VROUolf}b#h~6E@*UZY&HY{FK1t3b!KK|axQ3aZ~$jtUt)D;W@U0;IB0NiE@*UZY)%sdFJ@_YWn^D-bY*Y=Gc_UQBGGt;kHe)$AI5;zArwULQuL>?1Iy!K2WpH6~Whi5BZgX@XL2_egWpsIPWl3ZzEFfuabSVHMVPRo7HDfX~V>LB0IAJ+rF=Jt2WHvNrH8x>5WjSIqIjIUz7q1E~4LUkzWpra`D06gVIy!S{dSzd9DF7p3F*!3gFgP_aW@TYCF=8+_Wn(yHFgH0fHa253Wiv52s|rvHuL>>*Iy!V^a&0JAZ*pv8CMf_TVP-O8VPZ8lF*r3hVL4`GI5{w3Wo2YxFgG+|V`4dCHLVIz20srXMrCwkXk~H$MrCwkXk~IPXmo9CvGlXmo9CNf7}rWMy!4Xf9}QZ~$d+bZB2VXmD^YXmo9C#|kSEIy!K5b7&}3EFg7mb7^O8Wn>^}ZgeRCBVjmXH!xykGc+|hWi~Q5H8C+VWHK}{Ff=hYWH~Z8IXAZoO%KNkD-$|8XJvFnc4cmKO<{9uD06gVIy!S{dSzd9DIjBSZgX@1BVlD_W;J6qVmCNrV=^}}F=1q8W@BPGGBGtZF*q*5yuKE0y;WlY-M3`C@BCVVP!ZnG&eS5FfcJVVKOo?Ff=hXH83$@H!(FiH8walX1xkc#|kS5Iy!S@ZgfRV$iW;ZfqVK_2oVq!SI3QY#b3M&XYI&*1yWhf~iV{dMAbO0k^V=-egG-769I5%TBWj8WqGG;S5F)%nYHDhHmVPi63!3s?V#|kR~IyzxwWKv~eWMy(FDF7p3V`XJEH8wIeGdE*5WH>W5F=Q}fIXN;gVqrBlHf1$r!wOBu3M&FSI&x)gZ+2x;WnpAxawsVPBVji(GGjF`GdDJ5GBz+aGht>qHexbnHDxz9VlXu{Wn{$)O=trEIyyymWo~p(X>er#V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF-3M|Zgfy-aAhuNbZuQ5Wiw+mWoBkHV>UD}VP;}tI5{!O3Qq&n3M~aXI&^YnWhf~iCMEzQVPP{gFgQ6hHDoe4I59G1HDhFDH8*56Ght>jGiGEqGRz831JnvF1v)xqaA;+1WpZI`C@CN&CIBO0GB7h@H8e6aGh}2lH#RY1Gc`3iV=y^4F*so{GdMD0&I(Th)Cw&aIy!f0bZACtWo%?9b97`nI&*Y#X>MmMAVwfmIyx#TASNaNBVjo)FfunYH8nOfFf=nbHezIAI5A^3V`4KhHZ?LcH)7BVPZrb)Ed@F{Vs&Y3WGE>hCMEzQVK^`~H8C+XVKy`}GiEX}H8wM1H8eIbIAJwrGGsYnVbTgu184&PIyzK&aAiVuX>4R=asXp&VRLh1bz*OGUol@XV{dY0Uol@XWn*(+F<&uMd2nSyb!lv5WpXZPbZuMm@2VXmD@@2`IB0NiE@*UZY<&*^FK2RTWM5)(X=G<*E@*IY0B3S(WM5xma%p5|WnVaGaBwbYbZuU>Z*pZiI%jM;I#Xz2WMy(wbYW*@DF7p3F)%VSFgIdkG-GBlFfn2@H8MA3H)UoxG-PICH#uQB*a}4)+zKNIIy!S`VPs`;Q*>cxWhf~iV{dMAbO0k^GGk?7WH>W3IA%FxF=RGmWiw$jW@2SIIAu0uH#jgg+6qMm@BsiiI#Xz2WMy&yV{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XQ)ppiWpXZPbZu-^1^_Q}aBp-jXmD@KlPbZu-SXJKVxFflS>VPs)qFfuh}W-vH7Fl9DmG-5S2GB7h_G%?-^R0f*>8z6FFb97~LX?kUH0CHh-bY*gBdS!AgaBOvFX>KlPbZucI%j2WWpZJ3Wld>tZDDY8C@BCVVKFl~W@9-yG%zqXWn^P9W;HV~IALaEH8Ns2IWak5GUEzYS_3OVa&lpL06}tcVRDb5bYX3903%^AIAJj|V_{@wVK`=FGBr74GB-G8VmCQqH)CQqH#cJJ3N`{dI&N=wC@BCVVKg^5G%z$XFlIM4IAt?9WjQf3Ic7L!He)q3HZfslW9SN4>LV|8M0b6+uEF=KCXWnVF0F?3~YUol@XOmAmrWpZCJUoli^ZDn(GVQp|OXmo9C?g}P4I(B7a03%^IWMeikFkv$}He@$rVKp~lW@a)pVP!KoH)1(sWHL7J0RTEWP;YZ-bZKvH0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolW`b7^#GZ*DGVbZudNqHZeIjGdW^0VmCQ9IAS+5He+RCGBGz}WBm#<0y;WWd2nS@WpZ|9awsVPBVl7@Wi>J}IAb<7He)w5F*GwbFk~@eH8D0bVK`X<=+>dSxsiL}_zlZ+2yJRC#b^b148LVKFsgIb>usGGt<6V>2@}VP#`5G&DIfWHV+lGB+_fW%CMECH)FB8ag^*WMouwVQF+IQ)O~#VQgu7Wh@{>X>((5c4cx@d2nTODF7p3Wiv84F*al{W-?+pGcz<|Gh;V4Ibt?7HD)q5H)b$l^$JxO{R%S;IyzxwWK?-@Whi5BZgX@XRC#b^CMf_TVL4(qGchnRGB+?`WHvc9Ib=6CIA$_3G&D0}VKg!_Irj=x3;hZ+0y;WjWMou%aAhbd03%^zW-~Q3Ff%tXW;r)xGB;u{H8nS4Fl9M4IX7Z3W;i$b3RV3IGZ8vEV{dM5Wn*+GZDnn5a(OyBQ*?4=VQnTU03%^xGdVFeGGsJnWie!AGh#C_GGR71H83?bIA$_2H8N)V3RMrK5GYe+a&~2M08?dhc4cxdXmo9Cxd8+(WMOn+068@^G&y85H#ajiVPrL8F*GtaIXPx9G%{snW-w$kH!f&&ZEOb%E&@6_Vr6G(ZYU`LBVlA@Vl-njIW=WrGc{v4Ibkt2H8f>oW->H0F=071GdBMUPzMVx0y;WnZe%Da03%^EFfuY`WHmTsHeoVkFlA$7V>M%BWH&Z3V>n?lWMnx33s46OE&@6_WN&U|C@BCVVK+25IX7iuV_{-sG&nS3GB`OjV>e+oFl01jFlI9|I0Fk%2MaC&Iy!P?b9HQVC@BCVVPiHnWj8lvH)1(tIb>vFW;SIoVKg~8I503YV>2)^WCaUQ;0pjcI#g+GWpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=uRFF<&uhZE$Q~F<&uMX>Db4E@*UZY#$3fIyy;oWpZJ3Z*l-5VKFskVP<7AVKiejGc;x~I5lNBGBh`2I5A~qFgG$eFdqv&0y;WVaA9(DWm08qVRUJ4Zd74nY-LhqXK8bEa(O5z03%^$IALTqIWT50I5{;mV=yr?He@t7VKQZAWH4l8FgZ5~3tt}#Jpwv9a%FR6bSNnRBVjXSF=R72G&MM6IW;q8VPR!7IAJq2H90kAWMpA9IWY?hUmpuS9XdK=Z*Fv9X>M~UQ*dE&b7fLxY+-b1Z*Ej!Vr*qeWGNtHZ*FsR03%^DGGRDjWjQl8HaTKsH#K5pWo0sBI50V4WoBYAW;Qqt3tt-_3q2n?I%9HWVRU6EQ*dE&b7fLxY+-b1Z*Ej!Vr*qeWGo<5d2nTOCMf_TVKrlBWMwolFf}k^G-G3AH8*59WMX1CH)S$0F=jO}W)BNr9Ulul7dkp&bSP7BVRCb2Qe|vmbZKvHRAFLlWl3Zy03%^GWHU1~VrDaBH)J?8IWjk6H)dgBV`F7yV>K}`HDWmt3ttrx3qKtoV{dMAbO2>IF=AmhGG#M2H8^EsGh}5jIWadlW-v2hVr61wW@8fzUmG6_JrX)Pba`-PC`4g&VN`i=Wl3ZyAY*TCb94YBVK!u9VlXy2GBIH?GiGFFVq-KgF<~+?Gi5O`FlAyfG8GG75FZOY3_3bxa$$32C`4g&VN`i=Wl3Zy03%^xGhtz6WMeZhVlXpfHZn0{Vq-UEGhsMoVK6Z?IWRXD3ttK!3q2V+I%aQjMPXxTD06gVIy!S{dSzd9EFfWZbZ;pjV{dMAbO0k^H#lNsHZ(V5GGsAgH8?UdF=aF`VPh~cVmV_sI5{~q84F(*9}7JQIyz!yXK8LIDIjBSZgX@1BVjpZIXGcqWMyM9WHe)BF*P)1H!v_aH85l{G-72kHDMbIUj`owJqS8FWo~3BDIjBSZgX@1BVjf;W;kIoFf}(ZF*#*3GBGnWWo0orV=^#iVKZSkV=)~IUj`!$Fj8e_X>)XPc>q#nXK8bEa(OOjbZu4UKXmD@Ma|b!25YVQypqb98cbV{~J6VsCR_F<&udZf9w3WnVF0F;z)LcyM8EWG-lQZEPnCF*-VBY-Md_ZgfL$b#8P3BVlGaWn*PxGB!9fIbk?uWI1IwW??xrFlIGjIWRFWVKXNSF*-VBY-Md_Zgg`1BVjjYH!(LcIWc22G-EI{VmCK5Ibt+oIb<_AI5}ZCGGQkRF*-V8b!KK|a&rJ9VPRopW;iuCHZe3aGcz|hI5%TsI5;*qVmCHsG&yB9VwY-w&~03%^FWH4f5HZ(amF<~)bGh{P0FgY_ZW;i)GVPP;bHa2DR2mm@dR%LQ@Wq3hya$$KyWpiTyb98cbV{~J6VsCR_F<&ubZ*pZ{F<&ufY+o^7F;-=AbY*x!a&lpLL}hbhE@*UZY0I509aGdMP5Gh<_7WMpJ~3o|-8L1bidWpi^+W&k5$Ib$+5V`DL7W@0orW@2SDIW#wBHeon3V>UHoHD)m|dxWoBV@Y;*u4VPrEhF=II~W;A0pIbt|wFgRg3F)%q~WnnNhWHmN6Hhc>+Iyy;ib7gXLLvL_-03%^GVl!bhIWRadF*r0fWnwsCGdD3cH8f#iVmLK1Wi>f`3o|-8Np5pxa&%2^c4Yt~VPj@tHe)n0H!?IbF)=nWVPP?1H#lZvV>CE5WHK=}WPA%VIyyyiVRK~wBVjaQH)J(3H!);1HZeChVmC2iGchq`Wo2YIH#s#lW;c8bGax!TL2`0oc~o*?X>=%KZ*FsRAXIs9WhN{jOl59obZ9IfL1bidWpi^+W+?z8VKrhgWo0rmW@a^IVlp&lG&wRjFflVUF*h_cV>CB2H7*NP9()Tk4>~$?Wpqhyb7gXLL}g}Sb!>DfNp5pxa&$yxW?^+~bSVHMVP<1FW;Hi4Wn^JAG-P69VPY_0V_`8dF=aGlH!?UeGB68O4SWkT3_3bwZ*X}j03%^BG&p5BVL3TtW;QTpHfA|tF)=qbIb$|vG&5vkGB-Ce3snky3o{HlI&)=oNp5pxa&%2^c4a6@ZgXXFbWLw|Whnq7VK+84IAdluVPi97W@I-uG+|~mG-Wa|FfuhXH#ab3G&BoU3VaJQ2Rb@)WpqVyVRL0DMRH+tWhnq7VPa)rV>V(iG%_DfDIjBSZgX@1BVjXPH83_fGGQ<@IWROhGht>pVKOo@GC4IlIb>!zW;i$tRR(+uGYC35Xkl|nZgXXFbVF}&c_=9$V{dMAbO0k^I5lKuVlg;kI5lNAIW#z9WMnolVq-TqIc8xsI5{ymItx_>d)Z+2xUDIjBSZgX@1BVlD@H!x-}Gh{F~Gi70BF=RMqVqr5eWHV%BGiEa}IWas7RR(+uGYC35Xkl|ja$$32C@COgZ*FsR03%^yHDNF?W-~A_F)=VXF*0LhF*7+eVqs)9Vq{`5V=*>93snYu3o{5hI%r{YQe|^#dSxgnAY*TCb94YBVKZZ7H8?jgW@RvCFk&||Gh;YoHfA$9WMpDCWHDwjI6wdN3WH&HoV>C21W->A~GGa40F=8|`F<~`gH9`wj27C)M4LUk@X=QgPc5i89Dk&giZ*FsR03%^JWHmW7F=k|DH!(6}F*IW{FfcPUG&V3~Fl970WHK{E3snnz3o{csI(BJgcPL|TZgX@Xc5i89Dk&giZ*FsR03%^HW;r=zVr4WlVPiLCVK*=|HaRz9Ibt_uGGaC{V>Dz&3sn((3o{xzI#y|AcPL|TZgX@XL2`0oc~o*?X>=wmAa-wQWGX2DBVlD_GC4FjVK`$pFf}k`Ff}$eV>4klIXGrEWjHf6I5tQNRTz8=GYC35Y-Mg|bZ96kAY*TCb94YBVKXo{I5#vhGdDG3H83|}HZ?P2H90Y4H85c|WHUHpF-i+n27C)M6FNF)WppTWbYwa@b7^{IUvw!TV{dMAbO0k^F)=x0F*GqTGhsMlVKg`}GBq|~Wo0;IIb>!tGh;b9Obb;JdDfb97`nI&*1yWnXkDAY*TCb94YBVPP>aFf%qWVKregVlpx`WMyJvGB9N^WMeWoGBjo|W=;!L5qt|XAUZl}ZgXXFbVF}&c_?#qWI8%?X?kT}bSxlaZ*FsRAa-wQWGX2jV{dMAbO0k^VKgvdHZeIkF*!0aIc8=wG&f;6Gc+_}VmCH3WH>csPzzNadcH(D06gVIy!S{dSzd9EFgAoX=ExXAY*TCb94YBVK^`{VrDinI5s(CGh;VpF=IDjIW{phF*rChV>L5lVp0oL7<>ye6FNF&a$$32D06gVIy!S{dSzd9DIjBSZgX@1BVlGWWn*MyGc#ggI50OgH!);mFf%zbFf%kZWHd7{H84~QRS|p(GYC35V{Bz%awsVvV{dMAbO0k^G+{VpWi~Q2GB;y6VrF7EVPR%vVPrXCVKzBqHZ^85Rtr@Ido3nV_`I5H)LcpFk@snVmM+jH#KH3W-wR_RS|p(GYC35Vr6G(ZYU`rV{dMAbO0k^GG#JmFkxY1VKOl{H)dgBV>M!BGc#f_I5ssfW;r!wS_@SMdhV{dMAbO0k^WMwxpWHK~kHD)n3I5#n5IASzoVrFG!WjJDGWHe@FTnkkOdye5jr|abY*g3bZ>GfV{dMAbRbD|WpZJ3Z*nFn03%^JH#cN3FgaskHaKKsFf}w`GGSygFf}(bF<~+{H8(SA3snz%3o{5hI&W}ga$$6Daw;e(AY*TCb94YBVP-HlIAUfoW-&QpH(@q8H8D6jH8^57IWjUiG%z$_Hf#%327C)M2s%1%aAk5~bZ>GkJ}4<5V{dMAbO0k^WoBeHGBYq{GBq|ZG-fhkGh#9^F)}h_Wn(!tG&DA4ZVOcgd-gFf%e?G-fe4H8n6aGc{v1H*gD8ddN2G&f{oGGZ}gVP-WjG-fa~VK^{mVKFjgGBh_bb_-Pod(3snYu3o`;bI&W}ga$$6Daw{t+DF7p3Ha0ghF*i76F=aC_V=-kgGcsW`W-&N5H83+;QY-M9~X>V>{F<&u3a&lpLRB~ZybS`LgZES%HD>^zwZE$pX03%^yHZ*21IW%N6Fflk|H#0ObV>dQ2GGS$9HZf&0HZ^8}3oAN0V{dG4asVS?IXO3EGGjGjWie(qV=*#0F=An6WM(sCVKO&kV>Dr8feR}fIy!S{ZE0*_a%psVC}VGKb95k9Z+K;FO<{Cpa%o{~CMh6eZ*FsR03%^xWMnurHZo*0Fk@miV>LKsVPrO9Wn(ZoVK*{0GB`GW3r!mE0RTEWR&RJ^Y)xTwWpZg@Yyfj~a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uOZ+K;FO<{Cpa%o{~E@*UZY@G`TAi}#KLvM0r04-y0a%C=PbZu@rmXmD@Mx7Gh|~oIAt*~HZ(9WF*jp4F*9Z~iwiP3I&5!aVRUJ4ZU7@;Ib%0CGBG(bHfCXEG&p8AW;SCvFkxjfI5ajlWMX7xiwiP3I&Echb75y?03%^FFgGz|WivQtWH4egVlgu`G&46cG&40gF*!6eF=91~3o<%7b8um903%^IH)1(AW-%~gIc8)tH8(IdFg7+cWMO7DF=l3FGhsA50{}WYMQ(I*c>r^Ca&=>LV|8M0b6+uEF=KCXWnVF0F?3~YUol@XOmAmrWpZCJUok~)baHtvXmo9C`2hzAIyzEiZe(S0IyzEiZe(S0P-$apWpX+?a%FC0WpYqyV{2t{P;7N)X>KS(bz*OGCMf`NWo~3;axHLaV{2t{EpTjgXK8LOXmo9CBWGbbH83+XV=*u^IAu0AHZWs1IXF0EV`MQmH8EslH#cI83quB`2oE5_yC70!Ze(S0P-$apWpV&%V{2t{EpTjgXK8LOXmo9CkqbCFI%i>RWpH6+03%^FF*!IfVlz2pWH>Z6W@KVwV`eroVmLNAG-NhoWj8sI3phGDV{dM5Wn*+@WB?;!Fk)jeGBGzWHZnG5V=`ejV>D%DGc#l{Fk&}1G&eXm!UzC5I!9q`WpH6+LvLMn805~@>F=jS6Fl91iGBspnWMpJxH#uW6Vr4R7F=k|8GA?LzZETkdHwZd9MQ(I*c|vt*Y-D9}C`E2`a(N~x03%^!Wo0p8W-&4|Ibt+oH#s*oI5;*pH)c3DWMw#IW@I*#3t0x23pX`7I(KPwXjEl*bairNC~0nVEFfcbVsCRgI%98gWjZ=%Y&tqrWq5RTa%D0^EFfcbVsCRgI%98gWjZ=%Y~p~XDF7p3FkxjdG%_$`GdE>7G&Ey4HZw70HZW#nVL3H5W-(+pl?z!jqW}Oxb!lv5WpV&xY+-YAV|8M0b6+uEF=cLNX>Mg-F<&uNNknpCcT8z>bYC%FF-2~4a(O~^X>4R=axQ3eZEOSw79hgAAWUyzWNB_^AW~&!Y-M9~VPb4$AVG6;Wpr}@EoyUbZZ2qaZEUOu055QCb!TaAE@*IY0A+4xX>Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GIC{ZWMy(+GIU{bXJvF>GH`5lXK8LJ2XL4_Ka9>|^Wpi_7a$$6Db1rCfZEQ{u45!BVjf;HDzNmF=1piV=y>0VmC2iVlp&jGdW{1Wn(clG&i9ODmpr1Y;|%{VPt7_a{wb@G&L|~F=R4hH#0J3F=I10G%zz^G%`44VlXu`Ha0dep$jTHI%#A8BVlGXW;QuDGh{epH#0OeV`4KlI5lH8H#IggH)At4V>9pp06IETXklb;cSB)wbY*e?b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;i$^WN&vvVRLk4axQ3eZEQ&p055Q8d2?xFb6;Y0Ze(m_E@*IY0B~q|b7^C9UteN%Ze(m_UpQ!Ra4u+cZEOz%05557aCLMpXmD@M?JbYD1VaBwbYbZu<;0S5>=I#h3OY;!s~O=Wa)X=8IBP+@LmY&tq^Wpr|BV{=epZe?sxY;|X8ZYV=_VsCRMDFAI{baH89b1iUTZe?sObZ>8LEpTjgXK8LOXmo9CBWGb{H!(G3Wj8l9H!?S2H8V6fGdDG2VrDZjGB`72VKy+N3rGgr4hJB@yC6+vbaH89b0AP*Ze?r$ZDn+FX=8IOaA9s`Y%O$eZ)`1aY;|X8ZZ2qaZEW-p055ZNa%pa7E@*IY0CRM5X>MmX>Ml#EpuUZX>MmOXmo9CuM00aI%HvVVE`jxVm4-DFkvt>F*Ic|W@ctFGB`71VPZF8H)CXEG-5I`uM00aI&EoiOl5XuY(sB#Zgc=6VKgx{H)1w9GGR6~WiUB3GB{>4Vly{mG&yB4VPY^eVXq4>Iy!f0WOQf%BVlA@W;AAGH8f*lH!x&kG-G6AWH&Q7V>M(oIb}35Ib^R3FFHDCWoc(jH83(UHf1+uH(_KjHDNL^I5#;kuM00aI(2hlXJr5*VKOshGh{VnVPR!sI5se0IW}TpH#K87H)Aw8IWc25F|P|RIyz==a&2LB03%^EIX5?DG%+zaI59S3Gc#ggV>M+pGch+fWM(!sVq`b-2mm@dRAqQ{b#i4gL_}qCV*qn>a&=>LV|8M0b6+uEF=KCXWnVF0F=uRFF<&uMWq5RTa%D0^L}hbhE@*UZY(oeRIyz%-a%BKtF<&ubZ*pZWXmo9Cy$dTkI%#fhWpV%`VKFi?WjQotH8U_aGBY$}WnwisI5sjdHZ(9XWim82Fue;aIyy;ic42I3WB?;!Vqs=CIbt$lIX5&nGh=09Vq!TsF*#vkGG;SlFl1#py$dT0Iy!A(Yh@@zVRT_sd2nS(WGMh6VPR!qGi709He)qmGdMFiH#a$AGh;L|H#9IZVq#-8VY3TO3cU*}7CJg@VQXb5L}7GcRC#b^Nn|V_b!l#NGcsRvDF7p3W;tUtF*0Q~W->HoHZ(XlVK+B7I51^7F=1k2WH4qjwF^xYy$dS{Iyz)wbYWC^aAhbdAY*TCb94YBVKy{5Fk)peIAu3uHf1<8F*h|~H8W*6F=075HaKKBH@6E-2E7X_2s%1xZe(S6C@COgZ*FsR03%^xH#j*tGcz(dI5IRdGGj70Gch(aWHmW7G%_+`VKQR53rz;S3o92oI&W}ga$$6Day>mLV{dMAbRa`-Y;|pJNn|D|AY*TCb94YBVK`(lGiEh6He+RFW;JFqV>mKpWnwTeIWaS1IA&orHMV?G0Ayk~Ha9RbWic~1F=RJ2H8^BqGd4LnWMnfpI5uH1G%jd#ZEX1g2M9VkNo_}UX&`BCbY*99VRUJ4ZaO+?ZD)09P;7N)X>KS(bz*OGCMf`EZD)09EpTjgXK8LOXmo9CBWGbYHDfbkV>V(rWHDhlGBsf|H)UfnW;Hc4Fk~|~FgG;73p)n+0S6$$yC6wzM|Ei+X>N37XL4b5X>V=-X>Dh9X)SPUb!TaAE@*UZY|9HTIyz=@Z*Fu(a$#*{Vs&O_WpV%`VP#`CWHw_rV>M(mVPr5lGcq|bIWlEpG&M9~WH(|oHOmVxIyz!uV{1loVQpn%b!KK|asVS?WI19uG&VG5IAdgFHDoqqW@a*GVKp%}G&E*4H(_RG%L^|$I&g1uX>@6CZU7@;WjQl7VKg>nVPs=4HDx(9H)A+AF*7nVH8L|aHe_XC%L^|$I&N=rZDDKxBVjc$Gd49iG-fn1H#IY1WHe)BH#9J0F=1q8GGjP2GBC>vFFHD5Y+_|(ZvZ12*iF=Sz8G&3?cW;tXtHaRylWi>Q8G&GbS`LgZESrH055G}bY*gBVQemFaBu)^VRU73X<=+%IB0NiE@*UZY~Bkb6goO-b5C$(ZYX1KZgX@Xb97`nI&*Y#X>MmGDF7p3VK_B6H8EmkGc-3cGdW{nF)(6eWo9yBIW#w7W-v20(hEis-U}oYIy!G~Wo{^AZ*FsRAaitNIy!T7a%pa7CMf_TVL320V>B}`VL3B4IW{q4Gc{p1W@2JwH8D13WinxAG1Lo265b0W6goO%Y;SXAC}VGKb95kcbYwa@b98cPZf7Pb03%^!H83|bG&E&mH)JLHsWnwsFHZwFbVq!F7WH~ToH(@z2H8?XdW@Ok4MiSl&BnUb>Vr6G(ZYU`rV{dMAbO0k^H8Ny3W??fkH!wC~HaTH9VPiBkI506|W->KmVPY~l+6zVo-U}oMIyz-;WGE>hV{dMAbO0k^V>UEoIWah7HDh5gWiw+nWHdE0HeoepWH4c7G+{I`+zUnq@BsiiI#h3OY+`SC0Ap-nb8};LVsCR_F<&udZf9w3WnVF0F;s7FY+`SCE@*UZY^DkTFJ@_YWn^DuWo&d|Uvz10WiDuNZ~$g$cx7Z?Uu0!$bYWj#bZKp6UpQ!Ra4u+cZEW)h96CB_ZE$P=Uol@XX>D+9E@*UZY~l+wIyzK&aAg1^VPj)tI5sgkVP!LAIW}Z4Fg7=1I5=W8V=`o7H!?J4WLXXXIyzEiZEtpEQe|dka%FB~WdL(@a&=>LV|8M0b6+uEF=KCXWnVF0F>PgSZ*qBGF<&uKWo>VEWm08kWpZV1V`VOAbZu4SaT`3@AZ*FsR03%^!F*s&oI50C|WHd53Vl*>hVq!5hWM*VGWHL4}G-EO63rQ0B3nvshI%98gZe?`fW-?)A=?h5``3ol$Iyz%-a&BdEb0}wQZ8|!3Wn(j2I9(|qV{dMAbO0k^V=`hiW;r!5I5%N1W;ii7WHUBpV_`HgFfue`W@RyB>kCN|`3olvIyz-;V{C78X>MmmVPj=;C~0nVEFfuabXzlBDF7p3He)hnI5J{nV>x9qF*q?dG&EslIWl8mGcaU0Ibktn?F&f@`3olyIyz-!XJvCJXKZacI%#%gV=`MYGF>SEBVjW(Ha0aeH8(joWinwhGhsM4H8410GG$>nIASs~G&%1JNe=l7Ck;9}Wn^b%L1b!SV`Xl1Mqy)Rb0}$UbSxlgZgg8RT`2$~VP!C3W;SCoV>dQ5HZ?UiGc{#0Ib>rwHeoqtW;8KoV(|+}3;7Et4LUkzVPj=QWM^e_C~0nVEFfuabXzoCDF7p3G%++WGBIQ@W@0fiVKOx|GcaK}VKz50VK_E7VKp*2^9xA}`3olxIyz=yV`XzFXKZacI%#%gV>DYfT`2$~VK^{iIW}f9W-~W7I509|H#lQqH83$YHe+TmI5cB7X7vk64fzWv4mvt!VPj=ZZ*py6Y;!1QY;8I^c4cETTQ*%O03%^!V`gDDWHB;iGB-41WH4ehGGZ`eFfcYZV>x1CG&C{y3rP&e2>?1eLT`8gb98cbV{~J6VsCR_F<&ubZ*pZ{F<&ufWp8a?F<&u4Z+I?fbZu<=3nMx@Vs&O_WpV%`VPaxqVmLQ6Vm4%DIAUgDHDNJ1HaIe6Heon2GdN~AG4KHZIyymhWNB{zb98cbV{~J6VsCR_F<&udZf9w3WnVF0F+p`?X>TrQbZu+`3^WuvIze@0X>UYjc4=c}C}VGKb95jW3^W2dI%9HWVRU6vZ*_8GWhf~CBVl1SWoBYBF=J+CGBGnTIAbt3HDftsGi75rI5A{mGiCk@Rssw(2s%1!X>)XCZe?;Pb7^{IUvwz|BVjpXWj8T3I5=TsHZ(FcHext2F*0UmH!wLfVP-QpW;g&0Rt7f+06IEBb!2I8L}hkqV`TtiY+-YAV|8M0b6+uEF=KCXWnVF0F=1?9F<&uhZE$Q~F<&u3b!2I8L}hkqV`VOAbZu-43^qDCNpnthY-|7{VPiOAGcz|fWHvZsG&nY9WjHxBVKO#3W-w)BHDP39ISULnIyzHjbX0Fnb!=<^BVjQxWo0opI5jb5G&nY6VKHVjV>4qnF*r6fVL45bX0Fnb!==Y03%^CHf3UAVmUKqVly)~H85m2V>M$qVlrW2HZ)>6HDzK23|J8h3^o%wI%#uGb!==XV{dMAbRc$bX=ExXAY*TCb94YBVK8B0F=IAlF=jY0G-769VPaunW;kSKGcY(cHa9giH3tk>5ep194LUk=Wpq?;PIYW-D0XjYWGX2jV{dMAbO0k^GdMOgHDNe1WieqlV>e+;QY-M9~X>V>{F<&uGb!=>5Vr*qpa$#w7E@*UZY!3`0Iyz)wbYTD^VK6XaGG#Y8WnyMBWjHxAV>U52Vm2^jF*GwWF=IGnG7k(RIy!f0WOQf%BVl7TVlXyjH!@~sF=AseW@b4uW;8QoFflb_H!w9}GGz}8BRV>0Woc(KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIMZ*OdKUovoPb!TaAUpQ!Ra4u+cZEO_`1TS-FVPtQ2Utx4?VRHaDF*7hUH)1(8Fk~|~GB`OiW@IsDIAdfrH!x*0Vlz1|Xmo9C_y__oWNBk`X>V>}a(OOjaBu))bZKvHVRCt2IB0NiE@*UZY!3qfFK}#iXK8LOXmD@Ma|b!25M?JbYC)XY;|X8ZeKWPaBwbYbZu--69g}EWo~3;asV+iW;JCpVlgx@Ff}x0Gc`3~IA%CuIAb|AIWjY0HeoJkbZu;G1`8mKlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIKWo~3;a$hoJWoBV@Y;<#9GH`5lXK8LVK8N8F=l3DH8D9hFgas6W@cq%GcYtWVlZMfGh#G2G9C;{0XhsQ4>~$eaC9hRZ*FsRAWv{~JXAg=DF7p3WHw@DH8?h6H)J$4H8?dmW;02=~IbvZmV`emDG&W>mGC5;2Ha28qWH2HON(ed(C=WV1Z*XODVRUbDJt$*uZgX@XPjGZRR6Zst03%^JVPj=AHZ);kHZf&6H#RY0WHvN1Vlz28I5IJ1Gi6~U3`z|;3@8dZI&W}ga$$6Day=+daCAIWJ|-q903%^DVmMUQ6G&eagVKFgbH90qAH)SwlWo9T0N&z|yC;~bM~UDIjBSZgX@1BVjT(HZ?LeVly{pVrFAyG&V9fVmUE2H#IO}Vqs-7VPq@}N(MR%C;~bV>UDlN;(WE0y;WxaAk5~bZ>GkJ}4;wBVl7>HeoV3Vqs)6H8C(ZIALNiW-?_mW??ioWMnWkHDWdlN;(WEH#$0UWpQw(AC}VGKb95k8CSfcfV{dMAbRbnGVksbdAYnZ{Vmo~)AYyNCY#?uNWpZJ3Z*l-5VKFo?HDWPhFl1yjH#lNqG&nM3HZ){qH92HsG&y24H#iJRHCYY-Iyz5qbO2*)VRLh1bz*OGUol@XV{dY0Uol@XZDnn5a(Q1dUolT`bS`LgZER`~054{BZew(5Z*DGVaBu)-b#7yHX>V>{IB0NiE@*UZY(NY#IyzKga%W|9RC#b^03%^IV>x0oHa0LbF<~$@H#9S0F=aS5H)Az4H#jpnVlps53^6)7bYXI5Wpr}@BVl4NI5jwBI5svoW;iioW@TYEIAUcuWi&Q1I5{(BVL3nyF*-VQVRC0>bVF}-Zgc=6VPh~cGc`73Fk&$^WjQcrHD)w2Vlic7GGsJ2W??uvH$V(AIyz)!aCB%>bY*U1X>0%^VP#=6V`eckGBPzXIAk?3GBRd4Vl-lAGh${lW;8H2WAg|AIyy#jVQpn%b!KK|aztfwV*qn>a&=>LV|8M0b6+uEF=KCXWnVF0F=uRFF<&u8a$#*{Vs&O_WpYGib7L-ObZu-%3`9CQZeeX@03%^FIb|_nW;S9mWHLBrHDzXFVPs@BI5;$BF)}qbVP-H$3`9CQX>&wra%E$5Z*qA6BVlG_F*0IgVq!BmWHn}CIXEnW;Z!AWjJPHVKF#3GiESkVlic6H92KBWH~uCNDM?eI&*1aY-w(103%^DVPj-6HfAw4Vq`EjHa0Y2I59b4V>vT9F=aSoVlpyF3`9CQV`yn?WB?;!Vq!RBG&f~7W;8i6V`5@5Fk~}0GG;PiW@2VGHZ^2nNDM?eI%HvVVE`jxG+{M0IAb+6WHx0pGGaJ0WiT^0Vqr05GdVY7Ff%Y>NDM?eI&*1yWdI{#H#IXiH8?UhGc`0fVK`%CH#cK7GGRGkIX5#jGh#L{84@-+Iz?`Da(Mt>F<&u7Zgg^aE@*UZY<&za89F*aZh2N^V{~tFC}VGKb95kbWoB$;V{~b6ZaO+td2nSWDF7p3VKrnkF=R6_WHd84WMyMDG&f;2G-YC9FfuS=F=01kNeoaIeGD!VIyymac~)g(bZ>GfV{dMAbRa=)c~)g(bZ>GdDF7p3V>d83G%#aiVq!L9F)?9bV=^~4VPY|4IWc2oH8(LcOAJsDeGD!QIyymac~)g(bZ>GfL2h|gWn*-2awaAz03%^#G%+$ZH83<`HfA?vWMnvGH8D6jV>e_rH#cNBH)3T?3{VSw3@!*dI%RBSZDnqBRC#b^C@COgZ*FsR03%^#HZWslI5A`~VPRo4GBP$dGGsMjGBh}3I5jvmWi>TV3{VDr3@!~iI&x)mWpZ|9D06gVIy!S{dSzd9DF7p3V`gDCVPrWsFgRj0WH~TqIW=N7H!)*nW@a&DW-w(mQ4CNEeGD!QIyz}?b7gXLRc>i+X>=%abYwa@b7^{IUvwz|BVl4?H8y2AI5uWsI5=W4WHdB5H!w3dHDNJ1HD)zsV`ftfPz!wwE)6<5X>N06a&$yxW?^+~bSQIlWI8%?X?kT}bSVHMVP!KgVK+8rF*7(bIWRCYHDWbpWM*bHFg0XlGdW>7VpR-K3w;bO8ag^@ZgXXFbVF}&c_?#qWI8%?X?kT}bSxlaZ*FsRAa-wQWGX2DBVlGVFl9JqWo0yCGBRX1WH4kkH#RsmIXN{mF=I9`G&xrcP#Ap-E)+UCX>N06a&%2^c4a7YbYwa@b7^{IUvw-Wc5i89Dk%UXVKFi>Wn(ZoWivD}Ha0V2H)bUEqWmybR5`7FV0y;Wyb#rJ{ZfS05bSNnRBVjaSHZ)>1Hez8kG+{6?HZn6aHe@p}Ff(B?GBjppH#l1iP<;$80y;Wyb#rJ$WoBV@Y;-6o03%^FIb~&LH!w0}Ib=9xWo2VGV>Du9I5|0CVlp){GBaac3{ZUxE)6<5aCLKNLvL_-C}VGKb95kfZ)s#IDF7p3I5ssnV=^!^H#1=~Gh;9{W;SGFFk(4kGc+|fHZwUnUkp$SeGD!KIy!K5b7)O(c4a7bZ)s#IDF7p3VP<4BIbmUBWic>0H#sz7F*jp1Gc#d1Gh$+5IXPi5VGK|OeGD!QIy!S@bVOxlVRdYDD06gVIy!S{dSzd9DF7p3WMX7tVqrNjHa9V1VP!KhW;J4DW@0ulG+|^jF*0T}V+>FWeGD!dIy!S@bVF}&c_?#qWI8%?X?kT}bSxlaZ*FsRAa-wQWGX2DBVjc*WH>Z2F*7h>WH@3sFgY_cG&f~qWo0%vVmLWDG&W@nP#Ap-E)+UCb7gc*Z+2xUb97`nI&*1yWnXkGAa-wQWGX2DBVjl&H8(J3Ib|_2IWspkG-5C~H#Rq9V`VWgV`gM#F=1y6P!fF%E&@6_aBpxZDF7p3VPZFAH#IS1V>dNqGBjm5WHmH3V`DfrV`XMIH8wOhX$(+(3@!~iI%RTUb7d%VbYwa@b7^{IUvwz|BVjpXGhtz2IX7W3G&N;oGB#yqWI1LwHDqIAVPRxqWH4(CPz!wwE)6<5b9Z5IMRH+tWhirWWI8%?X?kT}bSVHMVKg~qHf1?wFk>??FfcbVIbtji3w;bO6goO{cVTc%Z+2xUb97`nI&*1yWnXkGAa-wQWGX2DBVjpWG-hElG&eJ4H#KBtVK`(qG&MCbF=b^lFfe5~H8XDvP!fF%E&@6_V{Bz%awsVPBVjdRWH>Q6Wic~2F*svmWivQtWHdHpIXE;kVKZboG&gY!P<;$84LUkubSQIlWI8%?X?kT}bSVHMVK*^jIAJq1HDfqpW;bLvFgZCnWHUE4WM(j7I5RS2V{;5p3v&!G6Ch)6ZgX@1H8x^7GBz?XI503bWin$kG%{pmVKF&oH#jpnHf1qpbqr7ueGD!LIy!S{dSxgnAY*TCb94YBVKHK4F=Aq5IAUfrH(@hoGBGzfFlISqI50CYFfcGOHFpe927L@J2s%1rVQ^t%X>@rgDIjBSZgX@1BVjaSH#TE9WjHuBWHx3rF=k~pVK`$lFk?4lIWjV2WMO#>PzHSrE(kh0Wo>YDc_=9$V{dMAbO0k^IAdWkFk&`gGGZ||HaKKqHaRdkW;QT5WMefjG-G5ldkjzpSq=a?IzeuER%K&!Z*l-*Y+-YAV|8M0b6+uEF=KCXWnVF0F>PgSZ*qBGF<&u3Zh2N^V{~tFE@*UZY=aCgIyz}?Ze?-+BVl1NH(@t5W@a>IFfcb{F)%eaWo0-qF)(FfIWu82GdY6{E;>3zZE$pX03%^HV>V$kIb|?1FgZA3W@TnLW@R>EWnnWmF)?B`Gd4Mc3@$o4Np5ywY-wZwBVlD^Ff=eRV>dB1VKO)~WH4qhH#IakGi6~nGht&kGGT)ZE*d&IZ*XODVRUbDJv}I6Z*FsRAVG3tXk~PHaAiqkCMh6eZ*FsR03%^DVlXpgVPs=6G&MCgIb$$pGiEa~W;tRxG&D3cWiT~?3{V(o0{}WYL2_egWpsIPWl3ZJb98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUok;)V`yb`d2nS(WG-lQZEU6tEF3yIX>N06a&#zTZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jRw)1@VPZ35G-5DgV`VXBVly&1Wny7sW-&BnH(@w2Ffe8@V}uM&8m0^^13EfsZgXXFbSPFS03%^zFf%YVVK*{4I5cBrWH2)}IXPuCIWc81F*P$YIb}J93{C;23@jNsI%RTUb7d%FZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlAVVliW5V=^)|G&e9aHe_WrVlpr=HDhBmVmD(pWMzm9P8X&OECM<@WpZJ2Whf~CBVl4UIWl21Gh$*iH(@e1Vm2^1H#KH9Wiw=CF=8-cH8F||PNobjA38c?Z*Fv9X>M~UV{dMAbRcqNW^83+bZKvHIyzK&aAhVbAY*TCb94YBVK_EsI5{~mF=IAmHZnCZGGQ_}H!(D2HDNY2F)(6fF^mjO9i|K{2s%1rZ*Fv9X>M~UDIjBSZgX@1BVjT(V>o4HWiv8kFk&+>I5aXeI5;w9HZ?ghVq<1DHaCt8P6nn7EEzgFVRR^CZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVl7@VL3K6V>o0oVqs!AH!xx|H8EymHDx(vG&Nx}VmFWsP8X&OECM<@VRR@d03%^JG-hTuV=_5mIW;#kGGt~kVl_2pW;Zf9W;kRqW;HRA3{H>?E*~IcZ*FsR0Ae&{H#lTsGGa3}W;bSJFk>=eVq`OAWMefkW;QuFWRwg}9g++#2q0r`ZgX@1Vq#`9V>mKnHa9moH8Wx{GdMOgG-6>gG+{YnWiw`FmJCh?rVK0sIyz%)WnpqCDF7p3Ff%w|GGR40VPRx4H)A<6HZx{4WH>N2WjAIrVqs)vm<&#)3@ivbI&*1yWhf~iV{dMAbO0k^VmLN9VPY{eFgY|~V`O7BG&o{6G&VRhWHn=EGh<{nnhZ_`rVK0yIyz--aCCVnDIjBSZgX@1BVjZ$IW{pdGh#PmW??gBGB{>oIW##iFg7+YHZ?giFgctIP6nn7ECM<@Vr6G(ZYU`LBVjQ$Ghs6^F)(3cV>357Ib%6FHaIb5V>x9oV_{`tGccYEPNobj0y;WnZe%Da03%^GV`DfqIc8yEVKOjgIAvrwV`elkH8eLjVKZW7Vr4R*3{IX5E(joFZ*FsR05maTIb~xwFkv@iHDzXEHe_aIFk&__GGsYsVmD@EGNKGl2A~Ws2q0r`ZgX@1V=-oCG+|?AGBPt|I503~WjAGGF=H_~V`McmIASz2qzq05Sq=a?I#hXZWldpl0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ulWo>VAd0#PKF;sbQWldplE@*UZZ218P2s%1aWo~3;aymLwXklb;cXK*Ab7)~?Z+CN0Y;|X8ZYV=_VsCRMDFAY1Ze(S0EpupLWN&wKEpTjgXK8LOXmo9CBWGbTWHdQsWH~cqV`O7EWH>i4IWjXiWiUB8IW{q4I5IM)3`7Q|2o4~^yC73&VPtQ2a{zN_VPtQ2b1iUeb!TaAE@*UZY{UToFK}#iXK8LOXmD@Ma|b!25o0uI5cHrIA&ooH#0M2Wo2YIGh<;eWvdKKy9_ERIy!P?aAje1C_`^jy9_EOIy!TCb97~GC{uZJbY*QxWGoiOB)beMDLOi1Z*F91bZKvHC_`^dT7VKZbjH#KHAGBGt{W@0oru?$Qny9_E2Iy!G|Y)XPc_u6%Q+acAWo<)mZggdMbS5bPBVlAYHDfb3WHT^gIAJqmI5IdgF)=n`Fk@k6VlrhjFgdpjOdq=pDjhmHWMyJ?XDDNDZgX@XQ+acAWo=SrXK8bEa(N~xAY*TCb94YBVPrR9Wo9>KW@9!mVPiQoWi~f6H)dlvGB-6gGdMV6IJpc=8)yRnIyzHhXk}z|Y-IprY+-YAV|8M0b6+uEF=KCXWnVF0F=butFf}Q9IXGlAWHe=FW;tPGW@9%sHe_WnWH~fsHa9df!UzC5I#OkGX?kTvc4cmK0CRM5bz^j6bz*OGUol@XV{dY0Uol@XX>VUKUolc;b7^{IMRsLwbS`LgZEQ&p055ZIY<6XGFK}#iXK8LOXmD@Ma|b!25Ma|b!258Lb6+xTWpr|BV{>0$aA9s`Y+o{PY;|X8ZeKWPaBwbYbZu-^696x8Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_UovuKZe(S0UovB1ZDn#{UovoPb!TaAUpQ!Ra4u+cZESxJ054-Y+qk=Z(m<`Z*pv8UpQ!Ra4u+cZEVa8F#fixQ)O~#VQgu7WpXGf03%^xHezBpGC5{rW;kIoWH&TqHaIadH)c3yWMyMvH8wKF3{%VuF#;3{%VuF(x`XWMyM-ZE$aMWhi5BZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+OhZ*FsRAa-wQWGX2DBVlG_Wi~ZqI5=Z7VmC8pGGt<8IWl55Hf3RAH#lT4V=~GNQzQie06IEKQ%_D)WpZg@Y-xIBasXp&VRLh1bz*OGUol@XV{dY0Uol@XWMOn+Uol@XN>fixQ)O~#VQgu7WpXZPbZuD+9Uol@XR%LQ@Wq3hya$$KcXmo9C{t5&yb7gV>GdN*kV>dE5VPrEiI5#&lH8o{2GBaf|Ght&iVPZF7E@*UZY=jX2FLZfuWiDuNZ~%09aAjXOXmD^YXmo9CkOu%SaBOvFX>MO}b!ByBE@*IY0B~$|XK8LHmVKF#kWg`tW89F*saA9(DWm08qVRUJ4Zd74nY-K28Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVjW*IWjXgVmLB3G&wRcIb&onW;HiCW;J6nF=jL|IcC)iR~I7N2gGGBBoAa!YObTcwvbSVHMVK!nhWMN`3WnwWkG&Nx{W-vKqVL3B7G-We4Ib<|6W7`Z@5+e;Y3OYJva$$32Msja$D0OLWbTcwvbSVHMVPa)8Ib}CFW@Ip8IAb|xVP!KgVPrQnVPGVRCb2Qe|vmbZKvHRAFLlWhN{jRB~Z%b7pUHZDDk2Z*D07BVjZ&WiVtjGGRA4F)(FgFl8|_V`E`CF=1t9VmM}GVr1V8S1uzBH3~X9WpZJ2WmIn{b!l#NGcsRvDF7p3W;14GGGZ_@GcYz|H)c39Ha0LYF=1gcVK6W;IA&%x;S5&@BMmh$Iy!A{c4bs=D0OLWbTcwvbSxlKaA9(DWm08qVRUJ4Zd74nY-J`aAXIW;ZgXaDa&2LBX>V>R03%^zF*am4W@0cnF=a6}IWjV3V>UBnIA%9BWnp1rF)%da3|B5A4K*4%I%98cbYW?3b0~FbZgev;Uvw-Wb!l#NGcsRvDIjBSZgX@1BVl4;H!)!{GcaW}Vr67xVKOpiVKic7VKX^pHfCcsVPfSBR~RD=H5xiPa&LDib!l#NGcsRvEFg7hZgev;Uvw!TV{dMAbO0k^I5sn7V`VjCF*!3dWiw+nHa0UhVq|4zWI1GGWHmT2=L}aEBMmhTIyzx=D06gVIy!S{dSzd9DF7p3W-vBlWi>T9H#jpiI5=c9Gh;9{WI17FWH~uuVq-Ej=?qs3=?pg$AY*TCb94YTFfchbH)A(BGh#C^VL4-FH#KEtHD+REG&VJ4W-&193|A2&4K*n`I%#fXX=7z`D06gVIy!S{dSzd9EFg7hZgev;UvwrcAa!YObTcwvbS5bvV{dMAbO0k^Ff}=2F=aD0W-w)8VlifBGBPk>VPa)5Hf1qpG&p88?F?5ZBMmhZIyz=@Z*3@ZbYwa@b7^{IUvw!TV{dMAbO0k^GdMIbGGRDoG&E&qGBz|~WiU84I5=T4GcsjlVmCHo?+jNFBMmhZIy!W3D06gVIy!S{dSzd9DIjBSZgX@1BVjOMWn^SGVmL5kVPiHpIAUQpF*Gt^Gh{R{Wo2e&HDd7$R}mu(H4r*FW@&PBbVhP-Z76kVZgev;Uvw!TV{dMAbO0k^I5;sfIb<_oIW=Z5Ic706Wo9#CH!?V5F)(IgIX5;j^9)xGBMmhWIyz=)a&vT4Zzy$XZgev;Uvw!TV{dMAbO0k^VPrL7I5IIdVl-xBH)J?rF=S*gF=AvmHaRplIW#jd^$b@IBMmhZIy!D;cyvZ`Z*3@ZbYwa@b7^{IUvw!TV{dMAbO0k^WiT~mFg9XiIXGc8H#1~4Wn?liF*i76GdN{6FgG_h_Y7ANBMmhZIy!D;cyv^6D06gVIy!S{dSzd9DIjBSZgX@1BVjf%Gh;P2W@2SHGdE*5G%-10Fkv}mHZw6YIb}F8Gi3P;R}mu(H3&L7Vr6G(ZYU`rV{dMAbO0k^Vlpr{W-~KkHa9UiG&MFgF*z_~F)=bSW@0lqW@chF`wUkGBMmhOIyz-;WGE>hV{dMAbO0k^Ic8;KI5IajGdVFeIWaXhWn?onFf(LjV_{@6H8440{R~$IBMmhWIy!b~Wp_q$Z*3@bX>N2gGGBBlAY*TCb94YBVKrkjF*P(aGc;ypWi~QqF=8@eF*7hZHZoyiWiw`BW&aFU4kHaU5IQ<`X=Qg*Zzy$XZgev;Uvw!TV{dMAbO0k^W-(!9WHU8kVKg}~IXPiuH#9b5VL4@DWjHu8VK_Eq0S#9UBMmhOIy!S{dSxgnAY*TCb94YBVPs`FG-We1V=`qoGB{>2G+|^hW-~EkHZnLfWimH3WCIOX1|tnMCOSGvbY*g3bZ>GfV{dMAbRbi3VRCb2Qe|vmbZKvHRAFLlWhN{jb!l#NGcsRvDF7p3VK`wlGchw_Gcz=0Gh;DhW;i%xHaKK4G&eb6Ib>oo1r1juBMmhXIyy;oWpZJ3Z*nMOZ*FsRAW3v(a$$6DawaJNBVjmYIWT28G&5x}G&nS4H8e9ZG&g2sVq`cmHa220VL1m4R}Ui%H5WQMZ*XODVRUbDJv}I6Z*FsRAW3v(a$$6DawaJtV{dMAbO0k^H8x{6VKp=`GdDOfW@cn$VPY_3Wo9!sI5;pfHfA(p2@O{jBMmhOIy!G~WpZJ3Z*nRqDIjBSZgX@1BVlA=GGR6}Gc`A2W-&2iVl+5nF*Z3jH92KsGcaZ`HDL=4R|X>uH3&L7Z*XODVRUbDEj}nIAY*TCb94YBVL4(rWMnZiF)%YWH8(giGGbvfWHK~0Gh$&iF=Q|{Wep8i1|tnM0y;WxaAk5~bZ>GiD<~-dBVjN#W@0xoW;ZxtHexe4W@9)wWMwroFflPSVlXl`IWrFpS0fEIEIK+?X=QgPV{dMAbRbi3VRCb2Qe|vmbZKvHRAFLlWhN{jb!l#NGcsRvEFfZUZ)_<5BVjTyGC4IjHexk2HfA(AWin(lIb~yFGB9O1H8){pF=7!7S1Kb7H3&L7Vr6G(ZYU`rV{dMAbO0k^Vlpr{W-~KkHa9UiG&MFgF*z_~F)=bSW@0lqW@chF`wUkGBMmhOIyz-;WGE>hV{dMAbO0k^Ic8;KI5IajGdVFeIWaXhWn?onFf(LjV_{@6H8440{R~$IBMmhyIyy;oWpZJ3Z*nMOZ*FsRAX9K*a&u);Wo%(|X>V>+VPb4$CM+OzX>N2gGGBBoAYyNCY$*UEVP-gEWH31~GGt_9GGSq2Hf3WrWid2lWi>H1GB{*qHWv+7DkBXw5jr|abY*g3bZ>GfV{dMAbRbD|WpZJ3Z*nFn03%^IWjQcqIW#k6F*GL80F*G-3WMX7EF*Y`0F=06e4Ob5%4K)`!I&W}ga$$6Day>mLV{dMAbRbD|WpZJ3Z*nFnAY*TCb94YBVKp{mH(@n2Ff%teF=l3DWMN`3WMyVEH#j&jGd5;4VhIgb6(bEb2s%1%aAk5~bZ>GhC@COgZ*FsR03%^!VKQMhG&40fVrDThV`4NoVlg&3H#IqBVlyyiF*RWe4Oa#u4K)ZlI&W}ga$$6DaxFe6DIjBSZgX@1BVjpWIAmloGBGeSHZ?amGBRReGh{L}H8WyiH8Er`Hf0SBR|X>uH3B+1Z*XODVRUbDD=R1|03%^AHD+QrGG;e8VK!njIA&uwIAmotGcYkRG-5C^HaRm74OeIb06IETaA9(DWm08qVRUJ4Zd74nY-IprY+-YAV|8M0b6+uEF=KCXWnVF0F=bZMAX9Wc;X>)XGV{=e!b!TaAC_{B(Z*wLo0Aq74b97;JX>)XGV{KlPbZu-SXJIljGG;L~Hf1wmV>4o7G%#ghW@ckzH8(jmH8o^0IAbIYNe0^v2Oz?`AVot{AX9W)XGV{KlPbZu-Z4MI9PYh`%=BVjgXF)%STFlIG3H!(9bFflo0Fg7?gG&p21VPa-8V`C}}LOMEjVQh6}03%^$Vq-KkH#RmfVP-gDIA&ovWM*b%VK`+oIWS~mV=y)<4MI9Pc42IFWdI{#WHw_rFlISsGB#soVKy~0H840hGBsf^H#apgWie(s01f~;Iz?`Da(MuAbaHiLbYpd5Z*yNUUom5Ea%EpJUomoJW^83+bZKvHUol@XL}_DmX>V>}a(Ps8VQF+@Zfb98cPZf7lHZ*F#Fa&u{KZZ2qaZEP+LF*-VIWoC3wW@d9`bO0k^G-WVjW;ifoWi(+jHD)(tW;ZruHDx$3WMMXAGdVG1E)6j{I&x`eXmn3zW^-k903%^IH)J$3F=jMnVl!hgGd4LjGdMRnWo2P9V`4UAVKrj#0RTEWRY^#1a%p;RZggR6Q*?4=bYo}$b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;z)OZ*pmRZ*Fv9Y*Tb{Wpra`E@*UZY=R37Ai}#KRAp>sZDn+Fc>pbRWo#~JbZu-71pqH$b8}^Mb1rCbZ~$R*b7gdMUpQ!Ra4u+cZEQ0QE;>46Z)|UJ03%^$GGb(8GdMG5GBja1HZx{3Vq`UCVPRrnVK-$pGcYqV4K6x5X>N37ZgXjLc>p6}Ib}0AGG#F{IAmsKGdW~rFl07iW;HZ5GBPw{HZV0g@BsiiIz(x5Wn*+{Z*F01OlfCmbO3X7a&=>LV|8M0b6+uEF=cLNX>Mg-F<&u6X>w&_bZKvHVQfrkXJ~XTXmo9CHUtD;a$$3HWpZhHWpV&xVq#@7V>324W-v8oGB7YRWHvQrH)LaBH)JmEjH#an5Gcq=2VPiEiFk>-hVK+7nQ8x$xIyypiW@cq_0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&uZY+o^7F==gZY+o^7F+z1_W@U0NXmo9CLJt5haBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVI6WoBV@Y;<#9GH`5lXK8LMl#Eo^URXK8L{E@*UZY=Z~@FK%IUX?A5_VRLY0V{~6~VRUJ4E@*IY0B&J)X?A5_Utx1_Wn*+-Uvgn|X>VURXmD^YXmo9C#|Z#BI#6t3Ze;*-baHiLbYpd5Z*yNUUom5Ea%EpJUomH8Z*5;OUolW@VQytEXmo9C6$}I~Vr*}3Z2&MiVlp>kGdN;oVKX>kGdN>7WMVjFGGaGnV`E}5V>d2nbZu<-2mmi(a&lpLE@*IY0AX@+VR>ITXmD^YXmo9CBNG5GVQ^_KXaHkxa%EpKX>Ma|b!25ZXi=|VPj<=L2Y7bWo~pJPh(?jb#rNNZaO+-a$$E=Z&Oo2PgG%N0CHt+WMy(Kb8}&DEpTjgXK8LOXmo9CBWGb@I5A;lHDfn5G&nOfF<~+}Ib>oqG&C|YGG#I|WHvYX0S5>=I#OkBWMy(XI#XkEWo2$4Q*dEpWgtOqVrgY=bRbV-V{CPEX>V>iI&*VjZ%}M?XK8LILv>KlPbZu-SXJKM9IX5#mHZ@~pFlIM7GBji{HDxnqVP#}7Fkv$=Wo1DPK?bG>4j{t2AX8&V=-b8}&DEpTjgXK8LOXmo9Crv?Zh!n+_)Y;|X8ZgT)FaBOvFX>M~aXmo9C`2hzAIyzKuZ)|fqI#6t3c_2_>b#rApI&f@Zc~D_>b7fR-Z){L(b!TaAC_{B(Z*wLo0B~$!c`a~Zb#rAcbZ>8LEpTjgXK8LOXmo9CBWGb`FgP?bI5=WsIAt+3WMVWlGB`6gW@2GvGGj9`FlJ*#4Mhgq4hJB@yC6_(VR;}>VRdt50B~$!c`a~Zb#rAcbZ>8LEpTjgXK8LOXmo9CnhOyZIyz8cY-MzGWgul_X>@OLIy!c5cx7x*VQgh|bY(?kX>@OLP;7N)X>KTEbz*OGIyz-;XK8L_IyysjVsCRMDF7{YZ+K;FEpTCMWps39EoEeBbZ>GkaBOvFX>KlPbZu-SXJIipWMVaCGBRRgWjJ9tH!wJ4V>vW7H)Jw2I51*iVlqe#RTY{G5g@|5AW&g!Wps39AZ27}bZ>G1Ep~5sWo#{QVQgh|bY(4NWNCD7axHLdb!TaAE@*UZY-0^20y;WlY-M3`C@BCVVPrC9GGRD0WM(!wHZ(S3IAJ$6V=yveI5lB3V=*!?G)oOfV+|!5Iy!S@bV6@$Y$#)IZgX@Xb97`nI&*Y#X>MmGEFfZUZ)_<5BVjXQVm3K8H)A(tWnpDzHe_QsIXN^nFga#sWH>irVq{GXM;K!bB^o+9XJvFkZ*OcUV{dMAbRctdWI8%?baH8KXC^ElVsCG3DF7p3Ib%3xI5sslIWaS3H#j&pFg0dmVm3K7VL4_wWiw(nPYp*HV+|!JIy!S@bW?P4X>MmIV{dMAbRctdWI8%?baH8KXC^ElV{dMAbRctdWI8%?baH8KXC^5CBVjo;H#RmfWHV+tW@b4zWo2e!WjHfsGh<_7H8C?dWHV6>MMmGEFfcVZgX@Xb97`nI&*Y#X>MmGDF7p3Wid1}H!?XjH#lWCV=y^oFg9g5GGjM4WHeKZV+|!4Iy!S@bV+V>WoKn_C}VGKb95kcbYwa@b98cPZf7PeAZc!NDF7p3GGS$8W;kOvV=`oBVlX&iH)JzoIWaOfV=*{nGcq=2RSicMV+|!4Iyz@%bV+V>WoKn_C}VGKb95kcbYwa@b98cPZf7PeAZc!NDF7p3Ff?RlWH2{2F*##qVKQbkWH>ToIc8;KIAJm{HaRynR}DuOV+|!7Iy!S@bVP4;Vr*q7V{dMAbRctdWI8%?baH8KXC^ElWN&q1Y-K3`BVl1>Wo2eGH#0S5H)LixHZ)>4Fg7t^H!@~qVly!{H91)gM;c=dB^)|BXJvFmZ*^j9Whi5BZgX@Xb97`nI&*Y#X>MmGEFffWbz*E~DF7p3Hez98F=aM1GdDCgHZf*6I5{&pGB;vkWn^J7VrFG!TMb7VV+|z{Iy!A-a%W{IV{dMAbRbh@baZKMXLBYg03%^GI599YH85dgW;8H0G&W^rHDxw6W-v4}GGS(AG&W{k4Mz`Q4JQa7V{dMAbO116W;bFrFk)mhGh#F|F*0K^H)dgDF*7wbH8(h7V>Vw6M+RdJB?3A+XJvF&VQh6}b0{eQBVjdTH8CMg-F<&uLWps3DZfA2YXmo9CiVY_MIy!P?b7gcWDF7p3Gh<{oIbmFQe|^*b#h~6C}VGKb95kbWoB$;V{~b6ZaO+td2nSWDF7p3Ic7O#GGjF|H)At1HaR&kV>D%9G&N&4HezEkVKXo|W(`RfiVY_jIyzxwWJ7OlaBps9ZgePPZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVl1OGBr3fF=aJ4V>mW3H#jmlH83+ZIAk<7GBIK|V=`zBNf(L@CmA|AVPs@dWo%(|X>V>QV{dMAbRcqNW^83+bZKvHIyzK&aAhVb03%^JHDWh6Vr4R8IAS$0Hez8kWi~Z8G-YCDFl9J4Fflf24M`V@4JR2oI&x)gZ+2xUV{dMAbRcqNW^83+bZKvHIyzK&aAhVb03%^IVPZ66H8?jnH#1~0WH@FtG&nI~H#cKtWHn_qH8W*w4M`V@4JRKuI%#AmV{dMAbRcqNW^83+bZKvHIyzK&aAhVbAY*TCb94YBVPs`BH#Re4W@a*GFlA(7WHm8jIbmjIWiVqjW@9xlHf{|`9f}Pn2s%1xWGE>hV{dMAbO0k^WI1JJGBIXlIAu9wVKHJfH#jn4IWaaiVq;=qGGRDna1BWYiVY_kIyz}&C}VGKb95kcbYwa@b98cPZf7PbAY*TCb94YBVK+HrGGRAkVl`u8F*P$aGBq$TF*Gw~He)j}HDNJfF>(z_7>W%i5;{6`d2nSYL}7GcRC#b^Nn|M?V{dMAbO0k^I59CbG&wnCH)J$oH#uW7VKHVlIXN~kWiVnfH8wF}bPY)miVY_pIyz%-ZggR3ZgVJOZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;gV{dMAbO0k^Fkxb5VlZZ8GB`G2WoBbHFlI7gGG;MmGG%5mWHn_nb`41#iVY_kIyz%-ZggR3ZgVJOZ*FsRAaitNIy!T7a%pa7CMh6eZ*FsR03%^JW;HWpF=aAlH(@z3G&V3eVKihnFf(L0Ffn3cWnwsZ4M`Y^4JQ&hI%#uKWpi(Ja${vEL}7GcRC#b^Nn|M?V{dMAbO0k^GhsI~H#9k8H)S$nIb>usWHLBrVrDftG&D0XFl9MpdJRbsiVY_cIyz}{LvL+xZ*FC7bSOk&bYWC^aAiqkDIjBSZgX@1BVjQ!W;tRsH#TH5IW=ZCH8MG2Heob4Vl*^lHZWu{Wo3K~Nf3$+ClWe3X>(F#Y+-b1Z*C|=VRT_sd2nS(WGNtHZ*FsR03%^EVL32iIXPrGW@cqKVK_HpWn(urWMVjBI5#*jIAb$@4M`A+4JQ&hI%#uLd2MZFbaH89Qe|vmbZKvHC`4g&VN`i=Wl3ZyAY*TCb94YBVPrL9G%#UiW;ZoAW;rrtGB`0XW@a`yF*#*nIAvpHWPlAx5Q+^a5;{6*b5wF=Wm08qVRUJ4ZYV@ybYWC^aAiqkDIjBSZgX@1BVlGWFga#0I5A~7V`4aCH!)&mFl03~Wj8oAIX5;mI5~n1Nf3$+CkQ$^a%FRGb#h~6b0{ewV{dMAbO0k^W;r!EIA%67H8nIiFf%tWIW#h1Vl`thWi~f8IAk2*0W;tOnFf(N~H85c_H#0dmH8wGZ4M_%y4JQaXI&x)fVRUJ4ZgVIpAY*TCb94YBVPa)9VlXl}H)b(3Gh#A1G&V9fV>vltH)b_8H8V6gV~7n&2518SIyzK&aAk7J~Fg7t|nhh;FI#hXZWn@TiZ)*S}VPY^gGiEn1F*as0V`edAH#a#kGB{;3F=Q|@H8wM5Wtt5w0y;WVWpZg@Y-xIBawsVPBVjo;I5{*kIA%6AIW#phW@R{GGdVUnI51&3IXGl7Fk_AlPnr!aCOSHIa%psBC}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFfcVZgX@Xc5i89Dk%UXVKic4VPY_5V>4rAF=9DmG%#XhGc#c{WjQc7F=I3{WsnU|B$^E^3OYJ>a%psBC}VGKb95k7CMf_TVPQ2lIb=9wG&3+XHDY9BWjSLxIAk<1F*7-1H8MG5W0DO|2$~HoA38c{Z*OZTV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAV_a-YbgLDVPr63Ha9RZGGjL}Wi(-BVPiBfV>M+rIWuBrH8nIjFq92X9hwa-4mvt$Z*OZTRC#b^WJqssYdlmwDF7p3W@ThFF*GqXVlyx@GGbymF*7h^WMVTiVr4QnH8W)}mJLq~nhh-`Iyz)!V{dJ6Z*yfRV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAY*TCb95kfZ)s#IDF7p3Gh<>lH#9e4VK6phFlI1jGdVdjH!@*2HZ@{nVPs-3m<>-P1pxp$I#XqGX<=+>dS!9|V{Bn_b7OU4Z*yNUUom5Ea%EpJUom81bYWjHUolfmN7V=y;iG-NX}W@ckGVly!?FfuqdF*Yz`VKp}Z4mdhGQ*>`|03%^AHaIwBV_{-tF=b?AVPau5Vlp;mWi)1CWn*G7GBY;-4mdhGOJ#WgBVjmVGB-FmW;QlqF*Y_bIc8!pG-5Y2HD+ctW@2SyG&2AWI6693VQh6}03%^AGBhwVWjSMGF=b<9WjHc8F*RdmHZ?OiVP!cqWH>bd4mdhGNp5pxa&$yxW?^+~bO0k^F)(H}WHm84IWRF~Vqr67G&4ClH!?D2W@2JBGBGq|01h}hI!SJGWpZ>wZ*X}4BVl4QI5IIaFlJ&mVlp*hFf}waW;r=CV=ypfH#B5nHaGwdI668>ZgXXFbWLw|WdI{#F)?9eIAmpFIWb~5H8VIkWn*D8Ib&jCVK6f=H8VA401h}hIz@6}b7cS{VK`znG-G06W-((pHDNGfH8*5AH#KH7HezOEVlgmgIRFkgH99&(X=8M0Z*F07c~o*?X>=%KZ*FsRAXIs9WhN{jV{dMAbRblDaAhVeAWUU$XLM*RAVOtlX>KeaMrm$jEFeMRfTk$`BVji(FfukWW@BVGHZV3~Ib~)xWoBYwVPa)9W->B2V>hM^S~CC+I1f5Hb7gc%ZgXXFbVOxlVRdYDC`oQ}WpZ>xWoBV@Y;-9ABVl7WFgaynH83zVIb}9BGdN^qI59CcI5{*iWMVX7H)W^|S`7dWI1D;Eb7gc%ZgXXFbVF}&c_>M4b7gXLLvL_-DF7p3H8EskHa0V2He)e3G&C_~Vq-WrI5#sgVmM`FHfCfpstsBS01h||Iy!S@bV+V=WpZ>)Z+2xUNp5pxa&%2^c4a95BVlGRGBY@2VK*@{Gch=1HZ(XjH!?LdWo2SvHDWd~G%>6VS_%LTI0rg9b7gcza$$32C`EE%b7d(2BVjROV`O7yWM(pBW;ZuxHe)qnH8?RdW;iurV=*}~V>PY~S_J?OI0!mAXkl|nZgXXFbVOxlVRdYDC@COgZ*FsR03%^DGGaAkVq#)AWHn`CI5}Z6Gh{L|H8MFkVPs@wVl`y24O#{O4mb!pI%r{YNp5pxa&$v)aCs;xAY*TCb94YBVPa)5F)=k}I5ak8WMpA7W@R`sF*jy1G%z_~H8?adF|rL>1^^B?2s%1wVRK1tb7gXLO>cH(C@COgZ*FsR03%^EVlZSlGh{GhV>2`~VK-zjVl`noG-Ne5W;10nG&M1_4O#{O4mb!pI%r{YMRH+tWhf~iV{dMAbO0k^Fg7$dHa9k7W;bRsV>K~3Vr4dDIAdlsVlXmeGGsY6whdYa01h|^Iy!4*c~p6DWhf~iV{dMAbO0k^HZV9aW-vK3IAdZlFl1zAI5#;nVK*^lGh<|8Fk>)bxD8qc01h|^Iy!b?Y;|Q+d2nSYDIjBSZgX@1BVji;Fl1phGdN~3WH@9pH83|fGBagjVmL7{VL4%AG-kRDS_S|PI1M^Fc4=jID0XjYWGX2jV{dMAbO0k^Fkvw_VK_2nWi>Q3HZ?IdH!(OgIWcBoF)=V>HDNh5ybW3l01h}4Iy!b~Wp^lJZ*FsRAa-wQWGX2jV{dMAbO0k^H)CcsGd5;6FgP?eH8f*3H!wCaVP!EjWoBeKH8o^nz71Lt01h}GIyzQqWp^lJZ*FsRAVg_nbZKvHVRCs?a$#w7CM+O!Z)s#IDF7p3Ic704G%;jjGc++bGdVOgI59IcH8DA3Gcz(|GdE*3zztd*01h|^Iy!7+ZfA68C@COgZ*FsR03%^JWH&c9H!x#0W;Hc8GG#C_Gh$(7GC4CjI5RLXIAvnO4O#{O4mb!pI$~vKX>KSfAY*TCb94YBVP;}7WjA3lG-ESlFgG-0W-vE1Hexb0IAk?5WM*bIW5f+w1^^B?2s%1tZe%DaAY*TCb94YBVPRn~H85o|FflVRWMMTpHDzOFV>B{kVL4_sHZe9dWyTF!1^^B?6FNF(X>MdFV{dMAbRc$bX=ExXAY*TCb94YBVP4o8HDNR`HpmTH5daQ26FNF+ZgXXFbVOxlVRdYDC}VGKb95kfZ)s#IDIjBSZgX@1BVjo;G&VM7Ff?U1GB;#pV>LNqV=^*iWi(_tW@a@xV>HSQS`h#aI3PMYX>N06a&$v)aCsuwH840iFw6~F9smwF8ag^@ZgXXFbWLw|Whi5BZgX@Xc5i89Dl8y&Z)s#IDIjBSZgX@1BVjf(F)=naWjA3pGdN;4GBh_fWjHuxH#9M2H#splVK~kWS{MKhI1xHJWpZJ2WhhB>WpZJ3Z*nFnAY*TCb94YBVK!trV>e@EGB9OiHa226Fg7(fG%+z^H!@=|GG=3AW6%v+4*(805;{6%a$$32C`oi>a$$6DawaAzAY*TCb94YBVKq26I5|0GHDO|AI5IY2I5#&jGBROeVq!TpWi~c9W6}*;5C9H12s%1rY-M3`C@COgZ*FsR03%^yW;0`DHZ@^pI5{~mVm4xBWjQrDGdE&6G-Wb0WHDvb4O#{O4mc$`Izw-6b97c|Wp^lJZ*FsRAVg_nbZKvHVRCs?a$#w7CM+OhZ*FsRAa-wQWGX2DBVjaUWi&N1WH&QrH8eFiWMVioWjQrwWH(}FHZeG5Ghx;ZS|b1sI0!mAY-Mg|bZ96kAY*TCb94YBVL4MGfNpxj$VRUbDCMGEWBVl4WG%z<~HDNP3HaB58IALKlIbvaAW;iuDHeok5WMSeBS_%LTI1xHJZ*XODVRUbDJt$*uZgX@XNpxj$VRUbDCMf_TVKZbiHa0S5I5#jdIb=6uFg7+cWMMHeWoBkEW;Hc9Fyswd4*(807dkp`aAk5~bZ>G!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^BV>UQsIc7IBVq;}EGhsDmIWssmIWRXhGB7x0G-5aA4O$fd4mcM&I&W}ga$$6Dav?n^V{dMAbRbD|WpZJ3Z*nFnAY*TCb94YBVKO*lWoBb$Ib~xrWi@0tVq;`sVPs}BVPP|5Ha0UdH|Pyo6#x!62s%1%aAk5~bZ>GhC@COgZ*FsR03%^AGBq_eVPa!AH#0FcGBq}4G&eA1V`e!pWHK-~W@9w!4O#{O4mb!pI&W}ga$$6DaxFe6DIjBSZgX@1BVlDUVK+H8Gh{h3GBGkXW;HTqVmM?tFlAyeV>M)DWiadwS_S|PI08C4Z*XODVRUbDD=R1|03%^$H8?jgGBYqUVPs@EFgaskVKp!?Wi&W8F=073HZ(Zy4O##WI1xHJNpxj$VRUbDC}VGKb95j{bY*g3bZ>GdDF7p3H90XjIAJp|H9282H#1>nFf(LkHfCfoIAdfoV`exv;0;<201h||Iyy;oWpZJ3Z*nL}bY*g3bZ>GdCMf_TVPZKnFgIg0VKX^4H(@zAVPP~mVqs!tI5jyoVK+8pVd4#13IGl`5jr|=aAk5~bZ>G!C}VGKb95j{bY*g3bZ>GdDF7p3Gh{P1HZo>7H!w0eWH)0lHa0Y5VKFgfW@a&FH8nUeGdDIjBSZgX@1BVjRPHaKKCW;ZlqV`VrqVKrtsGdMOmFgGIdwS_S|PI0!mAZ*XODVRUbDEj}nIAY*TCb94YBVP!O7H#s&lWH~Z2F)}u0H8N&mIAl05WnwU6HDqOFFzgLl1^^B?0y;WxaAk5~bZ>GiD<~-dBVlGWI5#jdGcYq@WMnxoIb&gAH83z`G&nXfVL3N8G&t@JTKE9~IyyvYV{~b6ZeenHRB~ZybO2*)VRLh1bz*OGUol@XV{dY0Uol@Xa%E<0Wn*+{Z*E^PUok{!V{~b6ZeenHRB~ZybS`LgZEW-p055fJZ*pX1a%E&+ZDDXOXmD@N37a&u*4bZKvHb1rCbZ~$p;bY*gLWn*+{Z*Fs6IB0NiE@*UZY!wbFB|17|a%Ew3WhirWWI8%?X?kT}bSxlqbYwa@b98cPZf9S1X=QgTAYyNCY$*UEVKp{5IX5yiH8eP4IXE+9Wiv1`G-ES4Gcsf}H8^H4VFM0KBNYxR4LUkxWpi|LZ+R$lbYwa@b7^{IUvwz|BVjo*W;HQ1GBz?fWH@FvV`5=6I5##qGGsP2HfCWsHaG38nV>LE0Fk?AnWMgGzFfukWIWRaiVL1m5Oc50hDib<7WNC6`V{~tFc_?#qWI8%?X?kT}bSWTXZ*FsR03%^$F=IG3Ib~)xGh#S4H!wCbV>ejHDzLCWMg4wV=**gH)b_8Heq97GG#Df3l2;M6%HyBIy!J+a%FCGD06gVIy!S{dSzd9DIjBSZgX@1BVlA?IWRIeIb|?8Fk)jcH#9OeFfwB^H8NviG-fn5V_^*rOc50hDib<7b7^91X>MmIb97`nI&*1yWnXkDAY*TCb94YBVK6f>H!v_ZVKF#3He)t6G&C|aF)=teVr4QgHZ?OgHV+O=5fu(96FNF$XlZO@D06gVIy!S{dSzd9DIjBSZgX@1BVl4=I5cB5Ibkp}WH)3mWn^MGIWb~5GGjSmWMN}uW;78FOc50hDl0lVZ*XO9D06gVIy!S{dSzd9EFeZ{Y-Kt+NMUYdY-KDUMrmwiIyz5qWo}JxWMwG;BVl4@F*0FhGC5*nH!v_}VP-XCF=S;qV`MQnGcaQ^HZ&6sOeqBc06IEBa${&|c4Yu#Y+-YAV|8M0b6+uEF=KCXWnVF0F=SzMVP7#{F+p-;XlZt3E@*UZZ218P2s%1ca$#KlPbZu-SXJIyEVq{`vVlrhpGc#pnIW#pjIAvrqWH&T2W-w-DW@Q!*KL+^$2Oz?`AXIW;ZgXaDa%})~a$#4V4d2@7SZ2&E1b1rCfZEPwIFakO{L2_egWpsIPWk+&haA+tg03%^$W??sFHa9RcVP-L6Ffe9eW;iuvG&eV5Vl*^4VP!WO4pJ%(FakO{a%FR6bSNnRBVjOPGGj9~He_QoGd4D3V>LEmGht#gIb>#IV=*%`Wo8@>QYsEG9XdK=Z*Fv9X>M~UL2_egWpsIPWl3Z#AVY6#b!~1*WGNtHZ*FsR03%^HGBz_|V>e?pFkvw;WH@GGVPQ05W;kJEG%zqUFflbA4pJK`4loxwI(KPwXedE)V`yb`d2nS(WGo;#Xk~PHaAiqkEFeQ~Y;|pJNn|MiBVji%H8Ev5WiT;gH#KHrG&W^1H)dftF*0FcGB##4HD)3XQWYu=FcUgDW@&PBbSOb`V`yb`d2nS(WGNtHZ*FsR03%^GVP-HhFlJ&kGcq`0W;ZlrHZfu`Fflb`Ght*hV>CG=4pI>+4lo@$I&NinbSOb`V`yb`d2nS(WGo;GzL2_egWpsIPWl3Z{CM+OxbYwa@b7^|wfTk%RV{dMAbO0k^VPP|3F*ag0VKp!@VlZZ9WH~ZrVPRo1VKg-}He@hlC=OCNXafK`Ize({Xk~PHaAikwVQ^>wV{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF+p-;Xk~PHaAikwVQ^?JXmo9C4g&x$a%FRGb#h~6b1rCbZ~$^;b8mHWV`Xz+IB0NiE@*UZY%LB%Iyz`!Ze(m_03%^GHaKH7HD)n5F*Y)0WH&ZrHe@$BWnwlrH8nJ4F*Gqi3@kc2RAqQ{b#i4gL{wpNXJvE%Uol@XRAqQ{b#i4gL{wpNXJvFQXmo9Cxd8w#bY*NWY-M(3Y%XYUZ~$y&c4cf|IB0NiE@*UZY%&ftIy!WDaAg1^VPZF7FgIjlHeq5lV_`BdWH&N3VqrIAI5uQCVP<7!IWi74Iy!b?Y;|P-BVjc-W-w(rW@R!tGh#MoH8f>0IAJm~HDoe5GC46cWim1jH99(WVQh6}03%^JGc#pmIWajjH8x^mWjA6nGGk^kW-~KoVrFAxGB7pt5&$|nLvL+xZ*FC7bO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F=b1_&U+yC6|@VPtY)WN&i-Epc^WWO89-Z*wkabZu-n4mUMAI(2YlVRU6Eb97`nI&*1yWnXkGAaitNIy!S{dSzd9EFg1qWI8%?X?kT}bSxlqbYwa@b7^{I;((?p03%^JIW{mhHZWo~GBr77W-??nVP#@9VKFc>I5#;rW-??n4p}oe4mSciI%j2WWpZJ3Wld>tZDDY8C@BCVVL4%AFgRm5Vl*~lWi(+hIXN?8H(@X^VKg^kH)J_vH8u`ekN_<~a&lpL06}tcVR)0BZc}JsaAg2?0y;WLZg6#UL1T1jZ*C|l03%^JGGt?AHexw9HZV6gFk)dbH8MG4Ha9gnH83V>Qb97`nI(B7abZ>GzNp5g;bVF}#Vrgz+bZKvHJ}CerVPZHlV`XJyV>dHqVqrFAG&DD5Gh;b0Vq`HfFfwL0GC~eY9Yzi+2q0r`ZgX@1V`FA!Hf3fuHZw6}W@a%sVm37~V`XGEVKp)`WH4f8L=H*@R1PQtIyz%-ZDMI|VRUJ4ZgVIp03%^$G-hRDH8wIhVr67zGBr76VK-tpG&W&4HaTTsI5lKO4oXxGCGDIjBSZgX@1BVjRNIAb+6I5lNqV>4zsG-WX|Ib$|uV=-kkIW}f8GB`*MN(NL8CGDIjBSZgX@1BVjRNVKrqjGh<_AGBP(ZGiG8nH#cK5F*GqVG%++WF*r&NN(NL8CD{H8y2sH#lTsH)LZuHa0P4VPh~%4oU`84k!jXI&gAjb8}^6C}MAKY$*UEVP!NiHDNMlWMeckVK+EtVmV`DFgP(VI5c57HD)w0Fis9i1XK(3H(@k6V>C86H#9I%4oU=64k!jXI%;)ubW&w(Wnpt=WGG^9Z)_<5BVjf$VmLQ4VK8N3Wi(|nF=jb9Fk?4iGh=09He+HjG&WKWN(4y(9YJGsX>V=-L1T1jZ*DGVbZu-_4lp`8aBp*IbZKvH03%^FIb$<2IAb|tIWl52GG#JhIAmotWi&WAWn^YFIXGd$2mm@dO>cE`Wle8(Wkq&nZgc>1baHiLbYpd5Z*yNUUom5Ea%EpJUomNKUol@XO>cE`Wle8(Wkq&nZgehabZu-|4kaZzI%aQjcVTj5D0F#nWo}_@Wgt>zZEtpEQe|dka%FB~Wjs_qIyzK&aAhVYDF7p3Ib%3BVq!2iHDxt2IXGcrHZfy4WMefnH)1p}WM*MER}M!bunQJCI&EcbZ*qA6Uol@XZDnn5a(OOjbZu<;0S5>=I#XqIbZKs9b2>V6Wps3DZfA2)Y;|X8ZYV=_VsCRMDFAb2baZKMXLBuZY;|X8ZZ2qaZEPcFVPMn80CQz@bZKs9b1iUeb!TaAE@*UZY*hvTFJ*3aX>xCFZDnqBE@*IY0A+4=X>xCFZDnqBUpQ!Ra4u+cZER!?I08C4Q*dE&b7fLxY+-b1Z*Ej!Vr*qeWGE>BBVlAUF=aS1GB`9cIXN&mGGS&gGc{u~H!@{nVq#-uV>w<9T4WA5D>^z;aA9(DWm08qVRUJ4Zd74nY-LGgC`4g&VN`i=Wl3Z#AVG3tXk~PHaAiqkEFeL0V`yb`d2nS(WGoU2mWiVwnH8f^4G&W!kS}9}>I3zkcZ*XODVRUbDJv}I6Z*FsRAX9K*a&u);Wo%(|X>V>+VPb4$Nn|D|AY*TCb94YBVKZiBIWl80I51%|GcjUeW;rxAIb}99Gh{M3Vqr8lV`2_kA|nj|Nn`+XbaHiLbYpd5Z*yNUUom5Ea%EpJUomB4b6+uEF;j41a&u);Wo%(|X>V>+VPb4$Nn|c)bZu-&5CAW5Y;|X8ZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_UovoLd2?xFb6+xWY;|X8ZeKWPaBwbYbZu;q2Lvy3d2@7SZ2&PiG&y26H90V2GB9B`V>B>kF*su|Gcz}4H83@0WM(dCbZu;q2Lvy4VPb4$05D=RIb%6EHZ?OhV>dA|G%z?ZW-~ToVq{@uF*h|dH!f&&ZER=|054`~Y-L|_baG{3Z7yhVZ~$g$Y-L|xb98cLVQpVHXmD^YXmo9C>jnTXaBOvFX>KlPaBu*0Z*OdKUov!Mb8}^KVRUbEUovxYV_!0KWpi_7a$$6Db6+xcZ+K;FUte%xY-MzGWnW)qWNCD7a$hoVY;|X8ZeKWPaBwbYbZu<;0S5>=I#o$JIzw-4Z*m|~Wn*+YI%98aZ*o#)V{}k#b!TaAC_{B(Z*wLo0Cj0CV{dG4axHRYV{|QWY;|X8ZZ2qaZEPcFVPZEmV`eyEG&D74VK6dfVlrkhVm2^2Ibk+oV`5}wIBE_<1`GxYAi}#KLvL(vav)M=V{`yxZ)|UJEplaJbS-dfb!TaAE@*UZY;X=RIyz%*WI}ajW@T~!BVjc%GG#C|G&f{nIb|_6GBq+}V>dN4GB#y2G-NP2V`Fd*FgiMLY;|X8Zc%k*b!7k}VPs)6Ght#iFfuqbF)=hTVKy-_HDfb1GdVIbI51^oIdBdzIy!G+b7gXNWn@KebZK;X03%^AVlX!{G-fh3Wie$oV=`i8W->51W;QZ7VPZ06FlJ@f4*)}NZggdMbO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F=bMa|b!25=I#OkBWMy(XI#OkBWMy(7R&RJ^Y;!s~a%FC0WpY+;cx7yJP;7N)X>KS(bz*OGCMf`NWo~3;axHdmcx7yJEpTjgXK8LOXmo9CBWGb`WjQrAH8f^5H)1w3I5%W7V>B}`HDP5rV>dN8V>xAX4nqc}2o4~^yC70!Ze(S0AXaa9Wo&Z*c5irPY;!GeY;|X8ZZ2qaZER-_1TS-NVRCb2Uvgz^VRUJ4ZU8xEGBP-1Wic^kGG=2kHZwCaGd40YGhs7jW;J6uIWjJ2bZu;!3lSGOI#6U@Zf9w3WjZ=Tbz*OGCMf_daB^>IWn*+LaBOvFX>KlPbZu-SXJKMDW-u}_HZ*21WHvJ~V>viCGBjo}VKOi|G&C|bHe+}WNEMn35g@|5AW(8|YGq?|04;EGZ)#;@bS-dfb!TaAE@*UZYLV|8M0b6+uEF=cLNX>Mg-F<&uLWo%_*bZKvHE@*UZY-SDsFK=*kX>V?GE@*IY0B>+~X>V?GUpQ!Ra4u+cZER=|054`~Y-KKJaBu))Z*pZ{GHGsOY;|O1UovBLVsCR_GGlLYWnVI6VRT_%GG=pMGG=LPWnVaGaBwbYbZu;30{|~@Z*OcaXmD@KlPbZu-SXJImCVP;`DIXO6HV`O4vIW%NuGchq{HZeFbH8VFcWo3X4JO=pz2Oz?`AXjN_WN&u>cWG{9Z+9(lY;|X8ZZ2qaZET1RCptP~Z)|UJ03%^GW-w)9HaIvkFkvxdIW;gcGcaXkH#jmhH90ddGdMPg4ktP~X>N37ZgXjLc>p6}F*sy4H#a#oGcYq@W-&Q1F)%qZHDWMgGdDRhF=RDmhz=(@I&xudXJr5*VKgx~H840gF=S&jH!(3|F=RC~Wi>K1H8^22G&f^3IEW4>Iy!T3Z*)O!XKZBvBVjXUHDWeoG+{YmIWjRhV`4I6FlAw8Fk@w8IWRV2HZzD0CptQ5Zf<3AQ*du|L2hSkWdI{#Fg0UiVPQ35Gi706H#lT8V>vQrVPY~eHeonqG-fq7@BsiiI#Y0ObWCYyXmkK`baHiLbYpd5Z*yNUUomBFXK8L_Uol@XQ*du|OlfCmbS`LgZEUd)J32ZG1BVjc#G%__dH8W)}Wn(fhGB9OhH8(P5VKFshGGj6{V>7W1J32Z;Z*X}-Z*FsRa&=>LZ*l-5VP<7xH8o^qFl04jGG;Y0F*IT~Wj8l5IALL7Gc__}VzCZ8Iyy~nc4b3vZgX^Ubz^jIasVS?H8N#1IA&usIAddEGB;s0W@9)oGGjJlGc#jkFlA$Au?{;XIyysdZgX^Ubz^jCVr*qpa$#w7D06gVIy!S{dSzd9EFg1qWI8%?X?kT}bSxl5Wpi|Lbz^jIawz~KVKq22HD)w6IW=QpGGj9^W;il8VP!aEHf1n5G&eOeV~q}7B(V-V7dkq3X>@2rWoBV@Y;;3!ZgX^Ubz^jIawtS)W?^+~bVF}$b98cbV{~tFDIg{$03%^FH8VD2WM(rtH8eRmWnna9W;S9sVliZ9G&o~6V>V%r4qX+o4m%V&I(KPwXhUysc|&h*b98cbV{~tFC_`^>c|&h*b98cbV{~tFDIg{$03%^IIAt|6WimN1F)(2_VK-tjV>L7}Wi&K0IXPiBF=S(r4qXzl4m%V&I(KPwXiaZ+WkYXnb98cbV{~tFC{1s6WkYXnb98cbV{~tFDIg{$03%^$Fkv`2HZx*4I5s#kGc{&pW@TnHIb}6AW@KSvH8p0F4qXzl4m$`sI&*1yWhf~iV{dMAbO0k^IWS`~Vq!QnH!x-}Fg7tYH)LjFVmUZ5WoBezV`Moql@477u?{;3Iyzx&X=iS2Wo~pRDIjBSZgX@1BVjN#HZx^4W@I!nF*0H@HDfemW??ljWH&fCV>Dr5F=3YuT?VlZI|w>DXkl|iWoBV@Y;;3!ZgX^Ubz^iWDIjBSZgX@1BVjf-Wj19nH#uQ4WHK^kHaKB8Ghs40I59P2GBsvoFfy4AT?VlZI|w>DXkl|hZ*X}-Z*FsRa&=>LC@COgZ*FsR03%^$VlyyfWHvZAH#jvnGB+_|Wi@6tH!)^3VPZHnIXE+$4qXPZ4m$`sI%r{YO>cH(LvL<#baHiLbSNnxV{dMAbO0k^Wi?|rV`5=5Vm3H9WH)6tV>4r7H8*BCH!(FhGGZ_{oeo_Fu?{;8Iyz)!b98cbV{|BXZ)s#IDIjBSZgX@1BVjf(G&eXgVP-cmH#A~3IW#k2IAJz6W;kUtIAJk1WH+AD)Z*FsRa&=>LD0XjYWGX2jV{dMAbO0k^Wi~W5IXO2sHaIpkFkv+@IASz1G&nY8Ib>!rFg0W{p$=UOu?{;LIyz%-aCt*-ZgX^Ubz^iWc5i89Dl8ylZ*FsRAa-wQWGX2jV{dMAbO0k^IWsgkVK!kgV`4BdWHdB0F*Y$cHZx;6V=!VdH8^81qYhmdu?{;FIy!A{c4b3vZgX^Ubz^iWc5i89Dl8y&Z)s#IDIjBSZgX@1BVjmVW;A0qFk&$|W;r!sIb$(6W-w$kWHB}~IW{(8WMiccT@tYlI|w>DWMy-7a&=>LZ*nLpAY*TCb94YBVPs=AFkv$`Ib|_5G&nReV>mZrVm4tlV_{`8V>K{kHm43<2C)u12s%1sWoBV@Y;;3!ZgX^Ubz^jIawsVvV{dMAbO0k^IXN(7F*GnTV=!iBIXN^jH8f>3F)?FeWnwsDG-EO~sSaHRu?{;3Iyz%-aCt*-ZgX^Ubz^jIawsVvV{dMAbO0k^WH&iBGcY(ZW@RvBFf%n}WiT>1W;bOtHDNh8HDzTps}5ZTu?{;3Iy!A{c4b3vZgX^Ubz^jIawsVvV{dMAbO0k^I59LhHeqErIAUTpIAStmW@BSAV>e_oHaRmhHDNS4tqxrVu?{-|Iy!WDaAjmDDF7p3Gi5PhGBPk`VqrKoH#j#nWiw_lHZ?b5Hf1q3GG;k7uMS=K0RTEWLvL<#baHiLbZKI2WmIxuX>+;QY-M9~X>V>{F<&u5Z*FsRa&=>LX<}?;RB~ZybS`LgZEPYF054`~Y;VK+5pW-&Q1WI19rIAvluIX7WsFfuY^Wo0!oHaKKBVz&-AIy!G=W^-k903%^IW;bRqI5{*iF*7$}Ght$6H8(UlIbu07HDNF{G&f?m4mUbFb7^{I03%^DWH>f6Fk@ypHeoPkVKp#iWn(ZnGcq_iH!(3|WHdOp4mUbFb98cPWMu#&VPa!uI5{#hW;ZxwG%z?bWHDxDIWT23VmLE5G-WtAGV=%kIyysdZgX^DZgfI*W@cq_MQmklWo~o;b98cbV{~J6VsCR_F<&ubZ*pZ{F<&ufY+o^7F+*=|b97;DbV7AzW@U0kY-Md_ZgehabZucbaG{3Z75V@a8q=0Wnpb5CMf_TVPRr8G%#f{F)=V>GGRGoG&V9fF*RjnIWuE7Wiw_qX1oqf3)l`T5;{6mV{lV+a%Ev{C}VGKb95k7V{lV+a%Ev{CMf_TVKOjeV`gPFG-Nh6WMemGV>K`_HfAwlWo0oqGdN;nIlc}}5ZDeY5;{6>aAk5~bZ>G!C}VGKb95k7V{lV+a%Ev{CMf_TVKiZ4W@I#CH8C_bV=*&gFgP_dWo0usG&nM5Gh<^jGr$f_5ZDeY8ag^-Z*Fd7V{|BEZ*FsRAVFkga%FRKCM+OzX>N2eHeYlp03%^$V>d8nWjSFqWMwuqWM(rlVq!67V>mN4GcsXjH)3PL4ow)?4l4~hI%#fhWpXG2Gh{MmWH~Z0V>V_nWo9`tIWRTG4o%n&D+oF|c42I3WGE>hV{dMAbO0k^F*9K|F=aPmF=jYnH83|}Ib$+mH!?RdWiT`~H8(h9$PP^g*bXZOIy!S@bV6)zV{2({XDDKCZ)_<5BVl1RWHn_sG+{7dFg7w|HZ@~oH#ufzVq-EhGB#ynF=WaPO$68uD-=39a%Ev;D0XjYWGXBmb97`nI&*1yWnXkD03%^FGGa0~G%;m0VPs=5VKXu}W;i!uGc`72H!v__Gcsh%4owo+4l5cuI(KqubY&=GZ*FsRAa-wQWGXBmb97`nI&*1yWnXkD03%^FW;HToVK6m0WH)0sV_{}9Vqs%uHZU}1V>CB3VKHLP4ow)?4l4*cI&@`hY$z!pV{dMAbO0k^WH320Gcz$WH)S(6Fk>_@V>x6sIAbz7GiGHsF*IU1&<;%o*bXZQIyz-4qoW-vA}V`gR44o%n&D<3*Kb7f^~C~$OgWNBt*Uvw-WZDnn5a(OyBQ)OjqPjYEzX>KV1BVlA^H!x!|H#TK8Gc!0cGG;Y5G&VReIWRdfWjAAFWH#0gO&zcc06IEuWpp|^RAX>cbaG{3Z2)6zVRLh1bz*OGUol@XV{dY0Uol@XZe?^|F<&uMV{lV+a%Ev{E@*UZZ218P2s%1cZ*OdKIy!W3Z)|f=Y;|X8ZYV=_VsCRMDFAeDZ)`1aY;|X8ZgVbZbZu-SXJIliG+|+4F=I0}Ff=qUVKF&mGBY<}Wi>c6WH)4DH8a@`I|lgy2Oz?`AXIN}Y;yo~Z*OcZaBOvFX>M~aXmo9CA`<{FZf|5|FK%ySWiDuNZ~$&^WMyACXmD^YXmo9C=MG6aIze)BZ+8G;FlIDmF=1h0Vq`EkG&VRnVmD+nWnpAEGBji{Wo0;J=MG6aI!QuhVQm0mG-F{nVl+24FfnB}VK_81Wim5lFflVZVK`wlW@a`q=MG6aIzw`Ab8`S;Wj8irG&DJ4Ic8%xH8VD0W;Zo8H)dvGHZw9YWHL56=MG6aI!Iw|WB_4dH#lN3VPi2iV=!Z6FfuVVI50UkW@9;FIbvitHZU~j4oNyXMORW~b7^{I0AXQaWi@3pVK!l7G%zf1DF*s#1Vl_2pHD%`xNjf@CQ&MGfX?kSvcBW@R*GHe_UG=nf}3I#YCEZe(F{WB?;!H)1(sIAS(8Vq<1FVmCEoH#IgkGh;b3I5%WBIbt$2!UzC5Izx4Gb8m70V{Bn_b7OU4Z*yNUUom5Ea%EpJUomNKUol@XLv?a^zXklb&Zf80=WMyV$a&l#4Q)ppiX>Mm!VP^nxWo~3;axG+KW@U16Wn?XLXklb&Zf7lUY;|X8ZZ2qaZEPcFVK-$tVK`$jIb&rpIAk_CFf}nWFlI1fIWjO}Wi>Q2H~9ev2s%1aWo~3;aymLhWoBh^a%E&7Q)ppiX>MmaI%H*LWpZ+5WK(EiWNB_^P;7N)X>KS(bz*OGCMf`NWo~3;axG+KW@U16Wn?XLXklb&Zf7lUY;|X8ZZ2qaZEPcFVKruCIbmUCHD)j}Ghs3@V_{=tWn?lrHDfY4WHdNAV(Sh~2BruOAi}#KL}g}Wa&l#4AX8{zWNB_^0AyumWpZ+5WG!=OVPt7;XDx7Sb!TaAE@*UZZ1oN=IyysdZgX{QWpht(bZKvHa{wb@F*!IeIW{?AHexnoHZ(M4GBPq^Gh$*gV>350WH>o6^$sr{IyzH%b97~GMrCwkXk~IJS8sA`WF{;iV{dMAbRbiCb97~GPjGZ;Z*FrYDF7p3VKHWAI51{0V=`toH)UpJVlXmgHDWhmG-5G1H8wG0?+#HM^$sr;Iyzx)VQhJNWhhg5b97~GL1SZOb8{vsAY*TCb94YBVKp{3VPa)6F*P=1GB`OnWivH4WMpA5HD+aFHextqH1Q5m6ZH-+7CJg+Wpra`C}VGKb95k6d2@7SZ9{KvbY*ySCMf_TVKz2qIbk$pF)=b`HZ*24V_`63G&NynF=k>hH8e9aGV=~m6xR$JX>MmOXmD@$JX>MmJWjHlqFf?H|Gch$WGdMIdFgY}3VPiM=4oe6RDI7XFZDn+FX=5m3Z*FsRAaitNIy!T7a%pa7CM+OiZ*^j9Whnq7VPZKpWi>HoHZwV7Fk&=fH8nY8I5jXaVmW4HH#sq6Gx`oo8VC<50y;W#X?kTSDF7p3G-6{jVl`tlV`e#HG&eP3GdMG3F*q<~WHmTuGdVCZ{0>V94=EHnI&*1yWkPvQVQpn7V{dMAbRctdWI8%?baH8KXC^5CBVlA^Gh#JmVlrl8Gi5V4W;tVIW;Hf3GB-CgH#0G2VKe>?OA-hVDFQk=V{Bz%awsVPBVjOOI5s(CF=H}jGB`IgVKg{oG-NO{HZwUjGha%p9AD06gVIy!S{dSzd9DF7p3Vl-wnH#ssgIWaLZGdX2pGhs9{W;io6Gd4J8Wi(?s0uM_I2oEVHIy!P?VPsZeY;|QQV{dMAbRctdWI8%?baH8KXC^ElWN&q1Y-J`aAaiMYWnXkADF7p3G-6^hWHDo9WHK``I50M0W@a-tIb~#JWH~i3Wn(ik1P@Cj2oEV2Iy!P?VPsBWZDlBPbYwa@b98cPZf7PeAaiMYWnXkADF7p3VKg&hI5cH4G&N>1VP!WtF)?LfGd4CkV`XM$Fkv?~1`kUWunPb>I&@`hIyy~dbaH89a{yy(VRLh1bz*OGUol@XV{dY0Uol@XbY*N`F<&uFWpr|BV{Ml#b98cbV{~J6VsCR_F<&udZf9w3WnVF0F+^c)aA|I5E@*UZY{dr;Ai}#KNo_}UX#g#0ZD)09E@*UZY*PaOFJX0LX>VU+Z*FvDcyumkaBu)&b!2I8UteQyZggdMbYD1VaBwbYbZu-Z4<-USI#zFZWo$=sX=ErV03%^BW??fiVKOo{Ib|?mWH4emWil}}F)?K_G&43iI5jp54@fExCKEb3R&RJ^Y)5iwWGG{AZgX@XXKZacI(2qsV>2cx03%^JHZWvjGB##5H8y2pVr4irH)duzF)%qeWi@0qGGQ_f4@eOz4<<1>I#zFZWo$=sX=Es4Z*FsRAZKiCIy!ZBWn(iYEFfcVZgX@Xb97`nI(B7abZ>Gzb!l#NF*aXxJ|-yuBVjo3n~vL4LUk+aAk5~bZ>G!C{}NHWo$=sX=ElQDF7p3Wi&Q6G+|^jHaKE1Vq`F3WjQuEWMwfiGB7!0G&e9~6c0!XDi0@1Whi5BZgX@XXKZacI(2qsV>2cx03%^yHa9pnWi(+lGhsP0WH&N4IAt+nIAb|tIb&iqH8V9D4@eOz4<-mYI&*1yWhf~iV{dMAbO0k^G&MJ2Gc-11IWsn5Ha0jlVmUZBFgap0H8nXnWj8i991lnaDi0m9uG(=4<;QtI&)=oC}VGKb95kQY;8I^X?A5}GbSt`b!l#NF*aXxDF7p3Wn?usFk)ghGB#y5IWsX~GGRGmVK`+pHeqEmVlXgfAP-0zDi02cxAY*TCb94YBVKZfBV>vT1F*PtSVK`whVKHVfH!wG4I5lKtF)=bRVImJm7b*`XF*-V9Z*F#Fa&#zTZ*FsRAXaa9Wo%GkY-MzGWhN{jV{dMAbRbr5cx7x*VQgh|bY&(iAZBcDVRR_~BVji%FlA*iFk@w7VKg^1WHvD|W;HoCGc{#nH!(CeIWr^=NG~c6CKoz7Y;R#?Msja$C}VGOWjZ=-Wo>VAc{(~%baG{3Z6+xIBVl7XVrF7FVmV`GWo0p9VKZYmG&nIgGGt^nI5{z4VKXKVNEIp%CLKCDcXDZTWmIn{V{dY0Iy!A-ZEtdUIyzHya%Ev{CMh6eZ*FsR03%^xHZ?RiHZ(FeWn(xrWHw|oWnp7AFl91hFf(H?WHDtZ4@evE0RTEWR&RJ^Y)5iwWB_AqVRLh1bz*OGUol@XWo~C_Ze?FFUolp1cx7xya%p5PXmo9C6$}I~WMyVyb!>EV0An*_F=942Fl9G5IA&uqH#jh5H#sq3G&eFgGG;k4VJ>KNZEU##055K3bT4#ca9?a`b97~HWpXZPaBu*0V{l(zY-w|JWo~71UpQ!Ra4u+cZEPn41TS-CY-M9~X>V=-F)?FiVq{`4FkxddF*9N{I5RjhH8?RiHZx;kVrDTnE@*UZZ1@2HIyzEiW^83+bO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F>+;QY-M9~X>V>{F<&uKWoB$;V{|TPbZu-u4<{iyI#G3Ha(O6pd2nTJVQpm~QFUc7!VLViGE-o%UIyzQqWp^n6BVjmVVl!njGi5ksGB{#mI50F~V`61wF*sv2G&N#1IXEv5NgqECCjvS;Vr6G(ZYU`LBVjRPF*!3iWMeR9GchqSHe)q5IWsdiF)=n|W-~N2WH~VpNk0!K0y;WnZe%Da03%^xWH>ovG-YEsV=*x`H#uW9VP-I7Heq8nFk?1kVlXu`4@o}{Ck;9}aA|HRX>N2ZAVqF;X>@rh03%^xF)=b^Ff}LGqNd`X;ClES1VRR@(ZggpMc`P7BZggpMc_{!RVKQN5GBss6WHdK6IW#tAWMVTkGC440V=!VcF)%PUWjPN?4nGek0y;WoX>xOPC@BCVVPrTmF)}hUWMML6Wo2SzW@I%qHDowtH#ufGHfCWkH9HSUKMyAYIyz--aCCVnDF7p3G&eC~W->WqF*ac^V>LN2GBh+~I5svkVKzB9Fl9C|Jr7A}0{}WYQFUcrTLV|8M0b6+uEF=KCXWnVF0F=bY-CY&X>=}VbZu--69g}0WoBV@Y;UHqWo9)uIX7ZrF=aAhV=*^5GczzUI5#q4H90XgE@*UZY(@_zIy!P?W@U0^ZewLrX?kSM+oF*9T~VKg^pVKZZ7F<~?^Wo9rjFl0s#COSHHX>xRRVQf=rdSw73VKg*kGBq<|G%__cV>2)}Vr4ipGdN~AH)dvIW;HTlGe!?4Iy!A(bO0k^GB7bPGB9CdWH>T0F*GqWG%_$|HZ?P3Vl-xBWi&8l@BsiiI#o$SVQzL|a{zO6a&=>LV|8M0b6+uEF=cLNX>Mg-F<&uNNkd_7c42caXmo9CO%E>(IyzKna%Ev;P;YN+D06gVIy!S{dSzd9DF7p3Vq{`rVP!C5V`XG!H8^28GiGKuF<~-eWiT=}WiT){M-Nd8O%E>@IyzxwWK>~uYbbMcWI8%#b#7yHX>V>kc5i89C@DTE03%^$W;Hl5H(_NnHexqsWHC4~W;kSHHDNJ1G-hEnWn(f)4^b6O4=(~bI(K1dbSNnRBVjf(WMVNiW-v1{HZ?hAVl-tlIWRe8GdE;oI5T25W;9C=QI!P%IyzKna%Ev;P;YN+0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&usXmVv?WM45~F;r-BWnpAcZ*OcaXmo9Cg9rdGZDDj{XkT|}WOQgQXmD@dQ2I5RXbVKq56GF1;nIyzQqWp@B!H8f*5G%+<|GcaT@IAb|CVL350IW#mgH8wCeHDot9RS!ivI#XkEWo2#vVKFl?HexU{Wi&H4Gh{L_H)CXCIWS{0Vl+88H8eCbGk6apIyzHuVPjFZ*pv8M`?O(Z*u@6VK+H9WoBbGHDY36WoBhCWMVirI5uTsHDNJkV`DjGW_S-HIy!b~Wp_tudTnoW03%^$HaIspF*0IiWic=_H8(e9GdVV6W@R@xGGZ}eV>CH<42cx03%^#IWsdhW-w-CH8y2sIX7fwI5RM1GG#C{V`ecmW@a#24@D4o4MmGEFfoWZ8|!3Wn(ieAZKiCIy!b`V>2uuW^8X^bS&b4rYQg;VP-ZlV`618H8VM6VK!nlH)3OCHZ(LbW@R!sIbt?8I9v}!Gk6apH99(Ea$$EuZ+IwUZ*FsRAaitNIy!T7a%pa7CM+OlY;8I^c4cETEFfoWZ8|!3Wn(ieAZBcDVRS6wfTk$`BVlDXV>e+mVKX^1IXO5qWnyDuH)UZoF*r76H)dorW-(q5MKgF0BQ-iYWO8A5LT`8|V{dMAbRctdWI8%?baH8KXC^ElV{dMAbRcJJZ8|z_VRSSmEFflVZ((#SAX9K*;((?p03%^xFfun}VKiiBWHU20H!(LdV`XDGW-~H4VPrF6G-6|54@EP042uuW^8X^bSxleY;8I^c4cETEaHHsDF7p3Ff(B|F*0OjFl01iF=aVsH90gmWnnilFkv@lG&W;5Vh=?#cn>2rIyz)>VRuq#Zf7WCZ*FsRAaitNIy!T7a%pa7CM+OlY;8I^c4cETEFfoWZ8|!3Wn(ieAZBcDVRS6wfTk$`BVjT)F*Y(YW?^MzVq|7GWn^YJF)=n|V`VaBVK-)DGh<{AMKgF0BQ-iYWO8A5L2`0$cPL|TZgX@Xb97`nI&*Y#X>MmGEFfoWZ8|!3Wn(ieAZKiCIy!b`V>2uuW^8X^bS&b4rYQg;VKrrDGc`ClV`DdBVK_52VKOsiWMN`qHZm|ZW;8c4G-eM)Gk6apH99(Ea$$E@X>w&kZ+IwUZ*FsRAaitNIy!T7a%pa7CM+OlY;8I^c4cETEFfoWZ8|!3Wn(ieAZBcDVRS6wfTk$`BVjUPH(@n1H#adhV>UQuG%z(|GBq$`HZ?M2IWaOeVP$9!MKgF0BQ-iYWO8A5S7~x(LT`8|V{dMAbRctdWI8%?baH8KXC^ElV{dMAbRcJJZ8|z_VRSSmEFflVZ((#SAX9K*;((?p03%^CGBPnVGB#yoFgIglV=-YgHZx&nWnwutHZ(LgWi~Ww4@EP04jVPr65WnwTnIW%QuH8wP1FgG@1H#lTvV`DjCVQddY7MmGDIjBSZgX@1BVl7VH8o^qVPa-uF)%k_H#st7IAJnkWiVu7WHdNAGiGiNMHqMwBN{q7Xm569a%E&FV{dMAbRctdWI8%?baH8KXC^5iV{dMAbO0k^HaKB2F=J#oVliPfIWRUkWMnrqH8^5nF*jv6Ibu0Ca1TWocn>2GIyz`!Ze(m_Np5g;bSQOcZgev;Uvw-WVsCG3DF7p3GBq?aWieqkVq;`tW-?|sHe)kkV>2*fI5;ykIW#q8at}ogcn>2AIy!S@bWCq!Yh`38b!l#NGcsRvDF7p3Wj8WpGGQ_^Vl^>0Gd5&0VL38kVKZW3GdM9bI5B2sbPq)ccn>22Iy!P?Y-M3{WlV2lYh`38DF7p3Ff=k|V=*vcGch$ZHZd|{F*!9kVm3H2H(_NoWMyVyb`M4H0RTEWM`?O(Z*u@+Y+-YAV|8M0b6+uEF=cLNX>Mg-F<&u9X?ksMb1rCfZESoGE;>4CZf<3A03%^!I5=T9F*7z|Heoj~Vlp={VPZ38G&5vnGC4P4G-fe;4=x%yI&W}ga$$6Day>mLV{dMAbRa`-Ze(e6X>V>xWF{#fV{dMAbO0k^VqrElF=ID1W@9xrG&N*2F=8@gVKO)|H83$@GcaOhdJj+-XafK`Izw-6WNCD1Z*ECs0CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&u5Z*F91bZKvHNn|c)bZu--69g}IZ+K;Fa{xJFFf?OkH#jz8G%++|Fl06~G-P5hIWjmmW;Ql8Wi~EobZu;J5GY7tb7%laVRL9MXmo9C6$}I~b7)~?Z+CM5WHmNoGh#G0FkxY4HDxw4VL32mGi78kGGb8Lb6+xaWpi_7a$$6Db6+xZa${dIbY*jMWpZJ3Z*yNVVRLh3bYEX(cyMfQa%FN~GH`5lXK8L@rmXmo9C4g~-&ZDn*}E@*IY0BvP-VP80CaBwbYbZu;i4=Xx4Wo~q7ba?vlvGBq|eVKQVfH8^51G&namVPr97GiEh0hz~0|I&g1uX>@6CZU7@;HDO_7F<~%eHeoPiGBG%2GdD9dHD)(8F*9W}IXF2uhz~0|I&N=rZDDKxBVjdVW@IujF*Gz~F=8=cG-WnsGGj70Wn(xsIAURBGc@o406IEDZ)|L7WNB_^S7~%;0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUok^(Y;0*{X>Mm%X>@2VXmo9CkPj|8I&g1uX>@6CZU7@;VPQ66G&N>5W;A0mH8W*pF=k4GVRU73X<=*tBVjOOIA&%xHf1+4V>D$jVmV}GF=S?8Gc_?YH8NvlF*cA7E;TwjVPs@hWpZ?7ctvbwZDnqBb0}kPZgX@XV`yP=Dl8ylZ*FsRAY*7@aw;q!V{dMAbRc7BVR9-gAaitNIy!S{dS&8(rYQg;VPiF7H)S+tFfchdWH>TmGdD0fH#9UcGhsP5GGsGlF^msTGmsB1GCDeEWo~71VRU6EV{dMAbRbr5cx7xya%p5HEFg1qWI8%_Wn*-2ay(LHZe(S0O=WXvR%LQ@Wq3X&DF7p3G%z$|V>D!BG%ztRIAdWjHZ?ahHDohnV=y&lHe@wsjt@{UM+PHSWpZ?7cmP&qa&%>QE@*UZYz_kiFJ*RRZgc=NHaTH2V`5@uVmM_vVPs)uH)1k0HZx)|I5%WDVPr8bXmo9CW)1)^b7N>_WOZz1E@*IY0CQt#Wn^`1WnVaGaBwbYbZu;w4@o*YQe|Oe0AV*_F<~`kGi5h9W@KYIF=b?CGG;YpVPrXEHa1~mVlnVKZiBG&eLiH8wb8Wj3@ACptPvVQyq>WdI{#Wi&EjVPY^gF*7-2Ic7O#W;JDFWn?&HI5{#fIW#h4v=1jNIy!A{b#8Phb97`nI&*Y#X>Mm7VK!tmV>LHoV>38mI5LMmQ0H(@a{FlA$$4@nTT4<{HpI%9HWVRU6Eb97`nI&*Y#X>Mmi8F*h(UVqu;SNfxvZCjvS;WMy-7a&LJkDF7p3W@BYGVm4x9IAdgCWH4kiIWuN4VL4+sI5jafH!w0Ypbts34<`ybI&W}gZYWQ1Wo}JxWMwG;BVjUPF*7tcIWu7~Wn*D6I5jacI50UfF*RahVPZHpVKkx-NeHwLCkQ$^ZeeX@C@COgZ*FsR03%^CIW;k3V`e!tHe)tqG&yB8VmUHnV`erqG&wLZGGSt*4@m~J4<`sZI&fihXecQlV{dMAbO0k^GG=2rW;Zc1F)?E~G+{VnVKy{jH#ae3G-76EH)dpErVmL5v=1i;Iyz)&a%E$5Z*qAkDIjBSZgX@1BVl1G+{JlH!);pVKQPiVl*-~WHK-`V`MNgHaR&rF)*qRNd~kJCkQ$^X=ErVAY*TCb94YBVKrklFfcPUVPRorVmC5oVq`ZrGi7CEV>2{3Vq!HjG^`Iv2DA?+2s%1&VRB_|bSNnxV{dMAbO0k^IA$|qG-5I`GGu0AGchzUH8Wx|IWc4~Gcq|iF=a71t`A8Dv=1i;Iy!S{Vr*${XDBHkV{dMAbO0k^HDP5pI5uHpH8W#1Ib<<8Gc-0eFlA*mV>mNmW@9)sun$QFv=1i;Iyz%$X>4RDDIjBSZgX@1BVjo+H)AM4TxV{Bn_b7OU4Z*yNUUom5Ea%EpJUom81bYWjHUol2$Y-KKJbZu<54>CGBYh`(J03%^zHZ)~pH)Jw6Fk&|_F*ap5VPrHhIc7OzH#IUcGd46`5CA$lMR;Rub!24#b98cbV{~J6VsCR_F<&udZf9w3WnVF0F+p>4WpqttbYWjHUok~^V{CO~WiDuRZEVE{4dK8H!v__F*Y+fFgZ46H8x{6IWl4}Ibmcqzz-riI&)!daBO9B03%^CIALTrVPQ05Ic734Vly>mH#9dnF*RX1Vq!L7Gd5zt45lGchnZWH&c4H#TKrFl1(7W55q0Iyz!$VRHZ@VKX>lF*Rm0WM*PzFf%t{V=*^nI5jvjIW}cxH!w3YIKU4gIyz!ub7e+yVQpn%b!KK|asVS?V`MimVlZT8I5A^6VmC24Vq`HnHZx{pH8(J2VmLB1zz-riI$~^faz=7tZDnG0W@cq_03%^JW@R@pHa9UjVK8AiWoBVyGB`0}H8x>5Wnp45G-EZu4BVjdVV>vQnHZwG3VKO#lF*#v2H8W;7F=aF~WHB{2W;MbH06IENZ)9m^X=QSAMRsLwbO3X7a&=>LV|8M0b6+uEF=KCXWnVF0F==mKF<&uFZ)9m^X=QSAMRsLwbS`LgZEW}m054;2ZgX^Ubz^jCVr*q!b#!TLb1rCbZ~$X(ZgX^Ubz^jCVr*q!Uv+e8Y;#{YXmD^YXmo9Cxd8w#bY*NWbaG*1X>MmOXmD@MmUEnF*!J9I5jiL4=e~eI(A`fb!8|iAY*TCb94YBVKO#iH!?S7H!(3}WHK`~Ic7CBW@KSzV>C24W-u@?HOCK52518SIyyvUY;<8%X>DZyb98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUok{wY;<8%X>DaLXmo9C`2hzAIyzKuZ)|fqI#h3OY+`SCIy!W3Z){?3cu;J0XK8LILv>8LVsCgYbZ>8LEpTjgXK8LOXmo9CBWGbTFgRgkF*q|fVq-8fGGbw4GiEq3IW{&jWMyGvH85t%4?+gp4htZ{yC76=Z){?3cmQH=crA2qZ)`1aY;|X8ZZ2qaZEUa$7CJg%Yye*|Uol~9E@*UZYzzPZFK}#iXK8LOXmD@Ma|b!258Lb6+xZWps3DZfA2}UukZ0aAjk3Z*pHUaBOvFX>MOQXmD^YXmo9C*AFN$Iy!A(Yh@@`Z*pv8CM+Ofb#!kmAY*TCb95kcbYwa@c4cF9Z*n|Sd2@7SZBKA?X>V?GJ|-yuBVjo?I5TEAG&VLcFk@zAIW;(DVr6DGHfA_sV>UBmGB(c-N-x(BC<;0{Q+acAWo;-^d2@7SZ6+ou03%^yW;J9oHaRgcWiVl5G%+mfu)elMrXafK`I#YRbbY*P-V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF;jVSbY*QWXmo9CUjqOybYXLAE@*IY0CZtBVlDYGdDLlW->ElIc8;MF=8+lF*GzYV=_2m+Yd`K-w!D@Iy!S1bY*g3bZKvHa{wb@WMedBWjQotFgRf|H#1=~IXE~lFk>=gW@RvDVK`$o?++t7I&^4qWpik6Y-9iDtoVlgx^WMuCTBRV>1ZggdCb7^#W03%^$WI1ACGh$>pVq-F6GdN)~VK`zmVPQ2kW;8ctF=J)#4oVPs=w?++t7I$~jCYesTmZDnG0W@cq_03%^BFgIZ^V`DHiV>x7DGcjRfHeok2IW%NAIb$?2W;8kP4Q4IAu2P4e`FH(_OAIWRS5WnndAW@cn&WjOB-BRV>BX?kSbairN03%^AIW;jjV`gGDGc;o}Hf1(AF=S*nG-6>kVPaxpH#aoz4BVjaSIb$+rWH>irGB-CcGht(7I5;#Z*OfbXmo9C&I|xAYIARHE@*IY0Ap`*WnVIBZewh9WMyA6V|8M0b6+xJZ*pZ{GGt+NVP7(HWpZCKYIARHUpQ!Ra4u+cZEU##054&1X)b7RZ~$X(a%EpKX>Ma|b!25V>UD~E@*UZZ1xXFIyz`!Ze(m_03%^$H#uW5Gc_bS`LgZEO_`1TSr6b7%lJVmUB5VqrLBIb>lsW;HivHZ(XhVPiF6G-YFCV_`8aXmo9C`41{OI(B7a03%^FIXPlBHa9miHD+dEGdDFeVlp%}Gcq+WVly!|FgP^u0RTEWLuGDsWpYnuO<{9$0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUok^vZggdGPi9SFb8{|ebZu-a4*)N8VRC0>bS`LcZ~$^;Ze(S0UovE6W?^+~baP)abYXI5WprOSXmD^YXmo9C{|^{7IyzxWo%_*bZKvHP;YQ`a42JMZgX@Xb97`nI&*Y#X>MmGEFfcbVsCRgI%RHWX>MgYIzeuEL349ubS5kyV{hVsrYQg;VKX&lI5{ymVPZKmWH4efWiv22IAbw5Vqr96IWjY1IQtJeGye}5H99(Bb8}^MQ)O&rV{~b6ZcuMKlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIBZD)09UovoPb!TaAUpQ!Ra4u+cZEQ{u4Mg-GHGsOY;|O1UovBLVsCR_GG%UOX>Mg-GG}ReZEtg5GH`5lXK8LMa|b!25M+1asVS?F=I3`FfnE_I50I~IW%QAIc8=yFfw5?V=_53HDx(u2oNDwoI5c86FgG|gIAu9xVlXx_WH~rw1`t;hy9@w2I!0IUolf-Xk}z|Y-L|DUolQ^WMxTYE@*UZY)23(5IQmV>x9uIAbz1GhsJjWil~gFf=n_4G>HaM-VClIyz}?b7gXLQe|^*b#h~6C{!r`BVl4WGBRW}VPs@AH90ggWH2ygHZ@~1VPP~dWi&TpIXDjxOaVs_Dh@h2Wo>Y5VPj=dWpi(Ja${vER6%lQb08)rATBO0DF7p3V>L8oH#BBrGc{#1G&wmmIA%6CVmM}DG&f^pG&Ny05fDraM-VC*Iyz-?VRL0tWpi(Ja${vEV{dMAbRcqNW^83+bZKvHIyzK&aAhVb03%^AW;iisGBsm1H90akGc!11WiU50H!)&kHZm|XH8?X95KI?G5Gn#XI%RTUb7fLxb8mHWV`V5Q03%^#W-~H0HDzNoW??vEWn*GAF=J&jF*#&2H#9jiIAb*x5KKo9Dgrt>V{&C-bY&vK2H8^53Fk>`fFg7w|Gcz+eW??vCGC5=y5KKo9DhN6{WMy-7a&LJkMQ(Iyba^QNBVjpaH!wCdG&y2pIAu9vV=-bdI51%`W?^A6V>vc6H#Hd$Oa?~~Di}ICb8umIZYX1KZgX@XLTq(qaB^vGbS5kyVsCG3DF7p3Vlpu`IW;&qGiGBoGBY<~F*G$|GBq$WW;rx4W@9ip8xTwuM-VC~IyzxwWGF>$bZK;XEFfcVZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CM+O!Z)s#IDF7p3HDod|WHmWAG-NbkVPj!3Hexq4Wo9&CH)c68IW{+B9S}?=M-VCtIyzxwWGF>$bZK;XEFe@V03%^IW;QT6Vly!`GG=5qGc-0bF*9OgWo0-rFk&-iWi&Y-5KIY25Go-$I&x)gZ+2xUMQ(Iyba^ZwV{dMAbRcqNW^83+bZKvHIyzK&aAhVb03%^AVr4mEHZ)>5IW;vfFg9d0HDh8lHDO{kI5K84WHT`#5KJFO5Gn{dI&x)gZ+2xUMQ(Iyba^QNBVjZ-HDozuW?^ABHDWn4H8MCdIb}IFGBY(ZGGSymW;G)aOa?~~Dlj@aa%F5`bY&<-ZggpMc`P7BZggpMc`P7fZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jc5i89Dk%UXVL3KqFg7%1Ibk(0IWRFeV`F7CWoBbIGBIRiIAJnjHYE^DE=Le56FNF_Wo%(|Whg~%bZK;XEFeX0bZK;XEFe@V03%^GV>o7GHZ?e9Gc;vlHZo)}VPs)3W@0uoVKQcBIXGe`5KIwA5GpA;I(2SxWo%(|Whg~%bZK;XEFeX0bZK;XEFfcVZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMf_TVKp{nFfwK}Gh=2qVKXvgHe@toV`MfpVPj)BGh;AgW+@O%Cr1z}5IQ<_ZgOR8VRU6EMQ(Iyba^ZwMQ(Iyba^QNBVjW!VK*>0V>n_oH8M6hFgZ6iWi@0rIWb{0HZ?b4HZv;_Ob$m7Di}ICMQ(Iyba_H`X>4R=awtP@ZEaz0WI}ajW@U0FEFeX0bZK;XDF7p3WH>fBI5{&jVPiBkGBq(VW@Tn#Wj0|nH)COBGBRW{Ef7o=M-VCqIyz-;bZK;XC@COgZ*FsR03%^IWMMR9IAdZtFfw8?I5ab1IWRIbH8V71H)A(sGcz+U5KIO~5GoBiI&NWYWn?IGbYwa@b98cPZf7X~BVjTyF*PtaHaTQ5Gcq}0H#BBtGdE*3I5%NsVmM}DW;QVpObbU4Dj+&KVPs?|V{dMAbRcqNW^83+bZKvHIyzK&aAhVeAa-wQWGX2DBVlD^WiVqkG-Wn5H#Rq8V>2~oH8x{qWj0}CHaTN5F=R6kOddxNDg!z?VPs?|R4D)>VKp;hVmV_mHZnC~G&5voVl-heV`4QnGdW^mVK8A~V>J*=0Y?xjC^|ZFWo%(|Wn@NjZ*3?=ZggpMc`P7fZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jc5i89Dk%UXVPiOCF=97nFfuh^Vq{}sIAu9yI5IFbW@0fnH8*55V>b{?CPxq|3pzS-Wo%(|Wn@NjZ*3?=ZggpMc`P7QDF7p3Vr4UCHZwOgH8eA0Wi&E0VlZMjH#asiGd5u|HDqBpIS@<bZK;XEFe@V03%^$Vl_8mW;A3mWnwsGHaTKBVKOo`W@2JwW;Z!DVrFDL5KIY25Gpk~Iznu9WpHw7ZgfI*X>4R=awtP@ZEaz0WI}ajW@U0FEFg1qWI8%^Zf|mAWpZU?Uu|JMmGDIjBSZgX@1BVjl*I5uTvVP;`DV>UKpFkv-0HD+RBIAk(mGGs6}H!wjEOc+NHDm6MfVPs?|V{dMAbRctdWI8%?baH8KXC^ElV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAa-wQ;((?p03%^xIAmctW;bFvIb>#IGBq}3H90gjH#IppH8f^nH#9gy5KJ>i5GofsI$>mFC}VGKb95kcbYwa@b98cPZf7PeAXF&;BVjT*Ha0gjHfAs|H#22sIAmmGWi&QsVq-8jHDxztH8MpIOciJY06IEDZ*6U1Ze()+V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF+*={ZDDR?b1rCfZER`~055NFbS`LcZ~$*`bYD1VaBwbYbZu--69g}CXnAvKV{-szV>mG}FlAw8Hf3ftFl9J0WHK>gH#9k9H85c@I5asfXmo9CNe}=pV{dJ6Z*FC7baO9lVRLgXXmD@I^5Wn*(LXmo9CBWGbUGBY@2GdMRjGcz_~FgG?dFlAymHaIXcGdVM6HZx{y1`9PhIz>ZMIyz%-ZgypIbVY7-X>@62b0}kPZgX@Xb97`nI(2Sua%5$4Wn^D%VQ@S}ZggpMc`P7BZggpMc`P7BZggpMc}U`brYQg|Wn*(LXmo9CBWGbUV>LE6H)1zoFf(IiV`Md9IW#sjWMO17VPa-6W-&5M5H~Yy1`8mdEnIA%3rG-WY0W-&K5IX5sfIWu7~H8eL*5J(nX5GDvZI%j2cNn|J~AY*TCb94YBVKy*fIAl3BIb>rrG&4A5Wo0sEG%+(}I5}csIXGo8VNnoB23-&)2s%1vWpq$sbZ96kAY*TCb94YBVPiBlHZe9gGi5k2WH@CvHfAz8VKz2mW@2GBH#K52I8zWv23-&)Bsw~CWppTWbYwa@b98cPZf9S1X=QgTAaitNIy!T7a%pa7Uv_C_cPRiPVP!C7IWS={HZ(Y6VKp^3FfuS@V=*vcV`4O8W??fhH&qZwB3%$B5;{6^Wo>VEWhirWWI8%?baH8KXJ2+{Wp^n6BVlGaVr67wV=^^iIbvisG&5ymIXPiCGc;plVPRrqH)2;1NDx~PCH9285Wi>K4Ha9jjH!)>6VmCQrGhr|=W-v8jFKNZES1?3n0R~AV+0yZDn+Fc>pbEWp8aRXmo9CiwyuTaBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIMZ*OdKUov!ZVQzC~Z*py4UuS80ZEs&PaBOvFX>MOQXmD^YXmo9Cu?7GyX>DO=WiDuNZ~$p-VP|DuGHGpLXJubFXmD^YXmo9Cqy+#kaBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIPX>Me1cV9AaY;|X8ZeKWPaBwbYbZuMOQXmD^YXmo9CY7hV~b#8BRWMy(?WM5)wZDDXOXmD@DO}UpQ!Ra4u+cZEOz)0WV}_Vs&R{WpXZPaBu)+Vs&R{WpZCQXmD^YXmo9C`2hzAIyzEiZe(S0IyysPb7Ns-Wn>_8Xklb;cOY$HaC0DXVRLk4a%p;HaymL=VRK_)WMyPiXklb;cTHh%b5db*bY*gBdS!A@Y;|X8ZYV=_VsCRMDFAY1Ze(S0En{JGV_{@vWG!=OVPtQ2Ep1_Nb1iaVb97~LX?kUHEpTjgXK8LOXmo9CBWGb{Gc`0eVKp@}Vl-wkWiVxCVPRr5Vl-njF*aj2HDhFD5L^a&1|uMHVRLk4a%p;HasYB+b97~LX?kUHEpTjgXK8LOXmo9C{t5&yW^({HIc794GG=6CH)3L9F=RJ0W;teLF=1giHD)$3IAmciXmo9Ch6eyIaBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVINbZKmJUovKLWo2JqV_|J&a$#RGaBOvFX>MOQXmD^YXmo9Cxd8+(ZDnn5a(MtbVq{@vIA%3AF=AygW@cnCGiEk1HZwOlH#s+AH!xx@Xmo9CZxAgyI%#fhWpV%`VP-NgIWT55Wn(urHaRmjIAJznVKFyjWn?xqWHV(sId2dxIyy;ic42I3WB?;!V>mEjIXE+BHZ)=|IAvpGH#s*nVK-(mG-72qGGb*pZxAgRIy!G~WpZJ3Z*o07C}VGKb95j?VRT_sd2nS(WF{#fV{dMAbO0k^GB-6hH83+VIbmX9VrFD!WH2=}H8nLjV>dN3Ib%35Z4gfvXafK`Iz(Y~VN`i=Wl3ZJb98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUok{sbYWC^aAiqkE@*UZYkFkv+@VP-jHFkv%eGBjZ|FfleVIW#k7I5c86GItO#Iyz%-ZgX^DZgfI*W@cq_03%^!Vq`KhWjQuEV>mK1Vq-KlGiEq4GGjF{Ha25sG-hLQ5Hdn(Ze(e0XHaixZgc=MGB{>tWHe)X6F<&uMd2nSeXmo9CM`d($X>MmAb97;HbY)}!XJvGBX>MmNb97;HbY)~NXmo9C`2hzAIyz8jd2?xFb2>Ula$$C9ba^^DXL4b7X>@r|Y;|X8ZYV=_VsCRMDFAS2d2?xFb1i3bVRmVBc`a~kb!TaAE@*UZY$Io3H8(h6Gc_<|H8Ny3G&wXiGc#r|H8D3dW;Zl2IW;ync@RYg`2hzAIyz8jd2?xFb2>Ula$$C9ba^^DaA@rlaBOvFX>KlPbZu-SXJKJCH!w0{G%+|iH90e6H8?XdVl^{iGB-A1Vl_53He-7bMFuSq45Z0B3Sxc4>5ZEpTjgXK8LOXmo9CfDk1*I(BJgcW`fVbWdhxb7gb@BVjOPG-fn7GC4FbVmD@FF=IA1W;i)HW;QWqGht?AG&g_{B|18GX=QhCZ*p`~X?kSzwb5w6GXmo9ChY&70I%0KnbZ>5R03%^yVl`%EF=jV2Vly&hGGjF~Ff}zYWjQuEIAdZmH8wei5H318VR&V803%^BF=1t7IWsUYWid8mWHmEnH)1zsI5%Q8H8(L~Vl-uk5H1xuI&gAjb8}^6C`Vy!WpH6+LUnX>Z*D0dV{dMAbO0k^GBY+XGdM6dGc+|eH8L%w?VQpn_VPrvgX>%zcV{dMAbO0k^Gcjd0GB7h`IAS(9HZe0cIXPi6FgRgiHDqKqWMyPIg%D5?!UzC5I!9q`WpH6+Q*>c;WdL(@a&=>LV|8M0b6+uEF=KCXWnVF0F==mKF<&u9VQpn_VPsQuVRU6KXmo9C`2hzyI#OkBWMy(XI#OkBWMy(7RAF*wWpp|^a%FRAdSy~&Ze(S0RAF*wWpq?wX8>|#Ze(S0Ep%aWXJvFPaBOvFX>KlPbZu-SXJKMtG&nahH8o{8GBjp2H#svgWMML5FkvubVmCEnIWhSG2Rb@ZWo~3;aymLvWo~3;av)S;a%W|9Iyz)>VRuw-Qe|#rWpY$ua%W|9RAFZTa%FC0WpXWaVRC0>bS-dfb!TaAE@*UZY$Io3V>f0qV>B~jW@a`pGB#sjHZd?^G-YC9H8Np2F*!A5`2hzAIyzEiZe(S0IyzEiZe(S0AXH&;XJvFcI&x)hWMy(xVRC0>bWm({XK8LILv>bS-dfb!TaAE@*UZY$Io3IAk+_VliegH8wC}WMVU8iV#BvrU(uo!n+_+Wo~3;av)S;a%W|90CZt;XJvFPaBOvFX>KlPbZu;<5G@EgI&NWYWhf~iV{dMAbO0k^WH4blI5=TuH8nY7Wi~TqH(@w5W;J0pIAb|vG%;c@jSx=;r4TI$Iy!S`Z*p`_VQpn7DIjBSZgX@1BVlGRFfcG;Gchz}HeoVlG-G9DW@R)rVlrbeIW=TuVPuaGPX?tBEeJX~X>%wkAY*TCb94YBVKz4~F=aC|F*Ri|H8?UiHZeJ5HZU?WH)1hjVrFJDVUZ9|2Bi=!13Ef)X>@2PR4D)>VKHMlH8o^5GiG8qGGjL}VmDzqWMVcqWMgJAGc-3hIg=1i0i_TvBsw~GX>@2PV{dMAbRblDaAhVeAa-wQWGXBmc5i89C@Lu^c5i89Dk&)dBVjT#G&wakG%#jmWnyJHVmD)DGc`9dHfCZmHZ^29I5m|JPa>rdEeJX~Xkl|GDIjBSZgX@1BVjQ(V`eorGc`FgI5jk3GB{>2W->BmGcjZ_W@TeGHDi|$PX?tBEfYFAXkl|GV{dMAbRblDaAhVbAY*TCb94YBVPa%3GG;I{H!(FbHDotoH#K57GGsM0VKFo{VKXveGno)i5v33<2s%1vWppShAY*TCb94YBVP!UAW@IokH#smdFgG|jVrDiuHD)$tGdDIiGczz@G@B4l2Bi=!6FNF)WppTGZ*FsRAXIs9WhN;gV{dMAbO0k^H9282W;ruBIWsk8WM(p9FgG+gVKQbpFl00|Vq;}xoe)nEr4TI>Iy!G~WpZJ3Z*o07C}VGKb95k7d2nSWDIjBSZgX@1BVlAPGcjalHaIppVliejGh}8tWHMzlWMMUAHD)t5H)Wp?PZ6aMEe$$4V{&C-bY&=WbYwa@b98cPZf7X~BVjNyGc;r|VPR!uG-NY2W;r)EWi?_oG%-0gVlZW6WH+G@PYb0GEeAR}WMy-7a&LJkRC#b^CMf_TVKFf{W-~c9VPs`tW-&BoHexa`VmUN4HDhIEVK6u}VxtgG1^58~IyzK&aAg2vY+-YAV|8M0b6+uEF=KCXWnVF0F>+;QY-M9~X>V>{F<&uMd2nSeXmo9C@BsiiI!AJ0c4>5Z0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUol5=VRmVBc`j&lZETPS055J~ZDlTKaBu)_VQpn!IB0NiE@*UZY_bq2B|17mb8}^MLUL(jXJsg3Z*FsRAY*TGWjZ=?WoB$;V{~b6ZaO+td2nSWEFfZUZ)_<5BVjW&IA%0CV>35lIXE#hGG%6CGGk?CHD)(tVmM+oVq~ZgN+YrmC>lCCY;R#?C_!^`Wpr~UEFfcVZgX@XL2h|Lb8}^MCMf_TVKFmgH)b(mFf}kXG%{piH)T0CHZx{5Fk(10Ib<+3G^!9v7_ty3AUZm8VRmIGV{dMAbRa=e+qF*rG7VKp*kV`O7yt`JHFvJfZ;IyzxVP^nxWo~3;axG$PZ*OfaaBOvFX>KlPbZu-SXJIljF=jVoVKFvjHZ(XeWo9xqV=**lIAl37GB9H@G-CMy2M9VkQe|#rWpX+?LTqnuZ8|z)Y;SLEP;7N)X>KS(bz*OGCMf`NWo~3;axG$PZ*OfaaBOvFX>KlPbZu-SXJIg7H)3QnHe)blG&yBtGh{JlIW#k4H!(C}F=AsdFgUajLI$P?4j{t2AVO?!Z*2f#Y;SLEEpTjgXK8LOXmo9Cybwh?I#q6KZf|#P0AV;dF*q|~IW#t7V>MdKmH)XsKMLIfFZftL1WMyOkVPQ34Wil{fVK-)EVKri8GdN;qFl1w8IXGoDHDY8kWV{eXIyy{mVPt7;X8>U_HezOCW;tUtHZnIhGGk^jV`5=6F*7t}V>L5lH83>15JfsVOmAUiWn=(hH#0afWHdN8WHC56G&N!~H#syiGBYwYV=!SiHaKK9ybwh?I!0k>Y-MBsVPrRBIAb_9VrDlvVq#@6VmC23I5asoV>2>iGh#4fVeJqjIyzHyVRUtK03%^FVl`o8WMpDBVKX&1Ha2B8GBGn|W-()8G+|_7WjQwO5F-LQIze-DWpr~WDF7p3V>C5pW;QT5V=*^5F*h)XCazb)xWM^e4V{dMAbRctdWI8%?baH8KXC^Elb97`nI&)}Ya%E&+aCCA!L349ubV71zWM^eQDF7p3IAUaFGdW>3W-?(lIWS^5H(_QqWMnxxVL351I5}lEzYs+*?GPgZIyz%)Wnpf0a40DNBVl1VHaTHAVKHQ6Fk>?~Vqs=DF*7(cGh$|CG%`44W--AKMePtH5;{6*ZE$aLbU|!vD06gVIy!T7a%pa7Uv_C_cPRiPVK!uDVKrrCVK`MdFb97`nI&*Y#X>Mm!xI5}o9#Sldh?GPgpIy!7`VPs8ZbYUoSbYwa@b98cPZf9S1X=QgQ03%^#HZ(CeHeq5lI59XkV>e@DIAUdGHZf*6H!(IbIAt@(5JeE}5F-*gI(2SrZ((FjWprUEb97`nI&*Y#X>Mml?GPgnIy!7`VPq&lZh1j-b7gcXAY*TCb94YBVP!KmW@BbCW@0g6G&Ex~H(@j|G-ESiVPZ5hVKrkkV#^Rk4($*l7dkp~VRmIrWprUEV{dMAbRa=)c|mh?WppMfAY*TCb94YBVK!tmVKy=`VPiF6Wnp45HZm|`WHMu8WMg76Ha9jnFwGD}73~ls7dkp~VRmIGV{dMAbRa=)c|mh?WppMfAY*TCb94YBVP;`DH!?G3W;0a%psBC_!^`Wpq4LJ}CerVPj%6F=1pmGB!6eI5{&kF*GtYH!wCbF*9Q{HZ){pX4w!$2<;Ff7dkp~bYXOLb0}kPZgX@XL2h|Lb8}^MCMh6eZ*FsR03%^$Wo0mAHexU{VP;}5Vq;-5Wid2nW-&21Vr6DDVK+D15JeU35F-&fI(2YlVRU6EL2h|Lb8}^MCMh6eZ*FsR03%^CIAJ$oWM*P8VK*@`Wn(jAV>MwjFgap1IX5sfFk)fd5JeB|5F-&fI(2YlVRU6EL349ubUai(CMh6eZ*FsR03%^xGdX5tWHMqmVKg>oGBhwXWH4hlG&Er_F*q?ZWiesj5JeB|5F-&fI%#fpVQgt+VRU6EV{dMAbRa=)c|mh?WppMf03%^yH)LaGW-~Z4VqsxpFl0C|VKZblIWjXjGB-ChFfn1_5JeB|5F-ORI%9HWVRU6ER4D)>VPs=wV=*~7H85i}Wi&Q7WMXA7IX5seIW;zBHe@p}G2;+L0qqbY4LUk=bZ>HHC_!#{L349ubSxlLDF7p3H)S_4Wn^PBHDY06Wi~QlVly^jIWsjfVr4ZsFk(1m`iHZx&1H8^E7WHc~hVq!BkIAu6E>kvg1D+wKQ0CO&AbZu<*5I#CONp5s+03%^#IXPxEWil}{G&nbAFkxjgGBadkVP$1AWMwsGV`DV-5I#COMsja$03%^FVq-U9FgIglWHUB4VmM|rF*Z47H!wD1G%+<{GdN-P5Izh#I#YCVX>MmjZ*F#Fa&u{KZd7t%X>=$_Zgg)fAVzX;Z7BdFVKy-|IAS+qFk)n6HDx$sWnnNdVlg&lVlrhiHeog~IPef)3ic2_6FNF+Zgg)bV{dMAbRc$bX=ExXAY*TCb94YBVK_BoIAt?6I5aXeGd5;5HZVCdHeq6BG+{V4GdVG4Ir0!-5%v&1Av!u{a&K)Yc5i89Dl8ylZ*FsRAaitNIy!T7a%pa7CMh6eZ*FsR03%^yH8L|}H)dsKVq{`vF)=x0Gh$?7HD)kmF=S*oH#0Ky5MUqp0RTEWQ*?4^Zf8SpZgypIb7^mGRB~ZybO2*)VRLh1bz*OGUol@XV{dY0Uol@Xa%E<0Wn*+{Z*E^PUolg3a%pa7LvL<&WpZdN0y;WyZ)|Kuc4cmKC@BCVVP!L7Ff%bUHZfslVKOygWn(rpW@R^KW??WlH)3QpW%&?IBM~bCIy!TAVQ@lqW@cq_b0{eQBVjaQH90agGd5;7W;A0sWidH4H)1kmWjSRtGB!9kVKDm;O(PL22s%1)Wo~3;aztfzX=7z5DIjBSZgX@1BVlDQIWS^4IAb?sWnyJ9Ff}$}F=8|{H)dvJV>B^0IW_$dO$H+oD+oF|b7^{IC@COgZ*FsR03%^!Gcsl{Ibk<4H8VM7H#9Y6F*RahVK`!AH8M6~F*auZ5KRUn5i1BfI%aZVZDnG0W@cq_Q)zl-C@COgZ*FsR03%^!IALWsH(@bmI5K2qVl!lAV`616V`FAGVqrKoH)AjX5lsdo5i1BfI%98cbY*UIQ)6LlWhf~iV{dMAbO0k^HeoenH#A{oHaRh6Gcq+WFfuh}V>mK5V>4xDH#KHq0})LIBM~bIIy!S`Z*^>BLu_wzWhf~iV{dMAbO0k^He)bjG-NX{FgYc;WhhN=b#rA?bYXO5DF7p3HDhElVliYhVqs%sV=!bkWMyPCIbmWkG&nLfWHM%C2@y>SBM~bIIy!A{b#rA?bYXO5C@COgZ*FsR03%^DVq-KgVKiYfWjA3mHexd}H8EsiHDWV2HZ@{7Ib<{o5lsdo5i0^ZI%j2cO>cE`Wl(Q(X>@6CZYU`LBVjZ&G&f{8Vlg>3V`gSKV>e+qWH~oxWH@6tF<~%fWHb#CO(PL23_3bV>QXKZacI%#%gV=^fKBVjNxG&MIdV`4ZtHe@j}F=8`iW@KbHVq#`6G-fw8WMU5yO$s9sD-t?7V{&C-bY(+za&vETC_{B}b8m7wI#YCEZe(F{WGMh6VK!ngVr4U8Fl1t6HDYEsGhtykI5A{qIAt|uI5{{rV-XQe5F-&Q89F*+b#ilWawv0jWI8%?Xkl_?WM6P}ay&zIa&vETJ}CerVP#}6G-fq8GBr77Heq8jHexw7GiEYkWH>cuWHdEpW)l%j7b6iX6goO%Y-w;}Z((v|C}VGKb95kcbYwa@b98cPZf7Pb03%^CHZV71V=!i6V=!hpH#an8GBRZ`W@2J9FlI4gV_`8B5ls>!5i1BfI%8~UaAI#^a%3neAY*TCb94YBVK-u8VP$1BH8U||GdW^5H#IgkWid20GdX54Gcqt^Fc%R`1|tzG2s%1#Z)9m^X=QSAC@COgZ*FsR03%^FGh#G1G&eV4Ff%qWI509dHDqKpGd5y5WMeZkI5jXC5lsdo5i1rtI&gAjb8}^6C`)B|EFev9WNBt;WpZ;VAY*TCb94YBVK*@~I5=WsGh#I|IX7ZvFgQ0kWHezjV>UE7F)=ncH5(C46eAHU6FNF@a%FRKWn?H#Z*_BJLUnX>Z*D0dV{dMAbO0k^WjJ9mW;QftH#0ObHfCaFVlXphHfAtnWin$iHZ)~p9T80tBM~baIyz@zZDnv_WK(oubY&=MZgealM`3McaA9OqbYXO5CMh6eZ*FsR03%^zF)=eYVmV`EV`OA9G&DImHa0RdFgZ77IW#z8Vly=#5lt8)5i0^ZI&g1nY(;iuZgg`fDF7p3VK_1{VK8JcGiEVlWj8irHa9ddIA$|rI5aY0HDO|8ArVc&2mm@dLSb`dS7~l!Z+8G=Y+-YAV|8M0b6+uEF=KCXWnVF0F==mKF<&u4VRL0yX>Me1cP?mjZEQ&p0WWf8b8mHWV`XzMWMOS^X>MmOXmD@VAc{(~%baG{3Z6+xIBVjUSV>DzoGc-6cH90ggGcqwZWHUE2G-YFDWn(a9HDx6cN-rr9C^b4db76L6RBuLUY-K28Z*FsRAVG6;Wpr~UEFfcVZgX@XL2h|Lb8}^MCM+OhZ*pZiI&EcbZ*qA$I#YDwfTk$`BVl7SGh{b6WM(p9H8MA3GdN~AIW;$AG%z$bVl*@|H)JOfN;3}(077zUWM^dnV{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XNo`?gWkPakWM^eAXmo9C^bY_pb98cPZf9S1X=QgVXmD@KS(bz*OGCMf`LXnAvKV{KlPbZu<-2mmi;X=Q9=b1rCbZ~$g$Wo%?~UpQ!Ra4u+cZEU##055K3bT4&ea9?w8V{2t}E@*IY0Ci+=Ute=?V{2t}UpQ!Ra4u+cZEQ0UEjl`7ZggpMc>p6}FfuqeG-708FfcbXFf%tcI59RdW;rx5G&40hVmM|wGZ8I1I&N=rZDDKxBVjl-WH2#iH8M0~VPrWuG&MIkWM(;KHDfe5H#In9GiEapEjl`IZ)t9Ha{wb@Ibtv~F=J#iHDWntW@TnDIAS(pWnnZoIWjb5VKiei@BsiiIzw-6bYWw3O<`_nW^Zg{0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUok^(ZggQ|bWLGyX=ZP1WG-lQZEQ9XBRV=_Y;|RDa%paK03%^!HZ(9WIbkD+Ca&&V5BVjl;VKrkmIb~xpH8wUmWim5lH)CUAWHMwnH8y5pF);7}06IETV`Xk-0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolf-Wo~6IXmo9C`2hzAIyysdY;0+BX>V?GIyz%-Y;0+BX>V?GP;7N)X>KS(bz*OGCMf`8Z)|L7b7^mGb1iUeb!TaAE@*UZY$Io3Vqq{hGC5&3H8VLiW-(?pFg0UlGBP=2I5lH2V>x0uHxWPv`2hzY!n+_tZ)|L7b7^mGa{yy+Y;0+BX>V?GEpTjgXK8LOXmo9CM-eqTI&*MrX>>$sb97;DV`XyyBVl1UV=*%{VmD@CH#1={Ic7L9F=At7WHB)^V`eruGc!jKH99(NVR%Gob97;DV`Ts%VKFjgFf}%0W-?=9H8L_WH#9dkGc+|hH8f=~W-&4`V@DA+Iy!D;VRA%ib97;DV`Ts%VPa!AIb~vFHaRvhHaRzAGB{&0VK+8qIb|_sFk~<_W=9bI(2YlVRU6vXklb;cTHh%b0}kVVsCRgI%98gWjZ=%Y&tqpWo~3;aztfzX=7z3DF7p3FgIdlWMepFW;il9GcsjiI5uW6F)%qcV`MNlHDY8kKM_|RM-epzIy!S@bVOxlVRdYDQ*dl)bVO-$bYX5|WpgNLZgeRCBVl7RH!wIiV>MzkVK+B0HZo;7H8V3|VKy;0I5IadV=_SzR|7{8H3&L7XJvFlb#iiLZgf*{Y-w~vX>)X8ZewM0C@COgZ*FsR03%^yFf(N}G&5#6GBIOeVKXr@Vlp>3IX5*jHZ(CeG&wRu5myFB5j6-pI%j2cLv?a;Wo~p+X?kTSDIjBSZgX@1BVjl(GB;*7V>vcCF=b(7VmDzqIXPr8WHm8lIAUTmI5$NRR|fC_06IEEX>w&_bZKvHVQf=qVPtQ2Lt%4tWpV&>baHiLbYpd5Z*yNUUomBFXK8L_Uol@XL}_wmV{~b6ZeeUwXklb;cSB)wbY*fbXmo9C4g&x$V{dJ3VQyq|E@*IY0Ap`$ZDDR?b6+@UaBwbYbZu-E3!^F=aPnI5A>lGi5PjI5=ZvV_`EeV`MfpGGk;hGcIU!ZEO_`1TS-NY-w~~b7OL4Wo`gAVlZSgH#agiI5;+9W@R!rIW{mhFgay6Vqr8nI5s#gXmo9CrV0QraBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVI8X?SI1Ute={WpH0IaBOvFX>MOQXmD^YXmo9CVi7VbIyzHyVQyq$a%4erV`yo1Whi5BZgX@Xb97`nI%a8XWpjCRbY*QiI&fihXeKNmVsCG3EFfZUZ)_<5BVl4NG&3+VF*h}4VmV_mWo9%nW?^GyWi)1HHfCcuIWbHTR48H*G6*_4X>MtBX<=+>dSzrNDIjBSZgX@1BVlAPH#TKBW;Zi3Fkv`kH8EmhFl010V=_5qW-u@`H)Bo_R0d)ZG9@}XV{&C-bY&=WbYwa@b7^{IUvw-Wb97`nI&*Y#X>Mm5kH!?FaWn(rrIbl!{R3l;$G7UO9WMy-7a&LJkb97`nI&*1yWnXkD03%^!H)dgBW@R}!GB;&5GB`D1WjAIsFk)dbWH>i6IW;v>5mXCe5i%1xI&NWYWhirWWI8%?X?kT}bSWTXZ*FsR03%^DVmCH9G-Nh8W?^GDHaIdlHaTK7Vl*`{G-fnpIXGcd5mXUk5i%1xI%H{bWn*-2a(O6obYwa@b7^{IUvw!TV{dMAbO0k^G+|<7G&5#0He@hiW;Qu6Ibk?tIb~uvFg0RkI5TB4RuNPYVi7V3Iy!P?VPsEkYF<~`iH90XkVK-!CI50OcWHmWAGBz?bH8xxkR1snkG7~yFV`yn?WGHiVWI8%?X?kT}bSWTXZ*FsR03%^HH#9jlH#s(CWnwTmHez8hVr64uH8y25GB;r`Fl8`a5mXUk5i%<}I&W}gZYXnfWI8%?X?kT}bSxl7X>4UWI!Iw|WNc+DAVz6yWjZ=faAj^yZ)9aD03%^xIWRdiWiT)>Wo9*FG&wRcH#s&kHZ(XeGdMFfG&g2o5mYG!0RTEWQ*>c&WMOh-L2_egX?A4*V{Bn_b7OU4Z*yNUUom5Ea%EpJUom81bYWjHUolg3VQyq$a%4erV`yo1WiDuRZER=*06IEUa%E*ya$#w70CRM5bz^j6bz*OGUol@XV{dY0Uol@XWn*(+F<&uMa%E*ya$#w7E@*UZY`+KqFKTmdZZ2qWZ~$d)XK8L_UovTKV{CO~WnVI5bz*OGUovHGXK8L_Uov5Hb7gdMUov8HX=G<*b6+xQb8l{6IB0NiE@*UZYzzY!Ai}#KL2`0oc_37BVQF*#Ep&2WX>@ZfVRCX|c`j&lZEVs7055WHbYXO9Z*DGVaBu)}Z**aFX>V>{IB0NiE@*UZY^MeYAi}#KQFUc5YY|umaS=8MIyz!ub7d$gAY*TCb94YBVKXyjFgY?|WjSGHVl!enHe)nmVq|7BGdE#oWny7wW^EBz25}KK0y;Woa&K)YDF7p3VmCN9F*jp1HDhF9W@RxnVmCBlF)}%3HDon0WMMfnZxLAd0RTEWNp5Ima%psPRB~ZybO2*)VRLh1bz*OGUol@XV{dY0Uol@Xa%E<0Wn*+{Z*E^PUolB;Xk~I~baPa4VQF+OXmo9C77P#|!n+_-WpZg@Y-xI7bZKvH04;N6axQ3eZES%NEh9QQMrmwiQ*?4=VQnZzX>4UWI!Iw|WNc+DAVz6yWjZ=faAj^yZ)9aGAXFwMDF7p3Vly^jHe@+uI5jgjGdMXjFfwFjVr4clFfnFfGcqz{a}iG=fe|efIy!P?VPq(FZ)s#IEFg1qWI8%?X?kT}bSVHMVKF#lGC4VAIW=WCHDh5iIW}T4Vl-rBHZx{3W@0sAHgyqC5`hsd8ag_6a%psBC}VGKb95kfZ)s#IEFg1qWI8%?X?kT}bSVHMVKri9W-u`^WHdK1IA%3AFfnC0FfnCfVKOl^G&DA2W_J-!7=aNj2s%1+Wo&FHDIjBSZgX@1BVlGYVlZQ2F*0O1W@I!nHZo!{HD)$tWj17DIbt_8I5v3^PX>VzEgw2Mb7f^~C~$OgWNBt*Uvw-WZDnn5a(OyBQ)OjqPjYEzX>KV1BVl7@G&nXeI5;vkFk?AnGGRG0Gc#o}FlAz7V>vKpGGluYPaS~~EeJX~Wp8FEDIjBSZgX@1BVjo=Vly~1WMemEF*0R1H8wLbVPR!6G-5L_IAJj{H8*_`PX>VzEdn|^aAjp{C@BCVVKOshH!x;qV>322Vq{}wW??uoGGjR~V=^>hGBY(dIDZjOv=1UvbaG{3Z2(hra%Ev{E@*UZY&i%3FK}#iXK8LOXmD@Ma|b!258Lb6+xWY+-p{UvOb{b7fyLaBOvFX>MOQXmD^YXmo9C5C#A*aBOvFX>KlPaBu*0Z*OdKUov!Mb8}^KVRUbEUovxYV_!0KWpi_7a$$6Db6+xZV`Xk-UteWpX>@OLUovoPb!TaAUpQ!Ra4u+cZEU##1TS)BW^83+bZKvH0A@5aF*G(fG+{MjVlibgVmM_vVqr2fHf11SQ)O~#VQgu7WpV&5V|8D+9Uol@XQeks+WpYz=VRU6KXmo9CkP#>_IyymhWNB|ga%p5|WhirWWI8%?Xkl_?WM6P}ay(;oVsCRgI%98gWjZ=xY&tqYb!2I8LvL<$Wq5QxDF7p3F=IAmWo9!oH8x{8Ic79uF)=YPG&VCdGBjZ`Vq`TliV;dKkP#>`Iy!7`VPr;fZ*4|tY-K1xb8}^Mb0#bxV{dMAbRa=)c|mh?WppMiAY*TGWjZ=-Wo>VAc{(~%baG{3Z6+xIBVlGSH8o{8HDfn2VlpvdFg7(eWMMKiG&p2oGi78sWjBlwN-vNRC^b4db76L6RBuLUY-K28Z*FsRAVG6;Wpr~UEFfcVZgX@XL2h|Lb8}^MCM+OhZ*pZiI&EcbZ*qA$I#YDwfTk$`BVlAPWjHuyHDqNnWin$nWi(_nF*9X2WHe?tVly&1GdGSAN;CTl077zUWM^dnV{Bn_b7OU4Z*yNUUomBFXK8L_Uol@XL3LzlZ$ffuWM^eAXmo9C4g&x$cW-iRWG-lMZ~$|8b97~GUov5GXLW65Zgg{BGIwusY-C?JXmD^YXmo9Cgb@HQba`-PUvgz)XPc`j&hZ~%09aAjX#a%E>}b98cfUpQ!Ra4u+cZER=+79hgAAVYO?bZ>1SL}hbja%o{~X?kUH04-y6b98TQE@*UZY`76A9y&T!Z+K;FP+@FkbaZ7Xb97`nI(B7abZ>GzR&RJ^Y)xTwWpZg@Y(6F?DF7p3VP-HfIW#q5WjSFnVq#@xV>w|pIc79wGdD70Vq|1Alo3lDxDhD=IyzQwcx7x*VQgh|bY&dW8F*so`H!x$C5lgrcDHS?8R&RJ^Y*1lrWps39C}VGKb95k9Z+K;FP+@FkbaZ7VDF7p3G-72mH#B2mIXE_DH8o{6Gh<|7G-Wn4WnpDxG-NX|m=Q}8xDhE3IyzQwcx7x*VQgh|bY&=3Z+K;FP+@FkbaZ7VCMf_TVL321GGa0|IX5vmH)1(tHDfhmIWssnG&wamV>B^2WSS964!9916*@X^aAk5~bZ>G!C}VGKb95k9Z+K;FP+@FkbaZ7VDF7p3Fk?AnVm4!CWi~l9W@2SFHf3fwVlXr`IAJz1H8M3aoDoYCxDhE3Iy!G~WpZJ3Z*n~-R&RJ^Y*1lrWps39CMGEWBVlAPVlg#0H8C+XHZx>5Wn(xnH!)&jH#Re3W;bOuVPl>VOAfdZDF`|`WMOn+C@COgZ*FsR03%^zVP!BiGdMOgH)dlrGBaW^WH~lsF=04iIAtq7h35xDhE3Iyz@%bSQOcZgep=Uvw!TV{dMAbO0k^H#j$CG&D3cIW{ymH8M9hHZf!{WM*SIIb%6FF*P`5q!CLFxDhEJIy!S@bSQOcZgep=Uvw-WV{dMAbRbr5cx7x&VRU73X<=+8DF7p3G&DFkV`VZmW;HoxGc;v4I5asiH8e9hFf?UmH!(FbrV&dXxDhEFIyz=)Ze%E9Z*FsRAXaa9Wo%7hbY*gBVQeNTAY*TCb94YBVKp{lWH)AFG%+?eHaB50H#lZCWn^YyG-hQtGi5krIj9j!8n_WD9XdK;WMn8~Z*FsRAXaa9Wo%7hbY*gBVQeNWAZBcDVRR_~BVjpVVKp&gGc!3jH8No}Vlgx{WMVO6GdD0aWi>W4H8-jeOB=WmDHb|9aCLKNC}VGKb95k9Z+K;FO<{Cpa%o{~CMf_TVKg`}IW;*oWim1}F)%SSWH>iBH(@ejGBYwXH#ImnGprFy6u1#796CB}WpZa_C}VGKb95k9Z+K;FP+@FkbaZ7VEFflVZ((#P03%^DVP!aCH8wV6Gd40XH8nLfWiVl3H#9aeH!?XlIWc3d5lb4l5h(&XI$~vKX>KSf03%^DVlrkhIb~vFWHB-~GB!ClWHe$qHf1w6I5{>nVKQW}5lgrcDFQk=Wo~3BDF7p3Ffuq~WHvBkH#RUiH!?OhH8No~W??mCH8e6}I5=cAvJp$T5h)isI&5!YWJYptZ75@Ja%DO?ZDnn5a(OyBQ*?4=VQnTU03%^GIAvsEV>CBnW;QfpH#A`}Vm3E6F=S#iV`4ZsH90i25la=g5h)!yI(KqubY)a;C}VGOWjZ=-Wo>VAc{(~%baG{3Z6+xoV{dMAbO0k^GBYwWGG#eoGhs6_WnyMwG-hOEGGs7iFk?75W;ilrwh>Dk@BsiiI#zFZWo%GkY-MzGWdLJrVRLh1bz*OGUol@XWo~C_Ze?FFUolp1cx7x*VQgh|bY(7RbZu-70{|~@Y;|X8ZgVbZaBu){Y;|X8ZgXEaXmD^YXmo9Cy%9e;I%a8QY-9isWH2{kW??WhWH)0sGd8^uKRP;gVQh6}03%^DFk~=fGBGn^Wn(a9G%_?WV>DzpVl`wqH#s?CIWjb12LL)cPjz%~b#wr8baHiLbYpd5Z*yNUUom5Ea%EpJUomoJW^83+bZKvHUol@XMrmbiWOGz~$Uc4cmKS8{1|WpXG*c4cmKP-$>wJXAg=DF7p3WHC56W;Zf1Vr4XBGc`FdIbmivVq-TsW@9%qH#0V4zY$Lj!x1eJIy!K5b7&}3EFg7mb7^O8Wn>^}ZgeRCBVjZ&GcYh>F*!ImVl-uDHfCmGH8N&7W;ixvVK_NqVl=@KPY-AV06IEFc4cmKS8{1|WpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=bRAF;#C{!r`BVjOPG-F|6HDNF|I5c50Gc+?cIW=WDH)J$8IW#gkWMjq=O99vsDGfS0RAF;#C}VGKb95k7VRLIHDF7p3F=1q5H!w0{W;8M~Vq!2dGBIIgV`MmGIbk_sG-YEk$Pr5m*bylRIyzKgb89G6VRLIHCMf_TVK6o^W@R)sW;r!6GG;eoIbvflGdDG6W;ZotH#s&rH_8!92G|iP4LUk+aAk5~bZ>G!C}VGKb95k7VRLIHDF7p3FgP$_Ib>xsFgYW@&C|b7&}3DF7p3Gh;JlW@a-nGBz?fW;Zl2Ib=69V>DtiWM(pBF*h?|&=E@k*bylLIyz)&b7Nt0WGE>BBVl1upIA%CCW@2SE)DcSt*bylLIy!P?b9HQVC@BCVVKp{0I5jyoVP-HkHfA(8W->B1I5jXgH)1t4GBjp0IMxwMl?4DgI#gkEYXDeI#gk2D06gVIy!T7a%pa7DF7p3GGSq6F*GnTH8Es1VKXx`GC5*nIbk?7Wn(cpW-vKp*%3zz-w`DUIy!D)ZDlAaAY*TCb94YBVKHT7H)Az2WH2!{Gd5&pWiVo5H8?UgWie!BGcz_aHro+L2Hz1S2s%1xWGE>hV{dMAbO0k^F*P$aIASnmF=S#iIb~yGF*P$XFg9g5IAdZsH!?Ic-4RCyXafK`I#gk20Ap-nb8};LVsCR_F<&ubZ*pZ{F<&udV{>0IUoli+XD(=TZEO@0GCDd`Wpi|8asVS?WiVkhG&43ZWI16pFk>(`IWjdjGG#b4G&g22Wic{h6cREzI#XqIbY*e?BVl7UIAdcuWi>QoWi&A`H#uW5HZ(XfH83_YHf1tpWH1yGG6Fg}MQ(L%RB~ZybSNnRBVl1=H)b|7HDh8mH8f;oG&wS3VP#@5Gcz$WV`5}6F=65nR1^|24LUkSZgp)`a$#w7C`E2{ZB%k$X>=wgDF7p3G-PEsV`eg9V>dZ9F=1jiI50G2VmV=AHDWVlF)?E?5baZ8MDF7p3V=!Z7Vq!TqF<~<@W@TYwF)%r1V`E`4H8V3dGcaT^<`GmI6cREZIy!f0bZAy#a%o|1bSQIlWI8%?baH8KXDlF8Wpi|8ax5TIWps39aw#AtCIBO0WH>W2WjAFsVmCQvWil~gH)S|5H928pH85mlG&N>o=n+&N6cREJIy!f0bZAy#a%o|1bSQIlWI8%?baH8KXDJ{iCIBO0IWjRaVK_N3Gh{MkVmUNpV>DwmVK`%BVKg>5IbJd~96cRETIyz%-ZggR3ZgVJOZ*FsRAaitNIy!T7a%pa7CMh6eZ*FsR03%^AIb}3qHaKErH!(0XFk)mmHf3fxF*z_cIWb{1Gcq>p5mXoy5;7V(I$?AuV{dMAbRctdWI8%?baH8KXC^5iV{dMAbO0k^WHvBmFfueZF*PwXVPrIBHeoO~VlXygIWb~3Ff}$X?h#ZN6cREMIy!b?a%o|1bSPtQZgX@Xc5i89Dk&giZ*FsR03%^$HZoy0Fga#9W@R%oI5B21F*Y?eI5=f7F*RgmFgIrK5mXTr5;6!nI$~vKX>KSfAY*TCb94YBVK6Z>GcaT}H!@-|WHx0mHaRylH!xyiGBPnYV=^!_IPwux1{4x92s%1*X?kTSDIjBSZgX@1BVl7QH90jfGB-ChGd46aW@2MFWH2%_HZe9hWMpDDHZ$}QR0b3hG95ZPR$+2!VQzFNb97`nI&*Y#X>MmMAXH^@bY*fZAX8;@bY*fW03%^CFf=!2V`evHVKX&1VKiejW;ixBFlIMlWH(_jH!(8y5mXx#5;7AyI&@`obSPtQZgX@Xc5i89Dk&giZ*FsR03%^#WHB){GdVM4GB!9dH)CQnW;i!CW@BbCV=!bjIAme?5mXTr5;6@sI&)=oD0XjYWGX2jV{dMAbO0k^G&VM6VK6vmFlAvjW;HZ5W;S7BFgRsmVrF4xHf1tn`VmwM6cREBIy!D)ZDlAaAY*TCb94YBVP;}EV_`BeV`gGzVKXy1IW#e4V`DiqHaIgiWnpGzG5ir!1{4x92s%1$Wq5QbDIjBSZgX@1BVl7PW@9p8I5Ie7IW#mhW@Is9HDP6AV`F1EVPaurVqyLfR0b3hG7vgCNpxj$VRUbDC}VGKb95k9VRC6yTp5;74wI!Sb8a$$6DawubOZgX@XNpxj$VRUbDCMf_TVPr8kH8?gkWMg7tV`DUBHaIn6Fg7$cVK6x{G&3|dFai=(4-^tI5jr|=aAk5~bZ>G!C}VGKb95j{bY*g3bZ>GdDF7p3W;13sF*i41VlieiH)J+3Ib$+oFlI6|V`MaBVKOi>1QJva6cREQIy!G~WpZJ3Z*o07C}VGKb95j{bY*g3bZ>GdDIjBSZgX@1BVjmYWn^PEVqr03W@9#GWnnotGdVUeH!w9hV>UN2FfaxZR238wG6*_4Z*XODVRUbDDkv!+V{dMAbO0k^FlI1gWn(sBI5c81H)Aj`IWjgfFf?H?WH2!?V=^!_2oh8V6cREBIy!G~WpZJ3Z*na@C@COgZ*FsR03%^yFgayoWHU7}I5IFXGcq_iG%{mjV`ersVmV|pH#9Q}5>y5h5;6ihI&W}ga$$6Daw{t+DF7p3IAJtmH#Ik9V`5@5G%+mE3WH@DHGh)sB06IEFZgp)`a$#w70Ap-nb8};LVsCR_F<&ubZ*pZ{F<&uqWoB$;V{~b6ZeKB9F-2~5ZB%k$X>=}VbZu+|2Nod0yC6w!baHQGbz^jCZ*CxAZe$=sb#ruYZ6HE&X=G<*a{w)3a%p5|WiDuRZEWxX06IEQZ)t9HQ)ppiZ+Amsb97~L0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolW`X>N2=Xklb;cSB)wbY*fbXmo9C84^1>I%RHja%p9A03%^DW??xuWHC2pVlXpiFlJ^lWHMniF*Y+ZW??mBGGk#G5<5CNWo~qGc|&h?Zgc=6VKg#fVKHPiHD)j}V>K}}IAk(0H#uQpWjSMJFfueSVzLPUIyyvQbYTEVJ>KNZES!C055G}ZeeF-axQ3aZ~$##ZeeF-a$h)TaBwbYbZu;e5dbfAd2nT4b7gXNWpXZPaBu*0d2nT4Uvp)0c4cy3IB0NiE@*UZY*iBgFJobCWpZIIXmD@5DUu|J(ZEW-sCjvS;S8sA`WGE>BBVjfccWN%RsY0y;W!Wpib8C@BCVVK*=^G-PBpHaIk4GcaXjH#9S3W-w%AVr4ZoHDP0BG9VI3^b#i-Iy!P?XK8bEWpYwwb8mHWV`V5~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlDRV>x9uF=S?CFlA&gGcja1Heon2Vlg>3G+|*iWi}!bNf-1ICjvS;a%E>}b97~LQe|^*b#h~6C@BCVVKy{3IA&xsFk)jiHDWMhF*0O1I5adlI5=W4W@BM7Gb9p8^b#i-Iy!P?XK8bEWpYDrZE$aHWo~pRV{dMAbRcqNW^83+bZKvHIyzK&aAhVb03%^zGc;x~Fkv`0V`MToV=**hIb~&HIbmZsH)b?rV>DtW5=j^I5+?#WI&x)aX>)XCazk%zaBps9ZgeOq03%^CWHe=BI5{(8I509}WH@FwF*G$}VmV_nWMwm9V>me|5=rzDCmA|Aa%E>}b97~LQe|vmbZKvHC}VGKb95kbWoB$;V{~b6ZaO+td2nSWDF7p3VKHJjIc7LGWivBmH#RjhH)Sz4G+|~iWHU85Ib$$2DiTQ-^b#imIy!P?XK8bEWpYwwY+-b1Z*C|l03%^zIASz6F*q@0H#cE1H#azCFgGw_V`5`vG-5YqWHVtb5=rzDCmA|Ab#8KHXK8bEWpXHEZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlGZWjHovWHdQsWin(mV`VotG%ztXHa9e7Ic8=wH(@RkNf-1ICjvS;ba`-Pb0{eQBVl4NIA%05Wn(utVq|1AFfun|H8VCfFgP|hHaRskH8wC3NiY&A2q0r`ZgX@1H92B7WH2;lIXGr!I5jpoV`eijW@9pCF*Y$cF=J*jG7?D!^b#imIy!V=Vr*q|C@BCVVKy*gH8wdoFkvw{Gh<>lWH&cCHDoe1I5S~lHZwUmF*FiMG!iKYAY*TCb94Y@W@BMwGB+|bGh<~pGBh(}HZwP2WHd7|W;i!7V=y!}5=jR15+?#WI$?5SXk~PHaAikwVQ^?DDF7p3F*7k?WjHlCGc#giGdW~5H8(gnV_`TlG+{M0HZU+TI1))X5-A8EV{dMAbO1OoGc_||G%`3dFl0AoVmUK7IAJn5VKXx^He_WoH8DC8Ne1*1CjvS;Z(?(0a&~2Mb0{eQBVji&G%#f_Fl9J6H928pW@R@tG&Ny2F=b<8G-EMjWH&q#NjwrM2q0r`ZgX@1G&5#qIW#abV=y#hVq|49I5RR~H8C(@Wi>T6H83(WJ`za=^b#i$Iyz}?b7gXLQe|^*b#h~6C~akJZ*qA$IzeuER$**)Whnq7VKrefV>D%CHezEjV`X7wFg9akH8e9}GdD0XGBPqZVn7l}5cCo!13EfsZgXXFbW&w=Z*_8GWhhiB03%^!H#ah2H)Ak3IW}Z4F=8}gWHDtkI5aV3HD)$7Vl`tz5=jB{5+@ltI%RTUb7fLxb8mHWV`V5~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVlGYIb$+nW-w)9H#adeGB`FgFf%hbF*9Z~Vq;@9I5I>MNf-1ICjvS;WpZJ2Wm08xZ*_8GWhf~CBVjT)VlXo>VKibeG-5VlHZ(Y7G%__YW@R*FHeq99H!?;NN%RsYA38c{VRKStb8mHWV`V5~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;gV{dMAbO0k^W-&QsW@0okFk)daIASm{WMwcjH)UisW-&53WMVcpND@gM^b#isIyz`!b5dn<}N)ky1^b#i-Iy!P?b8mHWV`V5~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVjQ$H!?CYFl9JqWivTqI5lQsWn*JCW;QY~VPZKrFgHvRNf-1ICjvS;a%FRGb#h~6C@BCVVPj%pG-ft3IWT20F=IJ3VKXygH#TK7H8(alGB##0IZhHuOcE&{AY*TCb94Y=G-6>hWMwloI5#mkIWS{kHe)$qVL3K9WMeQgWi&8Q5=k9S5-A8EV{dMAbO11BGd5v1Wiw?sV>4uAWiw=AIWaY2W?^JFVPQBkF=A2@Ne1*1CjvS;V{&C-bY&qGhsDlVmV<{5=rzDCkQ$^V{&C-bY($wC`E2`X>@rh03%^AV=_5rH#cE7I51>0G%_$aG&5r|W@9oqIb<<7FgG?<5=jR15+?#WI&x)mWpZ|9C@BCVVKg%|HaIh8HZw3aH#A{mGB`9cGc{vlH#j&mHf1z1WLOeO^b#isIyz)!b98cVc_>A0bZK;XDF7p3GdE!~Ff?W~VKg{4W;Qu8WjHo6VmLK8HDWh8W??olS`tYH^b#i!Iyz@%Ze?;|bZKvHD0OLWbTcwvbSWTXZ*FsR03%^IHZx^7H8f;1VPZHmVmUK3FfwK|IWuKrI5;@rhAY*TCb94YBVK`)FGG#I`HD+ZwV>2}}IW;(8G%+kH((M;4D=Ew2s%1rZ*6dIZe?zCb0|e_bZK;XDF7p3GBac{F<~?|WjQ!9VKy*kGht&eW;i!BVPa!rVlZSlViHLPViGA1AY*TCb94YPH(@woIb&gFVly>mW@2PCI5;+CHZU<|Ibk?5I50D05=jj75+?{cI&x)fVRUJ4ZgWO*Z*3?=ZggpMc_{!RVKibfH#uT3GBq+cFk&+@FkxglIb<b^b#isIy!P?Y+-b1Z*Fr`Zzx4>bZK;XDF7p3GGbvlH90jhIb}0tGhsPmIbt|6FgRplGc+?cVmV?sY7$8XY7!|9AY*TCb94YUF=H@gV=yu`G%;l{F=R7iW;QS~H!?J4V=ypeV_`UK5=jj75+^V^I&x)fVRU6EMQ(Iyba^ZwMQ(Iyba^ZwV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAa-wQWGX2DBVlA>Ff%tfFk?6{IW{piIWRY6H8(S6Gchn_H8wCeFgb1#NiOsfClfk4a%F5`bY&<-ZggpMc`P7BZggpMc`P7QDF7p3F=jL~VPZ36WH4ekW@2PFWHmNnWH@0nGBz}2IW=Kra1u!o^b#j2Iy!Z3a%F5`bY&<-ZggpMc`P7BZggpMc`P7fZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVjf+GdD0aHD+WtGiEb0F*Gw{V>V_pVL4$nFl9AiIAn4XNhkCYClES1b#8KHY+-a|C`E2`X>@rkAVqF;X>@rh03%^DWHvW6VP<78W;J3pGGZ|}H#22sW;8isHZW#6HfCgW5=jp95+^S@I&x)fVRU6=C`E2`X>@rkAVqF;X>@rkAY*TCb95kbWoB$;V{~b6ZaO+td2nSWDIjBSZgX@1BVjZ!Ib}9uGG;k8Wiex6H#cQ5F*i3dI51^5Gc-0ZW@L5}NiFmeCl)$7a%F5`bY)~HMQ(Iyba^ZwMQ(Iyba^QtV{dMAbO0k^WHC50H8Wv1F*Id0HDqElVl*)~GGk;jW;Qc6W@Ip9coInz^b#j2Iy!P?Y+-b1Z*C|>ZggpMc`P7BZggpMc`P7fZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVjXQH8(jjGc__fH)A+5W;r-CVKg^5W->KlWimH6GdFq?Nhf*|DK8*nZ*FsR05)beIX5w4W;HTqVl`oAGiGFAI5J{kFf}V>QMQ(Iyba^ZwMQ(Iyba^QNBVjf(Vm4%BFkxgfWjAJKIX5^rVq#%qGC43gWMnolF=2iZNe+GzDHb4OZ*FsR0Aw*^VmD+nFfcG>WjSSKWi&G}I5cBsVK`%CIW=TAVSo}z6!a1&2s%1tZggpMc|&h?ZgeOqAY*TCb94YBVKOl^W;A7FI5jddVrDWqFgQ6dV=y-|W@9)vVmLHoHi8mK1~Lu+5OXM3Z*pv8CM+ODZggpMc_{#6Y+-YAV|8M0b6+uEF=KCXWnVF0F=bMziHZx;oGd5x{H#0OgIASz8W;HWqGBhz_VK_2ngc3;(^b#i@Iyz`!b0}kPZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMh6eZ*FsR03%^GWo9!lWnna9V>mHoVq#)BVK^~nGdW~5WMgJxWHLC05=kBO5+?{cI%r{YC@COgZ*FsR03%^zWM*PwV>o3sI5ashGBaj0V`gMHIX7ZrHZwOiFgP=a5=jR15+@ltI%j2cC}VGKb95kbWoB$;V{~b6ZaO+td2nSWDF7p3H#Ih9FgP<~G&g2tWj8TqWjSIrHZf&4GBIN^VrDgFiV{f|^b#imIyz@%bSNnRBVl7SGh;D0V=-c6H)1m}HDhKlW@BMFH8MG4WHB)_VmXWwN%RsY0y;WkWoKz_C@BCVVPaxrW;8HnVr4NfGcYn_HaTK2I5%cFV>3B0F*P=3VvZ6?^b#imIyz-;WGE>BBVjN$H8){7HaKHqWHU84H#9RgHf1(qG%{j2HZ?akH8_wGN%RsYAUZl>WMn8~Z*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jc5i89Dk%UXVK+86VK^{1W;tXtWHK~1G%#W{WHvc9HZWp1W;0_oFp?5U9`q6?1v)xmWMn8*CMGEWBVl4VGBr0gVq|7HW@cqIWMgDBF*i10H#257WH)1DGh~z!Ndxo}CmA|Aa%F9Ac4a7IZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN;ABVl7=Vq!KqHDNb1GdVUkH92NwGchzbFgasoGh{M2F=dt#Nf-1ICjvS;a%F9Ac4a6j03%^EFk@shVPZ97VlrhhHZe3bH)T0DH)J?sGcaN}F*anF5=rzDCl)$7LvL<#bVF}#aBps9Zgg`fV{dMAbRbu6a%^NKEFeX0bZK;XDF7p3W;JFsIb&rpF=IAjWiT{1H!?RjWHvH4VP$1GF*Y|dni5GA^b#i@Iyz`!b0}kPZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMh6eZ*FsR03%^GWo9!lWnna9V>mHoVq#)BVK^~nGdW~5WMgJxWHLC05=kBO5+?{cI%r{YC@COgZ*FsR03%^zWM*PwV>o3sI5ashGBaj0V`gMHIX7ZrHZwOiFgP=a5=jP%5-A@bV{dMAbO1RuIAJqmWj1CpIW;jfI5RRiFf=qaG&W*oVq;}7WHg`>Nga$5DF`5AZ*FsR0A*q~Vl!qrVmLE4HZwIfF*RdlIbvjDHZoy2H)b$7GNKYm296Rb2q0r`ZgX@1V>CB5F=Az7W;8HmWil`{V=^%?WH>T3GhsJjV=-Ykq!LL6kP;~fAY*TCb94Y=IW}WAVl`nmIW{&hG&5#oI5=cEWie(qIW=ZuVqr9<5=jPt3IG;!C|7TCY-A=ZAVqF;X>@rkAYyNCY$*U^Y+-YAV|8M0b6+uEF=KCXWnVF0F=b@rhAY*TCb94YBVK!kiI599bFfw5?G&W{1H(@elFl90`F)%Y?F*IaiF{~0v4D=EwAv!u|WppTGZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jMQ(Iyba^QNBVjW)Wi(=BV=ypbGBjdgH#RY0H8eLiW;bDGFga#9G&imiNgwnQCkQ$^XJvFKMQ(Iyba^QNBVl4RI5=WCGC5&0He)t2V`MdDHe+HoG%z$`IAb+1V`8upNe1*1CjvS;Vr6G(ZYU`LBVl4@rkAYyNCY$*UEVKX^2WMpMIH)S<9WM*SIW;HfuF=97iWn*S#Vm4whWVRAX8uSt;CptQ4VRI;BZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jMQ(Iyba^QtV{dMAbO0k^IAbtnG&W;pIAUfsH8^5oWj19rF*am5IW{z8WH~lAsuD>h^b#iyIyz`!b0|e_bZK;XDIjBSZgX@1BVjgSGdM9YHZU?_Gc-14FgIZ`WH4niGchnTVlgyiVlk`|NeuK7Cm}jIXJvFKV{dMAbRcqNW^83+bZKvHIyzK&aAhVeAVqF;X>@rh03%^IFgal|VKOvgWH&G}H8e3}F*7$fWH&K1H8y5qG&ecC5=kHQ5+?{cI%j2cC`E2`X>@rh03%^$IAk_vIAk+8Vlp#gF*G?iF*GKSf03%^yVq|7CFlJ(9F)%YQGGsP6VlX&2W;tUsIWRFbHfCau5=rzDCjvS;Wo~3BDF7p3Fg7(eVL3K9V`5}8H8(djGd4D5Hexg~VmUT7H#RjmkP=Ds5+@TnI!Sb8a$$6DawtP@ZE$aHWo~qHCM+OgZ*OcV03%^AGBY<}WMeU6V_{=8F*jy6H8nLgHfA_uWM*VxHZwQG5=jyC5+@NlI!Sb8a$$6DawubOZgX@XNpxj$VRUbDCMf_TVPrEhIWjpoGBRXkW;iiqWimNoGdMV6W?^MHGh=2kF~$-}5A+fz7dkp`aAk5~bZ>G!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^IFgQ6mWo0!nH)1t4H#KE2He@p}Vm32nFf}z|GdDNL5=j;G5+?{cI&W}ga$$6Daw;e(AY*TCb94YBVKrhlH8^5oWMeaCWn(ZkHfA+sVmW3tH#at7H)1(tVagIo2J{jq2s%1%aAk5~bZ>GkJ}4<5V{dMAbO0k^VPi8kHaIb6GdMIiIb}0BV`e#IHaItCVrDXCHZ(F~%o0fk^b#imIy!G~WpZJ3Z*nUuC@BCVVKy;gI5Ih5FlIS8W@cexGGjG1HZ*2pH)JG!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^IFgQ6mWo0!nH)1t4H#KE2He@p}Vm32nFf}z|GdDNL5=j;G5+?{cI&W}ga$$6Daw;e(AY*TCb94YBVKrhlH8^5oWMeaCWn(ZkHfA+sVmW3tH#at7H)1(tVagIo2J{jq2s%1%aAk5~bZ>GkJ}4<5V{dMAbO0k^VPi8kHaIb6GdMIiIb}0BV`e#IHaItCVrDXCHZ(F~%o0fk^b#imIy!G~WpZJ3Z*nUuC@BCVVKy;gI5Ih5FlIS8W@cexGGjG1HZ*2pH)JV?GCM+OgZ*OcV03%^GH#IY3GC5&4Vl-hiF)?K`H#KHqVlg-|H#TNwH8(ii5=jvB5+@NlI!Sb8a$$6DawubOZgX@XNpxj$VRUbDCMf_TVPrEhIWjpoGBRXkW;iiqWimNoGdMV6W?^MHGh=2kF~$-}5A+fz7dkp`aAk5~bZ>G!Jt$*uZgX@XNpxj$VRUbDCMh6eZ*FsR03%^IFgQ6mWo0!nH)1t4H#KE2He@p}Vm32nFf}z|GdDNL5=j;G5+?{cI&W}ga$$6Daw;e(AY*TCb94YBVK+5qI5cEtWHT`{Vr4mFVKg@}G%_?}G-6{lG&V6}GvX3S2J{jq2s%1%aAk5~bZ>GkJ}4<5V{dMAbO0k^VK*=^F)(H}VKFjgIb&lpGc__XF*jy2VKg^oFl9MqxCyVlXo?GdE%}Fkv)fGh$>lWHn(hGchqS=n_d4^b#i#Iyy;oWpZJ3Z*nMOZ*FsRAW3v(a$$6DawaJNBVlASGC49iI5IM1Wo9@rWMwirVKX>5VrF4wIWuEsF)_vxNe}cACl@+8Z*XODVRUbDJv}I6Z*FsRAW3v(a$$6DawaJtV{dMAbO0k^I50RlIb~%vF*jm0H8(Y7Fg9c}Fk&_{WiT~0Vly{4$P!5v^b#isIy!G~WpZJ3Z*nRqDIjBSZgX@1BVji+W;irtW@IxlGh$^qV_`HmF*GtXV>Du8H8eIcVl(0rNe1*1CkQ$^Z*XODVRUbDEj}nIAY*TCb94YBVPQ8gFflM@HeoR`WjSMGGcz?ZF)=r0GhsA0WiVwqW#ke`2J{jq0y;WxaAk5~bZ>GiD<~-dBVjf%VK_25VK8PnIA&&HVlrbjHa0Y7VmD+rWHMr9Wns<|NoWHAIyzTxa%^M(V{Bn_b7OU4Z*yNUUom5Ea%EpJUomB4b6+uEF;{PLY-BEIbZu<#0RTEWR%L8&V`+4G0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolo?Y;R*}ba^glbZu-76DBmG&4A4HaR&qV>e_pV>4noIb<_oVl^~kW?^Lh5>EyW6D2*iVly{nIWb}}WI1JKI5uKpGhs7gH8MCdWMnr26Hf*X6D9I5Ib8Gc;p1VmD=EW@cq$GBq<|GBjj3HUtw-1`ZP~4mvtxb#ruYZ9{Kvb98cbV{|A~L2_qvASNatE-o%903%^DHf1s}WjADDHDoa{WiT~mGh;JhG-Eb0W;8iuV=_1f6Hg2d6D=7!I%H*LVRdYDLvL<#baHiLbSPtQZgX@Xa%E<0Wn*+{Z*Dp|RC#b^CMf_TVKX>kGGjJoH)CWsWi>T1W;J19H8nXiWMMWlVP-ftFbES*7Y-9GCOSG}Z*X}-Z*FsRa&=>LC}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFfcVZgX@Xc5i89Dk%UXVK6o`H8y53Wi>EmHZwFaHeqFAFgP+|VPZ8mH#Ie4VG0vZBn}fTAUZm2Z+2xvZ*FsRa&=>LC}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFgAoX=ExX03%^AGBYtVG%_$aW-wzoV`MdBW-(?qV>n|qGB;*6VPi536Hgvl4gfkjL2h|gVQh6}0Ap-nb8};LVsCR_F<&ubZ*pZ{F<&ulWo>VAd0#PKF+py5R$**)WiDuRZEPPCCptQBW@d9`bO0k^HD)kjVmDzqVP$4EHZU@6CZU7@;V>vlyVqr8mWjSIpIb$$6GhsM2HaIafIb||pV>e-99}_1!I%sKSa$#~~Xn90saCB$@BVl4PWHT{0VlZK3Wi@3pFfe3gGd3_|VKHJjIWsb1W-=cWCptQ0a$$E&X>)V{BVjmUGBaW}F=RJoVl^-^Gi5R{WHmQtI5jpiH!?M2VP+o_CkQ$^VsCVGZ*5FvW^_Yua&BdEC@COgZ*FsR03%^$GdW^3IW%N2F*7nXVKq5rVl`qpF)(IkVP^7aAjmDV{dMAbRbnpL~>zwOlfm;IyzK&aAhVeAY*TCb95kMZ*pZiI%jM;I#y+JbY*x!;((?p03%^JHDfk1HZ)@~V`DQkH8(IdV`4QpW-~csIAJ(pI5J`z6G<~46DKt~I%INTcPL|TZgX@XRY^p0VRuYvb96d7RC#b^CM+OhZ*FsRAY*TGWjZ=%Y&tqtWpZ?7ctPTTrYQg;VP-dDGG#Y8F=b*fH!);4IA$32lG9431Gw=ZbIyzNJMQmklWo~o;b98cbV{~J6VsCR_F<&udZf9w3WnVF0F;z)LY-Md_ZgehabZu-&5CAW5Y;|X8ZgVeZa$$C9ba^glaBu){Y;|X8ZgXEUXL4b7X>@sCIB0NiE@*UZY)%sZFJX0LX>TuKb!2I8E@*IY0AY1xX>VURXmD^YXmo9CkOu@Wadl;Kc>pptVKq26IAvmDHDx(DI5=W9W@ceFW-&D~GcYkSH8d`0bZu-y2mmi(aA_}NZ*pY-WNC6=HfCZoVL3H9V>CB2Vq;-pIAu6DVK-(pIAJ(7H8wOeE@*UZY-SDsFLGsPX>)XPc`j&hZ~$|8b97~GUovuKXK8bEa(Q1kXmD^YXmo9C^bY_pXKZaQXmD@IB0NiE@*UZZ2trRFKA(NXf9}QZ~$mwb7)^UXmD^YXmo9CC=)L_I%02l03%^DGch$~W@9inWHmQ7WMgJHV=!bfFk~<}He+F8W@b0=0RTEWLT`9OZ)|L7b7^mGQ)ppuWdL(@a&=>LV|8M0b6+uEF=cLNX>Mg-F<&u4Z+Js*Y;0+BX>V>*Xkl<=E@*UZY%dcm0y;WYZ+K;FM{;RoLUL(jXJsfU03%^HW-&B0W@9pCHfCltIW=KsFf?T~H)b|4I5=ZAW;13f6HYG^EHOGdY;R#?Msja$MrmwiC_!^`Wpr~UEFfcVZgX@XL2h|Lb8}^MCM+OhZ*pZiI&EcbZ*qA$I#YCVWnpb5DF7p3Vq-95Vly>kGd49eWMpMwH8Nv2Wj11DWMecnGGSw7D-%vHFB2>^Iy!SVAc{(~%bmD-fDF7p3F*#y3Wiw$oV_{}DWMpJvGBzNDi0w-a%p5|WdK5QX=G<*E@*UZY`FmhFK14!CH8W*4GG;DlbZu-i6EiwGW^!R|Wny(^W@T~!BVjlMwgV=*vcHD)k5WjQr9Wo0xtVKiYlG-Wps0RU2Ab97~LX?kUH0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUolf?VPtQ2L3C_kb5db*bY*gBdS!AhXmo9CXafK`Iz@13Wo>10VQf@#VQF*#b98cbV{~J6VsCR_F<&ubZ*pZ{F<&udV{>0IUok~+Xk~3>a$#&#a$#w7E@*UZY&#Pz0y;WYZ+K;FO>bmnY(jErWM^e4DF7p3WHMzrV>dNrVKFgbWMVNlHDxh0V>D(pG-hTrF)%kWH4{%e6D=`1I&5!YWJYptZANKqWhg;&b7gdMCM+OhZ*FsRAVF?C50WMg76V>D)BF*RdkWMnmCW;YX0FFO-0H99(TVRmIyZ$@csWhi5BZgX@XL349ubaN&wAY*TCb95jV=-BVlASWnpGEWMwpCVr4luVmLNoVK6yjWMVcnI5{&mW;O5u06IEBV`Ft~b!=gDWn@Eda&l#3bZKvH0CRM5bz^j6bz*OGUol@XWo~C_Ze?FFUok;rV|8tHY+-a|WJ7Oqa%E$5X>V>WXmo9CRR#braBOvFX>KlPaBu)+Zf9w3WnVIBZewh9WMyA6V|8M0b6+xLZf9w3WnVIKWo~3;a$hoRX=iA3b6+xWY;|X8ZeKWPaBwbYbZu-+6E8YCNN;az03%^BHe)w9GBGnYV_`TmIW{pcH8wOeGcjT@W-&A~G%_?z6E8YCRC#b^WJqssYXBo*VKO%{IXGfBW@9%oIb$?5WHn=EGiEY2GB9RkGBh(|O%pEyIyyvUb7gXAVQgu7WpXGf03%^xIbk_rGBRN|H#9dmH#IY5F=I9`GB7YSG+|{jIW#mu6H!eQFCaQPa%Ev;C}VGKb95kbWoB$;V{~b6ZaO+td2nSWEFgAoX=ExX03%^AH#0FfWH>ouH90siHDxtoF*Id2I51>pGc-9iH8f&F6Hy*b6E6fhI&x)UWGGZ7DF7p3V`VZqI5%NtVKp@~HfA$4HfA<5IX5>kWiw+mI5}lxMH5j1O%pF4Iyz`?Z)+%HZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jNN;azDF7p3Wo2byGh#7iFgIZ~HfA+2V`OGDI5TE3GB{#lHZfu_M-x#UO%pE;Iyz`?Z)+%2d2nT9NN;azJXAg@03%^xVKp!}WHB-@F=jC{IAu97IWaL}VlXgcIWsvjI5IRz6HyFJ6E7e-I%H*IZ*6dIb7d%FZ*FsRAaZ49Y-M9~X>V>iI#hXZWhN{jc5i89Dk%UXVPs@7W;A3uGGsM5WH2~nGdVCZIWjOXW;AAGI5aRYHA@pw9t8maIyyvUb7gXAVQgu7WpV&xY+-YAV|8M0b6+uEF=KCXWnVF0F=SzMVP7#{F+^o^WpZg@Y-xIBaxQ3eZER(3XK8L_0Ay)$Ut(cqVmD!CFl8_^WjQrsGBjZ{HD+cuGcYzVVPZ8mVlHTOZEQ(ybaHQGbz^jCZ*Bl-Ze(S6E@*UZY-|P#IyymhWNB|YIzn}3W@T~!En#dfXmo9CBWGb^W;Z!FVPP<0F*q=0V>n`BVKO*3GB-FmVqs!4G&yB#1`9emL3LzlZ#p_tZ*_8GWdJQUYjc4=c}04-r`E@*UZY$Io3V>C54H8(J2IWuN3H8N#pFfn5^VK_8qWMyS#IAmrrYz7M;!n+_rb!2I804-r`E@*UZY!wUyFJobCWpZHvHDYFBIWjplFf?UmWHLE2IALZmFkxjiGC4V8HDNepE@*UZY>)>4FLGsOY-M9~X>V>WXmD@DZyb98cbV{~J6VsCR_F<&udZf9w3WnVF0F-B>4Wn@HUY;<8%X>DaLXmo9C0v-V(0xJP90W|?T0YC#s14;!>1yTW609*iM0B3MvXJu|-ZDn(CVPj=ya&L8TV{Bn_b8~cZbz^jOZfS3Bba`-PWMyV#X>w+1Y-MJ3ZewI+W@&C^Wo~tCWo~tCAa-GFc42Y='); diff --git a/preview/pr-1379/selection_8hpp.html b/preview/pr-1379/selection_8hpp.html new file mode 100644 index 0000000000..e68a9f64e6 --- /dev/null +++ b/preview/pr-1379/selection_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/selection/selection.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/ser_2binary_8hpp.html b/preview/pr-1379/ser_2binary_8hpp.html new file mode 100644 index 0000000000..8c3157595a --- /dev/null +++ b/preview/pr-1379/ser_2binary_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/ser/binary.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/serializer_8hpp.html b/preview/pr-1379/serializer_8hpp.html new file mode 100644 index 0000000000..291a6c93ae --- /dev/null +++ b/preview/pr-1379/serializer_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/ser/serializer.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/settings_8hpp.html b/preview/pr-1379/settings_8hpp.html new file mode 100644 index 0000000000..3702c5fe23 --- /dev/null +++ b/preview/pr-1379/settings_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/settings/settings.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/shader_8hpp.html b/preview/pr-1379/shader_8hpp.html new file mode 100644 index 0000000000..7564dbcfe2 --- /dev/null +++ b/preview/pr-1379/shader_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shader/shader.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/shadow__atlas_8hpp.html b/preview/pr-1379/shadow__atlas_8hpp.html new file mode 100644 index 0000000000..f8ea20f341 --- /dev/null +++ b/preview/pr-1379/shadow__atlas_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/render/shadow_atlas/shadow_atlas.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/render/shadow_atlas/shadow_atlas.hpp file +

+

Resource cubos::engine::ShadowAtlas.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::ShadowAtlas +
+
Resource which stores the shadow map atlas, a large texture that holds the shadow maps for each shadow caster in a quadtree structure, reducing texture switching.
+
+ struct cubos::engine::ShadowAtlas::Slot +
+
Slot for a shadow map in the shadow atlas.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/shadow__atlas__rasterizer_8hpp.html b/preview/pr-1379/shadow__atlas__rasterizer_8hpp.html new file mode 100644 index 0000000000..986680f8b5 --- /dev/null +++ b/preview/pr-1379/shadow__atlas__rasterizer_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadow_atlas_rasterizer/shadow_atlas_rasterizer.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/sparse__relation_2table_8hpp.html b/preview/pr-1379/sparse__relation_2table_8hpp.html new file mode 100644 index 0000000000..2ca97245eb --- /dev/null +++ b/preview/pr-1379/sparse__relation_2table_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/table/sparse_relation/table.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/sparse_relation/table.hpp file +

+

Class cubos::core::ecs::SparseRelationTable.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::SparseRelationTable +
+
A table which stores relations. Allows for quick insertion, deletion and iteration.
+
+ struct cubos::core::ecs::SparseRelationTable::Output +
+
Output structure for the iterator.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/split__screen_8hpp.html b/preview/pr-1379/split__screen_8hpp.html new file mode 100644 index 0000000000..e289bd924e --- /dev/null +++ b/preview/pr-1379/split__screen_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/split_screen/split_screen.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/spot_8hpp.html b/preview/pr-1379/spot_8hpp.html new file mode 100644 index 0000000000..c9626271a5 --- /dev/null +++ b/preview/pr-1379/spot_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/lights/spot.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/spot__caster_8hpp.html b/preview/pr-1379/spot__caster_8hpp.html new file mode 100644 index 0000000000..05a73a8e79 --- /dev/null +++ b/preview/pr-1379/spot__caster_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/shadows/spot_caster.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/ssao_8hpp.html b/preview/pr-1379/ssao_8hpp.html new file mode 100644 index 0000000000..d4d9294087 --- /dev/null +++ b/preview/pr-1379/ssao_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/ssao/ssao.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/standard__archive_8hpp.html b/preview/pr-1379/standard__archive_8hpp.html new file mode 100644 index 0000000000..126508c0d0 --- /dev/null +++ b/preview/pr-1379/standard__archive_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/data/fs/standard_archive.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/standard__stream_8hpp.html b/preview/pr-1379/standard__stream_8hpp.html new file mode 100644 index 0000000000..3b041cadfc --- /dev/null +++ b/preview/pr-1379/standard__stream_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/memory/standard_stream.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/stream_8hpp.html b/preview/pr-1379/stream_8hpp.html new file mode 100644 index 0000000000..5fcbe86f4f --- /dev/null +++ b/preview/pr-1379/stream_8hpp.html @@ -0,0 +1,146 @@ + + + + + core/memory/stream.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/stream.hpp file +

+

Class cubos::core::memory::Stream.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+ class cubos::core::memory::Stream +
+
Interface class for memory streams. Abstracts away sources or destinations of data.
+
+
+
+

Enums

+
+
+ enum class SeekOrigin { Begin, + Current, + End } +
+
Stream seek origin.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/string_8hpp.html b/preview/pr-1379/string_8hpp.html new file mode 100644 index 0000000000..ca13c74337 --- /dev/null +++ b/preview/pr-1379/string_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/string.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/string__conversion_8hpp.html b/preview/pr-1379/string__conversion_8hpp.html new file mode 100644 index 0000000000..70a203a5ab --- /dev/null +++ b/preview/pr-1379/string__conversion_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/traits/string_conversion.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/string__view_8hpp.html b/preview/pr-1379/string__view_8hpp.html new file mode 100644 index 0000000000..6d485b7e58 --- /dev/null +++ b/preview/pr-1379/string__view_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/string_view.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/string_view.hpp file +

+

Reflection declaration for std::string_view.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data.html b/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data.html new file mode 100644 index 0000000000..201338c2bf --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data.html @@ -0,0 +1,137 @@ + + + + + cubos::core::data::EmbeddedArchive::Data struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data_1_1Entry.html b/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data_1_1Entry.html new file mode 100644 index 0000000000..6245b2f3b8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1data_1_1EmbeddedArchive_1_1Data_1_1Entry.html @@ -0,0 +1,147 @@ + + + + + cubos::core::data::EmbeddedArchive::Data::Entry struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::data::EmbeddedArchive::Data::Entry struct + +

+

Describes a file entry in the embedded data.

+ +
+

Public variables

+
+
+ const char* name +
+
Name of the file entry.
+
+ bool isDirectory +
+
Whether the entry is a directory.
+
+ std::size_t parent +
+
Index of the parent directory.
+
+ std::size_t sibling +
+
Index of the next sibling.
+
+ std::size_t child +
+
Index of the first child.
+
+ const void* data +
+
Data of the file entry.
+
+ std::size_t size +
+
Size of the data.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeId.html new file mode 100644 index 0000000000..ca41e10819 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeId.html @@ -0,0 +1,173 @@ + + + + + cubos::core::ecs::ArchetypeId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ArchetypeId struct + +

+

Identifies an archetype.

+ +
+

Public static variables

+
+
+ static const ArchetypeId Empty +
+
Empty archetype identifier.
+
+ static const ArchetypeId Invalid +
+
Invalid archetype identifier.
+
+
+
+

Public functions

+
+
+ auto operator==(const ArchetypeId& other) const -> bool defaulted +
+
Compares two archetype identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Archetype identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::ArchetypeId::operator==(const ArchetypeId& other) const defaulted +

+

Compares two archetype identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther archetype identifier.
ReturnsWhether the two archetype identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeIdHash.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeIdHash.html new file mode 100644 index 0000000000..6eb47adc13 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ArchetypeIdHash.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::ArchetypeIdHash struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Arguments.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Arguments.html new file mode 100644 index 0000000000..3bffcad20a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Arguments.html @@ -0,0 +1,124 @@ + + + + + cubos::core::ecs::Arguments struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnId.html new file mode 100644 index 0000000000..f95f2f61c9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnId.html @@ -0,0 +1,271 @@ + + + + + cubos::core::ecs::ColumnId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ColumnId struct + +

+

Identifies a data column type.

+ +
+

Public static variables

+
+
+ static const ColumnId Invalid +
+
Invalid column type identifier.
+
+
+
+

Public static functions

+
+
+ static auto make(DataTypeId id) -> ColumnId +
+
Creates a column type identifier from a data type identifier.
+
+ static auto make(DataTypeId id, + uint32_t index) -> ColumnId +
+
Creates a column type identifier from a data type identifier and an index.
+
+
+
+

Public functions

+
+
+ auto dataType() const -> DataTypeId +
+
Returns the data type identifier of this column type.
+
+ auto index() const -> uint32_t +
+
Returns the index of this column type.
+
+ auto operator==(const ColumnId& other) const -> bool defaulted +
+
Compares two column type identifiers for equality.
+
+
+
+

Public variables

+
+
+ uint64_t inner +
+
Column type identifier.
+
+
+
+

Function documentation

+
+

+ static ColumnId cubos::core::ecs::ColumnId::make(DataTypeId id) +

+

Creates a column type identifier from a data type identifier.

+ + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
ReturnsColumn type identifier.
+
+
+

+ static ColumnId cubos::core::ecs::ColumnId::make(DataTypeId id, + uint32_t index) +

+

Creates a column type identifier from a data type identifier and an index.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
idData type identifier.
indexIndex.
ReturnsColumn type identifier.
+
+
+

+ DataTypeId cubos::core::ecs::ColumnId::dataType() const +

+

Returns the data type identifier of this column type.

+ + + + + + + +
ReturnsData type identifier.
+
+
+

+ uint32_t cubos::core::ecs::ColumnId::index() const +

+

Returns the index of this column type.

+ + + + + + + +
ReturnsIndex.
+
+
+

+ bool cubos::core::ecs::ColumnId::operator==(const ColumnId& other) const defaulted +

+

Compares two column type identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther column type identifier.
ReturnsWhether the two column type identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnIdHash.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnIdHash.html new file mode 100644 index 0000000000..c7eb05a14e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ColumnIdHash.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::ColumnIdHash struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ConditionId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ConditionId.html new file mode 100644 index 0000000000..1f3a846c84 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ConditionId.html @@ -0,0 +1,159 @@ + + + + + cubos::core::ecs::ConditionId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ConditionId struct + +

+

Identifies a condition.

+ +
+

Public functions

+
+
+ auto operator==(const ConditionId& other) const -> bool defaulted +
+
Compares two identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Condition identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::ConditionId::operator==(const ConditionId& other) const defaulted +

+

Compares two identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther identifier.
ReturnsWhether the two identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeId.html new file mode 100644 index 0000000000..bdd60b82e7 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeId.html @@ -0,0 +1,169 @@ + + + + + cubos::core::ecs::DataTypeId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::DataTypeId struct + +

+

Identifies a data type registered in the world.

+ +
+

Public static variables

+
+
+ static const DataTypeId Invalid +
+
Invalid data type identifier.
+
+
+
+

Public functions

+
+
+ auto operator==(const DataTypeId& other) const -> bool defaulted +
+
Compares two data type identifiers for equality.
+
+
+
+

Public variables

+
+
+ uint32_t inner +
+
Data type identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::DataTypeId::operator==(const DataTypeId& other) const defaulted +

+

Compares two data type identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther data type identifier.
ReturnsWhether the two data type identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeIdHash.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeIdHash.html new file mode 100644 index 0000000000..087473d026 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DataTypeIdHash.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::DataTypeIdHash struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DeltaTime.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DeltaTime.html new file mode 100644 index 0000000000..4218ab6d0f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1DeltaTime.html @@ -0,0 +1,155 @@ + + + + + cubos::core::ecs::DeltaTime struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::DeltaTime struct + +

+

Resource which stores the time since the last iteration of the main loop started.

+ +

This resource is added and updated by the Cubos class.

+
+

Public functions

+
+
+ auto value() const -> float +
+
Returns the time in seconds, affected by the scale.
+
+
+
+

Public variables

+
+
+ float unscaledValue +
+
Time in seconds, without any scaling.
+
+ float scale +
+
Multiplier which will be used in value().
+
+
+
+

Function documentation

+
+

+ float cubos::core::ecs::DeltaTime::value() const +

+

Returns the time in seconds, affected by the scale.

+ + + + + + + +
ReturnsTime in seconds.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Entity.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Entity.html new file mode 100644 index 0000000000..dc405695ac --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Entity.html @@ -0,0 +1,315 @@ + + + + + cubos::core::ecs::Entity struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Entity struct + +

+

Identifies an entity.

+ +

When serializing/deserializing, if there's a data::old::SerializationMap<Entity, std::string, EntityHash> in the context, it will be used to (de)serialize strings representing the entities. Otherwise, the identifiers will be (de)serialized as objects with two fields: their index and their generation.

+
+

Public types

+
+
+ using Mask = std::bitset<CUBOS_CORE_ECS_MAX_COMPONENTS+1> +
+
Type used to store which components an entity has.
+
+
+
+

Constructors, destructors, conversion operators

+
+
+ Entity() +
+
Constructs a null entity.
+
+ Entity(uint32_t index, + uint32_t generation) +
+
Constructs an entity from an index and a generation.
+
+ Entity(const Entity& entity) defaulted +
+
Copy constructs.
+
+
+
+

Public functions

+
+
+ auto operator=(const Entity& entity) -> Entity& defaulted +
+
Copy assigns.
+
+ auto operator==(const Entity& entity) const -> bool defaulted +
+
Checks if the entity is equal to another.
+
+ auto operator!=(const Entity& entity) const -> bool defaulted +
+
Checks if the entity is not equal to another.
+
+ auto isNull() const -> bool +
+
Checks if the entity is null, a special value returned on errors.
+
+
+
+

Public variables

+
+
+ uint32_t index +
+
Identifies the entity among the living entities in a world.
+
+ uint32_t generation +
+
Counts how many entities with the same index have previously been destroyed.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::Entity::Entity(uint32_t index, + uint32_t generation) +

+

Constructs an entity from an index and a generation.

+ + + + + + + + + + + + + + +
Parameters
indexEntity index.
generationEntity generation.
+
+
+

+ cubos::core::ecs::Entity::Entity(const Entity& entity) defaulted +

+

Copy constructs.

+ + + + + + + + + + +
Parameters
entityEntity to copy.
+
+
+

+ Entity& cubos::core::ecs::Entity::operator=(const Entity& entity) defaulted +

+

Copy assigns.

+ + + + + + + + + + +
Parameters
entityEntity to copy.
+
+
+

+ bool cubos::core::ecs::Entity::operator==(const Entity& entity) const defaulted +

+

Checks if the entity is equal to another.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity to compare to.
ReturnsWhether the entities are equal.
+
+
+

+ bool cubos::core::ecs::Entity::operator!=(const Entity& entity) const defaulted +

+

Checks if the entity is not equal to another.

+ + + + + + + + + + + + + + + + +
Parameters
entityEntity to compare to.
ReturnsWhether the entities are not equal.
+
+
+

+ bool cubos::core::ecs::Entity::isNull() const +

+

Checks if the entity is null, a special value returned on errors.

+ + + + + + + +
ReturnsWhether the entity is null.
+
+
+
+

Variable documentation

+
+

+ uint32_t cubos::core::ecs::Entity::index +

+

Identifies the entity among the living entities in a world.

+

While this is unique at a given time, it may be reused after the entity is destroyed.

+
+
+

+ uint32_t cubos::core::ecs::Entity::generation +

+

Counts how many entities with the same index have previously been destroyed.

+

Allows us to detect when an entity has been destroyed by comparing its generation with the current generation of the entity with the same index.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EntityHash.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EntityHash.html new file mode 100644 index 0000000000..91bfb30c39 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EntityHash.html @@ -0,0 +1,104 @@ + + + + + cubos::core::ecs::EntityHash struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EphemeralTrait.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EphemeralTrait.html new file mode 100644 index 0000000000..b288a83c7b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1EphemeralTrait.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::EphemeralTrait struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Name.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Name.html new file mode 100644 index 0000000000..f69500553e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Name.html @@ -0,0 +1,123 @@ + + + + + cubos::core::ecs::Name struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ObserverId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ObserverId.html new file mode 100644 index 0000000000..297e5450c9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ObserverId.html @@ -0,0 +1,159 @@ + + + + + cubos::core::ecs::ObserverId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ObserverId struct + +

+

Identifies an observer.

+ +
+

Public functions

+
+
+ auto operator==(const ObserverId& other) const -> bool defaulted +
+
Compares two observer identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Observer identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::ObserverId::operator==(const ObserverId& other) const defaulted +

+

Compares two observer identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther observer identifier.
ReturnsWhether the two observer identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Planner_1_1TagId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Planner_1_1TagId.html new file mode 100644 index 0000000000..504edf2bf1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Planner_1_1TagId.html @@ -0,0 +1,160 @@ + + + + + cubos::core::ecs::Planner::TagId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Planner::TagId struct + +

+

Local identifier for tags.

+ +

Differs from the Tag type in that this should only be used internally and can refer to systems.

+
+

Public functions

+
+
+ auto operator==(const TagId& other) const -> bool defaulted +
+
Compares two identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Tag index.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::Planner::TagId::operator==(const TagId& other) const defaulted +

+

Compares two identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther identifier.
ReturnsWhether the two identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1PluginQueue.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1PluginQueue.html new file mode 100644 index 0000000000..8b765d49cd --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1PluginQueue.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::PluginQueue struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryFilter_1_1Match.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryFilter_1_1Match.html new file mode 100644 index 0000000000..475cb40af9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryFilter_1_1Match.html @@ -0,0 +1,123 @@ + + + + + cubos::core::ecs::QueryFilter::Match struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm.html new file mode 100644 index 0000000000..bafb52c3aa --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm.html @@ -0,0 +1,532 @@ + + + + + cubos::core::ecs::QueryTerm struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::QueryTerm struct + +

+

Describes a term in a query.

+ +

Terms are the building blocks used to build queries. Each term adds some restriction to what the query will match. There are three kinds of terms:

  • Component terms, which allow filtering match entities by those which have or don't have a given component.
  • Relation terms, which allow filtering match entities by some relation between them.
  • Entity terms, which don't filter the results but allow accessing one of the matched entities.
+
+

Public types

+
+
+ struct Component +
+
Stores component term data.
+
+ struct Entity +
+
Stores entity term data.
+
+ struct Relation +
+
Stores relation term data.
+
+
+
+

Public static functions

+
+
+ static auto makeEntity(int target) -> QueryTerm +
+
Returns a new entity term for the given target.
+
+ static auto makeWithComponent(DataTypeId type, + int target) -> QueryTerm +
+
Returns a new component term for the given component and target.
+
+ static auto makeWithoutComponent(DataTypeId type, + int target) -> QueryTerm +
+
Returns a new negated component term for the given component and target.
+
+ static auto makeOptComponent(DataTypeId type, + int target) -> QueryTerm +
+
Returns a new optional component term for the given component and target.
+
+ static auto makeRelation(DataTypeId type, + int fromTarget, + int toTarget, + Traversal traversal = Traversal::Random) -> QueryTerm +
+
Returns a new relation term for the given relation and targets.
+
+ static auto resolve(const Types& types, + const std::vector<QueryTerm>& baseTerms, + std::vector<QueryTerm>& otherTerms) -> std::vector<QueryTerm> +
+
Merges a vector of terms with another, joining pairs of them if possible.
+
+ static auto toString(const Types& types, + const std::vector<QueryTerm>& terms) -> std::string +
+
Gets a string representation of vector of query terms.
+
+
+
+

Public functions

+
+
+ auto isEntity() const -> bool +
+
Checks if the term is an entity term.
+
+ auto isComponent(const Types& types) const -> bool +
+
Checks if the term is a component term.
+
+ auto isRelation(const Types& types) const -> bool +
+
Checks if the term is a relation term.
+
+ auto compare(const Types& types, + const QueryTerm& other) const -> bool +
+
Compares two terms.
+
+
+
+

Public variables

+
+
+ DataTypeId type +
+
Type of the data matched by the term.
+
+ Entity entity +
+
Entity term data.
+
+ Component component +
+
Component term data.
+
+ Relation relation +
+
Relation term data.
+
+
+
+

Function documentation

+
+

+ static QueryTerm cubos::core::ecs::QueryTerm::makeEntity(int target) +

+

Returns a new entity term for the given target.

+ + + + + + + + + + + + + + + + +
Parameters
targetIndex of the target which will be accessed.
ReturnsEntity term.
+
+
+

+ static QueryTerm cubos::core::ecs::QueryTerm::makeWithComponent(DataTypeId type, + int target) +

+

Returns a new component term for the given component and target.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetIndex of the target which must have the component.
ReturnsComponent term.
+ +
+
+

+ static QueryTerm cubos::core::ecs::QueryTerm::makeWithoutComponent(DataTypeId type, + int target) +

+

Returns a new negated component term for the given component and target.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetIndex of the target which must not have the component.
ReturnsComponent term.
+ +
+
+

+ static QueryTerm cubos::core::ecs::QueryTerm::makeOptComponent(DataTypeId type, + int target) +

+

Returns a new optional component term for the given component and target.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typeComponent type.
targetIndex of the target which may have the component.
ReturnsComponent term.
+ +
+
+

+ static QueryTerm cubos::core::ecs::QueryTerm::makeRelation(DataTypeId type, + int fromTarget, + int toTarget, + Traversal traversal = Traversal::Random) +

+

Returns a new relation term for the given relation and targets.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeRelation type.
fromTargetIndex of the target which must have the 'from' side of the relation.
toTargetIndex of the target which must have the 'to' side of the relation.
traversalTraversal order for the relation.
ReturnsRelation term.
+ +
+
+

+ static std::vector<QueryTerm> cubos::core::ecs::QueryTerm::resolve(const Types& types, + const std::vector<QueryTerm>& baseTerms, + std::vector<QueryTerm>& otherTerms) +

+

Merges a vector of terms with another, joining pairs of them if possible.

+ + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typesType registry.
baseTermsBase vector of terms.
otherTerms in/outVector of terms to merge into the base. Targets will be modified, if set to -1.
ReturnsResult of merging the two vectors.
+

This function is mainly used to merge terms specified manually for a query with terms obtained from its argument types. For example, if we have a query of the form Query<A&, A&>, we will obtain the terms makeWithComponent(A, -1) and makeWithComponent(A, -1). Those term would be passed into other. If we passed to base the terms makeWithComponent(A, 0) and makeWithComponent(A, 1), then, the base wouldn't be modified, and the other vector would have its targets updated so that it matches the base.

Any targets found set to -1 will be set to the current default target. The default target is initially 0, and always changes to the last seen non -1 target. If a relation term has one of the targets undefined, the default target is incremented.

Another example would be to have an empty base vector, and the query Query<A&, B&>. The other vector would be {makeWithComponent(A, -1), makeWithComponent(B, -1)}, and the returned vector would be {makeWithComponent(A, 0), makeWithComponent(B, 0)}.

+
+
+

+ static std::string cubos::core::ecs::QueryTerm::toString(const Types& types, + const std::vector<QueryTerm>& terms) +

+

Gets a string representation of vector of query terms.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typesType registry.
termsVector of terms.
ReturnsString representation.
+
+
+

+ bool cubos::core::ecs::QueryTerm::isEntity() const +

+

Checks if the term is an entity term.

+ + + + + + + +
ReturnsWhether it's an entity term.
+
+
+

+ bool cubos::core::ecs::QueryTerm::isComponent(const Types& types) const +

+

Checks if the term is a component term.

+ + + + + + + + + + + + + + + + +
Parameters
typesTypes registry.
ReturnsWhether it's a component term.
+
+
+

+ bool cubos::core::ecs::QueryTerm::isRelation(const Types& types) const +

+

Checks if the term is a relation term.

+ + + + + + + + + + + + + + + + +
Parameters
typesTypes registry.
ReturnsWhether it's a relation term.
+
+
+

+ bool cubos::core::ecs::QueryTerm::compare(const Types& types, + const QueryTerm& other) const +

+

Compares two terms.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
typesTypes registry.
otherOther term.
ReturnsWhether they're equal.
+
+
+
+

Variable documentation

+
+

+ DataTypeId cubos::core::ecs::QueryTerm::type +

+

Type of the data matched by the term.

+

If this is set to DataTypeId::Invalid, then the term is an entity term. Otherwise, the term can either be a component or relation term depending on this type.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Component.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Component.html new file mode 100644 index 0000000000..b60fd360ab --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Component.html @@ -0,0 +1,131 @@ + + + + + cubos::core::ecs::QueryTerm::Component struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Entity.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Entity.html new file mode 100644 index 0000000000..4f9336ca25 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Entity.html @@ -0,0 +1,123 @@ + + + + + cubos::core::ecs::QueryTerm::Entity struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Relation.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Relation.html new file mode 100644 index 0000000000..b296b27b30 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1QueryTerm_1_1Relation.html @@ -0,0 +1,131 @@ + + + + + cubos::core::ecs::QueryTerm::Relation struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Schedule_1_1NodeId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Schedule_1_1NodeId.html new file mode 100644 index 0000000000..ecfec7737a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1Schedule_1_1NodeId.html @@ -0,0 +1,159 @@ + + + + + cubos::core::ecs::Schedule::NodeId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::Schedule::NodeId struct + +

+

Identifies a node in the schedule.

+ +
+

Public functions

+
+
+ auto operator==(const NodeId& other) const -> bool defaulted +
+
Compares two identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Node index in the schedule.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::Schedule::NodeId::operator==(const NodeId& other) const defaulted +

+

Compares two identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther identifier.
ReturnsWhether the two identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ShouldQuit.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ShouldQuit.html new file mode 100644 index 0000000000..1901b8c2e3 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1ShouldQuit.html @@ -0,0 +1,124 @@ + + + + + cubos::core::ecs::ShouldQuit struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::ShouldQuit struct + +

+

Resource used as a flag to indicate whether the main loop should stop running.

+ +

This resource is added by the Cubos class, initially set to true.

+
+

Public variables

+
+
+ bool value +
+
Whether the main loop should stop running.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableId.html new file mode 100644 index 0000000000..d17be57773 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableId.html @@ -0,0 +1,198 @@ + + + + + cubos::core::ecs::SparseRelationTableId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SparseRelationTableId struct + +

+

Identifies a sparse relation table.

+ +
+

Constructors, destructors, conversion operators

+
+
+ SparseRelationTableId() defaulted +
+
Default constructor.
+
+ SparseRelationTableId(DataTypeId dataType, + ArchetypeId from, + ArchetypeId to, + int depth = 0) +
+
Constructs.
+
+
+
+

Public functions

+
+
+ auto operator==(const SparseRelationTableId& other) const -> bool defaulted +
+
Compares with another identifier.
+
+
+
+

Function documentation

+
+

+ cubos::core::ecs::SparseRelationTableId::SparseRelationTableId(DataTypeId dataType, + ArchetypeId from, + ArchetypeId to, + int depth = 0) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + + + + + +
Parameters
dataTypeRelation data type.
fromFrom archetype identifier.
toTo archetype identifier.
depthDepth of the relation. Used in tree relations, always 0 for others.
+
+
+

+ bool cubos::core::ecs::SparseRelationTableId::operator==(const SparseRelationTableId& other) const defaulted +

+

Compares with another identifier.

+ + + + + + + + + + + + + + + + +
Parameters
otherIdentifier.
ReturnsWhether they're equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableIdHash.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableIdHash.html new file mode 100644 index 0000000000..836e09dd8b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTableIdHash.html @@ -0,0 +1,103 @@ + + + + + cubos::core::ecs::SparseRelationTableIdHash struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTable_1_1Output.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTable_1_1Output.html new file mode 100644 index 0000000000..f1470d7406 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SparseRelationTable_1_1Output.html @@ -0,0 +1,131 @@ + + + + + cubos::core::ecs::SparseRelationTable::Output struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SymmetricTrait.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SymmetricTrait.html new file mode 100644 index 0000000000..d2d97f722b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SymmetricTrait.html @@ -0,0 +1,104 @@ + + + + + cubos::core::ecs::SymmetricTrait struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SymmetricTrait struct + +

+

Trait used to identify symmetric relations.

+

Symmetric relations are relations where the order of the entities does not matter.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemAccess.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemAccess.html new file mode 100644 index 0000000000..6470b3eb26 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemAccess.html @@ -0,0 +1,164 @@ + + + + + cubos::core::ecs::SystemAccess struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SystemAccess struct + +

+

Describes the types of data a system accesses.

+ +

Used to determine if systems conflict with each other.

+
+

Public functions

+
+
+ auto intersects(const SystemAccess& other) const -> bool +
+
Checks if this access patterns intersect with the given ones.
+
+
+
+

Public variables

+
+
+ bool usesWorld +
+
Whether the system accesses the world directly.
+
+ std::unordered_set<DataTypeId, DataTypeIdHash> dataTypes +
+
Set of data types accessed by the system.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::SystemAccess::intersects(const SystemAccess& other) const +

+

Checks if this access patterns intersect with the given ones.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther system access patterns.
ReturnsWhether they intersect.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemContext.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemContext.html new file mode 100644 index 0000000000..c0d785baed --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemContext.html @@ -0,0 +1,131 @@ + + + + + cubos::core::ecs::SystemContext struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemId.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemId.html new file mode 100644 index 0000000000..d6a1c9f12a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemId.html @@ -0,0 +1,159 @@ + + + + + cubos::core::ecs::SystemId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::SystemId struct + +

+

Identifies a system.

+ +
+

Public functions

+
+
+ auto operator==(const SystemId& other) const -> bool defaulted +
+
Compares two identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
System identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::ecs::SystemId::operator==(const SystemId& other) const defaulted +

+

Compares two identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther identifier.
ReturnsWhether the two identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemOptions.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemOptions.html new file mode 100644 index 0000000000..d59234cc2b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1SystemOptions.html @@ -0,0 +1,127 @@ + + + + + cubos::core::ecs::SystemOptions struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1TreeTrait.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1TreeTrait.html new file mode 100644 index 0000000000..86e6282ab9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1TreeTrait.html @@ -0,0 +1,104 @@ + + + + + cubos::core::ecs::TreeTrait struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::ecs::TreeTrait struct + +

+

Trait used to identify tree relations.

+

Tree relations are relations which form trees. Each entity must have at most one target entity for a given tree relation type. These can be used to represent parent-child relationships.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Component.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Component.html new file mode 100644 index 0000000000..55471ff4a1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Component.html @@ -0,0 +1,131 @@ + + + + + cubos::core::ecs::World::Component struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Relation.html b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Relation.html new file mode 100644 index 0000000000..910f4d630a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1ecs_1_1World_1_1Relation.html @@ -0,0 +1,135 @@ + + + + + cubos::core::ecs::World::Relation struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1geom_1_1AABB.html b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1AABB.html new file mode 100644 index 0000000000..d6234b309e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1AABB.html @@ -0,0 +1,354 @@ + + + + + cubos::core::geom::AABB struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::geom::AABB struct + +

+

Represents an axis-aligned bounding box.

+ +
+

Public functions

+
+
+ auto min() const -> glm::vec3 +
+
Minimum point of the AABB.
+
+ auto max() const -> glm::vec3 +
+
Maximum point of the AABB.
+
+ void min(const glm::vec3& min) +
+
Sets the minimum point of the AABB.
+
+ void max(const glm::vec3& max) +
+
Sets the maximum point of the AABB.
+
+ auto box() const -> Box +
+
Gets a Box representation of the AABB.
+
+ auto center() const -> glm::vec3 +
+
Gets the center of the AABB.
+
+ auto overlapsX(const AABB& other) const -> bool +
+
Checks if the AABB overlaps with another AABB on the X axis.
+
+ auto overlapsY(const AABB& other) const -> bool +
+
Checks if the AABB overlaps with another AABB on the Y axis.
+
+ auto overlapsZ(const AABB& other) const -> bool +
+
Checks if the AABB overlaps with another AABB on the Z axis.
+
+ auto overlaps(const AABB& other) const -> bool +
+
Checks if the AABB overlaps with another AABB.
+
+
+
+

Public variables

+
+
+ glm::vec3 diag +
+
Diagonal of the AABB.
+
+
+
+

Function documentation

+
+

+ glm::vec3 cubos::core::geom::AABB::min() const +

+

Minimum point of the AABB.

+ + + + + + + +
ReturnsMinimum point of the AABB.
+
+
+

+ glm::vec3 cubos::core::geom::AABB::max() const +

+

Maximum point of the AABB.

+ + + + + + + +
ReturnsMaximum point of the AABB.
+
+
+

+ void cubos::core::geom::AABB::min(const glm::vec3& min) +

+

Sets the minimum point of the AABB.

+ + + + + + + + + + +
Parameters
minMinimum point of the AABB.
+
+
+

+ void cubos::core::geom::AABB::max(const glm::vec3& max) +

+

Sets the maximum point of the AABB.

+ + + + + + + + + + +
Parameters
maxMaximum point of the AABB.
+
+
+

+ Box cubos::core::geom::AABB::box() const +

+

Gets a Box representation of the AABB.

+ + + + + + + +
ReturnsBox representation.
+
+
+

+ glm::vec3 cubos::core::geom::AABB::center() const +

+

Gets the center of the AABB.

+ + + + + + + +
ReturnsCenter of the AABB.
+
+
+

+ bool cubos::core::geom::AABB::overlapsX(const AABB& other) const +

+

Checks if the AABB overlaps with another AABB on the X axis.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther AABB.
ReturnsWhether the AABBs overlap.
+
+
+

+ bool cubos::core::geom::AABB::overlapsY(const AABB& other) const +

+

Checks if the AABB overlaps with another AABB on the Y axis.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther AABB.
ReturnsWhether the AABBs overlap.
+
+
+

+ bool cubos::core::geom::AABB::overlapsZ(const AABB& other) const +

+

Checks if the AABB overlaps with another AABB on the Z axis.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther AABB.
ReturnsWhether the AABBs overlap.
+
+
+

+ bool cubos::core::geom::AABB::overlaps(const AABB& other) const +

+

Checks if the AABB overlaps with another AABB.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther AABB.
ReturnsWhether the AABBs overlap.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Box.html b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Box.html new file mode 100644 index 0000000000..e521ea4889 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Box.html @@ -0,0 +1,345 @@ + + + + + cubos::core::geom::Box struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::geom::Box struct + +

+

Represents a box shape.

+ +
+

Public static functions

+
+
+ static void enclosingFaces(int vertexIndex, + int faces[3]) +
+
Computes the enclosing faces of the corner.
+
+ static void edges(glm::ivec2 edges[12]) +
+
Computes the edges of a box. An edge is a pair of the corner indexes that compose it.
+
+ static void edgeAdjacentFaces(int edgeIndex, + int faces[2]) +
+
Computes the faces adjacent to an edge.
+
+ static void faceEdges(int faceIndex, + int edges[4]) +
+
Computes the edges of a face.
+
+ static void faces(glm::ivec4 faces[6]) +
+
Computes the faces with regards to the corner indexes that compose them. In conter-clock wise winding order.
+
+ static void faceNormals(glm::vec3 normals[6]) +
+
Computes the normal of each face. Same order as faces.
+
+
+
+

Public functions

+
+
+ void diag(glm::vec3 corners[2]) const +
+
Computes two opposite corners of the box on the major diagonal.
+
+ void corners4(glm::vec3 corners[4]) const +
+
Computes four corners of the box, one for each diagonal.
+
+ void corners(glm::vec3 corners[8]) const +
+
Computes the eight corners of the box, opposite corners are adjacent in the array.
+
+
+
+

Public variables

+
+
+ glm::vec3 halfSize +
+
Half size of the box.
+
+
+
+

Function documentation

+
+

+ static void cubos::core::geom::Box::enclosingFaces(int vertexIndex, + int faces[3]) +

+

Computes the enclosing faces of the corner.

+ + + + + + + + + + + + + + +
Parameters
vertexIndexIndex of the corner, according to the returned by corners.
facesArray to store the three face indexes in, according to the returned by faces.
+
+
+

+ static void cubos::core::geom::Box::edges(glm::ivec2 edges[12]) +

+

Computes the edges of a box. An edge is a pair of the corner indexes that compose it.

+ + + + + + + + + + +
Parameters
edgesArray to store the twelve edges in.
+
+
+

+ static void cubos::core::geom::Box::edgeAdjacentFaces(int edgeIndex, + int faces[2]) +

+

Computes the faces adjacent to an edge.

+ + + + + + + + + + + + + + +
Parameters
edgeIndexIndex of the edge.
facesArray to store the two faces in.
+
+
+

+ static void cubos::core::geom::Box::faceEdges(int faceIndex, + int edges[4]) +

+

Computes the edges of a face.

+ + + + + + + + + + + + + + +
Parameters
faceIndexIndex of the face.
edgesArray to store the four edges in.
+
+
+

+ static void cubos::core::geom::Box::faces(glm::ivec4 faces[6]) +

+

Computes the faces with regards to the corner indexes that compose them. In conter-clock wise winding order.

+ + + + + + + + + + +
Parameters
facesArray to store the six faces in.
+
+
+

+ static void cubos::core::geom::Box::faceNormals(glm::vec3 normals[6]) +

+

Computes the normal of each face. Same order as faces.

+ + + + + + + + + + +
Parameters
normalsArray to store the normals in.
+
+
+

+ void cubos::core::geom::Box::diag(glm::vec3 corners[2]) const +

+

Computes two opposite corners of the box on the major diagonal.

+ + + + + + + + + + +
Parameters
cornersArray to store the two corners in.
+
+
+

+ void cubos::core::geom::Box::corners4(glm::vec3 corners[4]) const +

+

Computes four corners of the box, one for each diagonal.

+ + + + + + + + + + +
Parameters
cornersArray to store the four corners in.
+
+
+

+ void cubos::core::geom::Box::corners(glm::vec3 corners[8]) const +

+

Computes the eight corners of the box, opposite corners are adjacent in the array.

+ + + + + + + + + + +
Parameters
cornersArray to store the eight corners in.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Capsule.html b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Capsule.html new file mode 100644 index 0000000000..378792cb5a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Capsule.html @@ -0,0 +1,205 @@ + + + + + cubos::core::geom::Capsule struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::geom::Capsule struct + +

+

Represents a capsule or sphere shape.

+ +
+

Public static functions

+
+
+ static auto sphere(float radius) -> Capsule +
+
Constructs a sphere.
+
+
+
+

Public functions

+
+
+ auto height() const -> float +
+
Gets the height of the capsule.
+
+ auto aabb() const -> AABB +
+
Computes the local AABB of the capsule.
+
+
+
+

Public variables

+
+
+ float radius +
+
Radius of the capsule.
+
+ float length +
+
Length of the capsule.
+
+
+
+

Function documentation

+
+

+ static Capsule cubos::core::geom::Capsule::sphere(float radius) +

+

Constructs a sphere.

+ + + + + + + + + + + + + + + + +
Parameters
radiusSphere radius.
ReturnsSphere shape.
+
+
+

+ float cubos::core::geom::Capsule::height() const +

+

Gets the height of the capsule.

+ + + + + + + +
ReturnsHeight of the capsule.
+
+
+

+ AABB cubos::core::geom::Capsule::aabb() const +

+

Computes the local AABB of the capsule.

+ + + + + + + +
ReturnsLocal AABB of the capsule.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Intersection.html b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Intersection.html new file mode 100644 index 0000000000..59fdf56f80 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Intersection.html @@ -0,0 +1,127 @@ + + + + + cubos::core::geom::Intersection struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Plane.html b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Plane.html new file mode 100644 index 0000000000..0014f32acc --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1geom_1_1Plane.html @@ -0,0 +1,103 @@ + + + + + cubos::core::geom::Plane struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1BlendStateDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1BlendStateDesc.html new file mode 100644 index 0000000000..a2168f5e91 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1BlendStateDesc.html @@ -0,0 +1,167 @@ + + + + + cubos::core::gl::BlendStateDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::BlendStateDesc struct + +

+

Describes a blend state.

+ +
+

Public variables

+
+
+ bool blendEnabled +
+
Enable blending?
+
+ BlendFactor src +
+
Color blend source factor.
+
+ BlendFactor dst +
+
Color blend destination factor.
+
+ BlendOp op +
+
Color blend operation.
+
+ struct cubos::core::gl::BlendStateDesc::@2 color +
+
Color blend state.
+
+ struct cubos::core::gl::BlendStateDesc::@3 alpha +
+
Alpha blend state.
+
+
+
+

Variable documentation

+
+

+ BlendFactor cubos::core::gl::BlendStateDesc::src +

+

Color blend source factor.

+

Alpha blend source factor.

+
+
+

+ BlendFactor cubos::core::gl::BlendStateDesc::dst +

+

Color blend destination factor.

+

Alpha blend destination factor.

+
+
+

+ BlendOp cubos::core::gl::BlendStateDesc::op +

+

Color blend operation.

+

Alpha blend operation.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferElement.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferElement.html new file mode 100644 index 0000000000..002a259f32 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferElement.html @@ -0,0 +1,135 @@ + + + + + cubos::core::gl::ConstantBufferElement struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::ConstantBufferElement struct + +

+

Describes an element in a constant buffer.

+ +
+

Public variables

+
+
+ char name +
+
Element name.
+
+ std::size_t offset +
+
Offset of the element in the buffer.
+
+ std::size_t size +
+
Number of values in the element if it is an array. If it isn't, this is set to 1.
+
+ std::size_t stride +
+
Stride between each element in the array, if the element is an array.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferStructure.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferStructure.html new file mode 100644 index 0000000000..0b1108c714 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1ConstantBufferStructure.html @@ -0,0 +1,131 @@ + + + + + cubos::core::gl::ConstantBufferStructure struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapArrayDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapArrayDesc.html new file mode 100644 index 0000000000..e2ec3cb59d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapArrayDesc.html @@ -0,0 +1,147 @@ + + + + + cubos::core::gl::CubeMapArrayDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::CubeMapArrayDesc struct + +

+

Describes a cube map array.

+ +
+

Public variables

+
+
+ const void* data +
+
Optional initial cube map data, indexed using CubeFace.
+
+ std::size_t mipLevelCount +
+
Number of mip levels.
+
+ std::size_t width +
+
Cube map face width.
+
+ std::size_t height +
+
Cube map face height.
+
+ std::size_t size +
+
Number of cube maps contained in the array.
+
+ Usage usage +
+
Texture usage mode.
+
+ TextureFormat format +
+
Texture format.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapDesc.html new file mode 100644 index 0000000000..3fc5b9701b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1CubeMapDesc.html @@ -0,0 +1,143 @@ + + + + + cubos::core::gl::CubeMapDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::CubeMapDesc struct + +

+

Describes a cube map.

+ +
+

Public variables

+
+
+ const void* data +
+
Optional initial cube map data, indexed using CubeFace.
+
+ std::size_t mipLevelCount +
+
Number of mip levels.
+
+ std::size_t width +
+
Cube map face width.
+
+ std::size_t height +
+
Cube map face height.
+
+ Usage usage +
+
Texture usage mode.
+
+ TextureFormat format +
+
Texture format.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc.html new file mode 100644 index 0000000000..2c03e1a40d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc.html @@ -0,0 +1,141 @@ + + + + + cubos::core::gl::DepthStencilStateDesc struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Depth.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Depth.html new file mode 100644 index 0000000000..02011a6c41 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Depth.html @@ -0,0 +1,139 @@ + + + + + cubos::core::gl::DepthStencilStateDesc::Depth struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil.html new file mode 100644 index 0000000000..e1295f5be4 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil.html @@ -0,0 +1,153 @@ + + + + + cubos::core::gl::DepthStencilStateDesc::Stencil struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::DepthStencilStateDesc::Stencil struct + +

+

Describes a stencil state.

+ +
+

Public types

+
+
+ struct Face +
+
Decribes a stencil face.
+
+
+
+

Public variables

+
+
+ bool enabled +
+
Is stencil enabled?
+
+ uint32_t ref +
+
Stencil ref value used on stencil comparison functions.
+
+ uint8_t readMask +
+
Stencil read mask.
+
+ uint8_t writeMask +
+
Stencil write mask.
+
+ Face backFace +
+
Stencil back face options.
+
+ Face frontFace +
+
Stencil front face options.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil_1_1Face.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil_1_1Face.html new file mode 100644 index 0000000000..9aff0b0c86 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1DepthStencilStateDesc_1_1Stencil_1_1Face.html @@ -0,0 +1,135 @@ + + + + + cubos::core::gl::DepthStencilStateDesc::Stencil::Face struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc.html new file mode 100644 index 0000000000..f81825b7df --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc.html @@ -0,0 +1,164 @@ + + + + + cubos::core::gl::FramebufferDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::FramebufferDesc struct + +

+

Describes a framebuffer.

+ +
+

Public types

+
+
+ struct CubeMapArrayTarget +
+
Describes a cube map array target.
+
+ struct CubeMapTarget +
+
Describes a cube map target.
+
+ struct FramebufferTarget +
+
Describes a framebuffer target.
+
+ struct Texture2DArrayTarget +
+
Describes a 2D texture array target.
+
+ struct Texture2DTarget +
+
Describes a 2D texture target.
+
+ enum class TargetType { CubeMap, + Texture2D, + CubeMapArray, + Texture2DArray } +
+
Possible types of targets.
+
+
+
+

Public variables

+
+
+ struct CUBOS_CORE_API cubos::core::gl::FramebufferDesc::FramebufferTarget targets +
+
Render targets.
+
+ uint32_t targetCount +
+
Number of render targets.
+
+ FramebufferTarget depthStencil +
+
Optional depth stencil target.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapArrayTarget.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapArrayTarget.html new file mode 100644 index 0000000000..6a564885e1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapArrayTarget.html @@ -0,0 +1,123 @@ + + + + + cubos::core::gl::FramebufferDesc::CubeMapArrayTarget struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapTarget.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapTarget.html new file mode 100644 index 0000000000..0e99db302d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1CubeMapTarget.html @@ -0,0 +1,127 @@ + + + + + cubos::core::gl::FramebufferDesc::CubeMapTarget struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1FramebufferTarget.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1FramebufferTarget.html new file mode 100644 index 0000000000..ad82522f93 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1FramebufferTarget.html @@ -0,0 +1,123 @@ + + + + + cubos::core::gl::FramebufferDesc::FramebufferTarget struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DArrayTarget.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DArrayTarget.html new file mode 100644 index 0000000000..e0b8742942 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DArrayTarget.html @@ -0,0 +1,123 @@ + + + + + cubos::core::gl::FramebufferDesc::Texture2DArrayTarget struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DTarget.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DTarget.html new file mode 100644 index 0000000000..f307fcebd6 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1FramebufferDesc_1_1Texture2DTarget.html @@ -0,0 +1,123 @@ + + + + + cubos::core::gl::FramebufferDesc::Texture2DTarget struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1RasterStateDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1RasterStateDesc.html new file mode 100644 index 0000000000..d6ca62db7a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1RasterStateDesc.html @@ -0,0 +1,139 @@ + + + + + cubos::core::gl::RasterStateDesc struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1SamplerDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1SamplerDesc.html new file mode 100644 index 0000000000..c2aca47327 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1SamplerDesc.html @@ -0,0 +1,151 @@ + + + + + cubos::core::gl::SamplerDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::SamplerDesc struct + +

+

Describes a sampler.

+ +
+

Public variables

+
+
+ float borderColor +
+
Border color applied when the address mode is AddressMode::Border.
+
+ TextureFilter minFilter +
+
Minifying filter.
+
+ TextureFilter magFilter +
+
Magnifying filter.
+
+ TextureFilter mipmapFilter +
+
Set to None to disable mipmapping.
+
+ AddressMode addressU +
+
Texture adress mode on coordinate U.
+
+ AddressMode addressV +
+
Texture adress mode on coordinate V.
+
+ AddressMode addressW +
+
Texture adress mode on coordinate W.
+
+ std::size_t maxAnisotropy +
+
Max anisotropy for filtering. Limited to Property::MaxAnisotropy.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture1DDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture1DDesc.html new file mode 100644 index 0000000000..0534f8f6ef --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture1DDesc.html @@ -0,0 +1,139 @@ + + + + + cubos::core::gl::Texture1DDesc struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DArrayDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DArrayDesc.html new file mode 100644 index 0000000000..5683674bbb --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DArrayDesc.html @@ -0,0 +1,147 @@ + + + + + cubos::core::gl::Texture2DArrayDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::Texture2DArrayDesc struct + +

+

Describes a 2D texture array.

+ +
+

Public variables

+
+
+ const void* data +
+
Optional initial texture data.
+
+ std::size_t mipLevelCount +
+
Number of mip levels.
+
+ std::size_t width +
+
Texture width.
+
+ std::size_t height +
+
Texture height.
+
+ std::size_t size +
+
Number of 2D Textures contained in the array.
+
+ Usage usage +
+
Texture usage mode.
+
+ TextureFormat format +
+
Texture format.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DDesc.html new file mode 100644 index 0000000000..c6f5f80fc1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture2DDesc.html @@ -0,0 +1,143 @@ + + + + + cubos::core::gl::Texture2DDesc struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture3DDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture3DDesc.html new file mode 100644 index 0000000000..b6cfe1a9a4 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1Texture3DDesc.html @@ -0,0 +1,147 @@ + + + + + cubos::core::gl::Texture3DDesc struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::Texture3DDesc struct + +

+

Describes a 3D texture.

+ +
+

Public variables

+
+
+ const void* data +
+
Optional initial texture data.
+
+ std::size_t mipLevelCount +
+
Number of mip levels.
+
+ std::size_t width +
+
Texture width.
+
+ std::size_t height +
+
Texture height.
+
+ std::size_t depth +
+
Texture depth.
+
+ Usage usage +
+
Texture usage mode.
+
+ TextureFormat format +
+
Texture format.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexArrayDesc.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexArrayDesc.html new file mode 100644 index 0000000000..20e593692e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexArrayDesc.html @@ -0,0 +1,135 @@ + + + + + cubos::core::gl::VertexArrayDesc struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexElement.html b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexElement.html new file mode 100644 index 0000000000..1f09f724ef --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1gl_1_1VertexElement.html @@ -0,0 +1,147 @@ + + + + + cubos::core::gl::VertexElement struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::gl::VertexElement struct + +

+

Describes a vertex element.

+ +
+

Public variables

+
+
+ const char* name +
+
Element name.
+
+ Type type +
+
Element type.
+
+ std::size_t size +
+
Number of components in the vertex element (1, 2, 3 or 4).
+
+ std::size_t stride +
+
Stride between each element in memory.
+
+ std::size_t offset +
+
Offset of the first element in the buffer.
+
+ std::size_t index +
+
Index of the vertex buffer where the element is stored.
+
+ struct cubos::core::gl::VertexElement::@4 buffer +
+
Vertex buffer description.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadConnectionEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadConnectionEvent.html new file mode 100644 index 0000000000..e418c7a76c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadConnectionEvent.html @@ -0,0 +1,127 @@ + + + + + cubos::core::io::GamepadConnectionEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadState.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadState.html new file mode 100644 index 0000000000..f96d95ba5e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1GamepadState.html @@ -0,0 +1,190 @@ + + + + + cubos::core::io::GamepadState struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::io::GamepadState struct + +

+

Holds the state of a gamepad.

+ +
+

Public functions

+
+
+ auto pressed(GamepadButton button) const -> bool +
+
Checks if a button is pressed.
+
+ auto axis(GamepadAxis axis) const -> float +
+
Gets the value of an axis.
+
+
+
+

Public variables

+
+
+ bool buttons +
+
Which buttons are pressed, indexed by GamepadButton.
+
+ float axes +
+
Values of the axes, indexed by GamepadAxis.
+
+
+
+

Function documentation

+
+

+ bool cubos::core::io::GamepadState::pressed(GamepadButton button) const +

+

Checks if a button is pressed.

+ + + + + + + + + + + + + + + + +
Parameters
buttonButton to check.
ReturnsWhether it is pressed or not.
+
+
+

+ float cubos::core::io::GamepadState::axis(GamepadAxis axis) const +

+

Gets the value of an axis.

+ + + + + + + + + + + + + + + + +
Parameters
axisAxis to get the value of.
ReturnsValue of the axis.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1KeyEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1KeyEvent.html new file mode 100644 index 0000000000..e1447a7771 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1KeyEvent.html @@ -0,0 +1,127 @@ + + + + + cubos::core::io::KeyEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1ModifiersEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1ModifiersEvent.html new file mode 100644 index 0000000000..d8ebf4181a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1ModifiersEvent.html @@ -0,0 +1,123 @@ + + + + + cubos::core::io::ModifiersEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseButtonEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseButtonEvent.html new file mode 100644 index 0000000000..a646993f1d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseButtonEvent.html @@ -0,0 +1,127 @@ + + + + + cubos::core::io::MouseButtonEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseMoveEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseMoveEvent.html new file mode 100644 index 0000000000..99a9e21bbe --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseMoveEvent.html @@ -0,0 +1,123 @@ + + + + + cubos::core::io::MouseMoveEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseScrollEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseScrollEvent.html new file mode 100644 index 0000000000..880d0e183b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1MouseScrollEvent.html @@ -0,0 +1,123 @@ + + + + + cubos::core::io::MouseScrollEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1ResizeEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1ResizeEvent.html new file mode 100644 index 0000000000..32174a45d8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1ResizeEvent.html @@ -0,0 +1,123 @@ + + + + + cubos::core::io::ResizeEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1io_1_1TextEvent.html b/preview/pr-1379/structcubos_1_1core_1_1io_1_1TextEvent.html new file mode 100644 index 0000000000..c9f5e2c37d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1io_1_1TextEvent.html @@ -0,0 +1,123 @@ + + + + + cubos::core::io::TextEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1memory_1_1IsLValueReference.html b/preview/pr-1379/structcubos_1_1core_1_1memory_1_1IsLValueReference.html new file mode 100644 index 0000000000..ce1937f505 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1memory_1_1IsLValueReference.html @@ -0,0 +1,115 @@ + + + + + cubos::core::memory::IsLValueReference struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::memory::IsLValueReference struct +

+

Used to check if a type is an rvalue reference.

+ + + + + + + + + + +
Template parameters
TType.
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1memory_1_1RemoveReference.html b/preview/pr-1379/structcubos_1_1core_1_1memory_1_1RemoveReference.html new file mode 100644 index 0000000000..4170bb24fe --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1memory_1_1RemoveReference.html @@ -0,0 +1,136 @@ + + + + + cubos::core::memory::RemoveReference struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::memory::RemoveReference struct +

+

Provides a type which is the same as the given type, but without any references.

+ + + + + + + + + + +
Template parameters
TType.
+ + +
+

Public types

+
+
+ using Type = T +
+
Type without references.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1DictionaryTrait_1_1Entry.html b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1DictionaryTrait_1_1Entry.html new file mode 100644 index 0000000000..087917599a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1DictionaryTrait_1_1Entry.html @@ -0,0 +1,131 @@ + + + + + cubos::core::reflection::DictionaryTrait::Entry struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1Output.html b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1Output.html new file mode 100644 index 0000000000..aab758a6d1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1FieldsTrait_1_1Output.html @@ -0,0 +1,131 @@ + + + + + cubos::core::reflection::FieldsTrait::Output struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1Reflect.html b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1Reflect.html new file mode 100644 index 0000000000..8fa5deac54 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1reflection_1_1Reflect.html @@ -0,0 +1,116 @@ + + + + + cubos::core::reflection::Reflect struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ +
template<typename T>
+ cubos::core::reflection::Reflect struct +

+

Defines the reflection function for the given type T.

+ + + + + + + + + + +
Template parameters
TType to reflect.
+

By default, this function calls the static member function reflect of the type, which should return a pointer to an instance of Type.

To implement reflection for your type, you should either:

  • Define a static member function reflect with return type const Type& on your type.
  • Specialize this struct for your type.

The first option is preferred, as it is less verbose. However, when handling external types, to which member functions cannot be added, the second option is necessary.

Both options can and should be shortened by using the macros:

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Entry.html b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Entry.html new file mode 100644 index 0000000000..abf8d23a67 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Entry.html @@ -0,0 +1,139 @@ + + + + + cubos::core::tel::Logger::Entry struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Location.html b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Location.html new file mode 100644 index 0000000000..ab57adc3da --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Location.html @@ -0,0 +1,158 @@ + + + + + cubos::core::tel::Logger::Location struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::Logger::Location struct + +

+

Identifies a location in the code.

+ +
+

Public functions

+
+
+ auto string() const -> std::string +
+
Returns a string representation for the location.
+
+
+
+

Public variables

+
+
+ std::string function +
+
Function name.
+
+ std::string file +
+
File name.
+
+ int line +
+
Line number.
+
+
+
+

Function documentation

+
+

+ std::string cubos::core::tel::Logger::Location::string() const +

+

Returns a string representation for the location.

+ + + + + + + +
ReturnsString representation.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Timestamp.html b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Timestamp.html new file mode 100644 index 0000000000..f560720505 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1Logger_1_1Timestamp.html @@ -0,0 +1,174 @@ + + + + + cubos::core::tel::Logger::Timestamp struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::core::tel::Logger::Timestamp struct + +

+

A timestamp used to identify when a logging message was written.

+ +
+

Public static functions

+
+
+ static auto now() -> Timestamp +
+
Returns a timestamp with the current time.
+
+
+
+

Public functions

+
+
+ auto string() const -> std::string +
+
Returns a string representation for the timestamp, containing hours, minutes, seconds and milliseconds.
+
+
+
+

Public variables

+
+
+ int64_t timestamp +
+
Milliseconds since the UNIX epoch.
+
+
+
+

Function documentation

+
+

+ static Timestamp cubos::core::tel::Logger::Timestamp::now() +

+

Returns a timestamp with the current time.

+ + + + + + + +
ReturnsTimestamp.
+
+
+

+ std::string cubos::core::tel::Logger::Timestamp::string() const +

+

Returns a string representation for the timestamp, containing hours, minutes, seconds and milliseconds.

+ + + + + + + +
ReturnsString representation.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1core_1_1tel_1_1SpanId.html b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1SpanId.html new file mode 100644 index 0000000000..82879943c4 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1core_1_1tel_1_1SpanId.html @@ -0,0 +1,127 @@ + + + + + cubos::core::tel::SpanId struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1AccumulatedCorrection.html b/preview/pr-1379/structcubos_1_1engine_1_1AccumulatedCorrection.html new file mode 100644 index 0000000000..72c0da3948 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1AccumulatedCorrection.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::AccumulatedCorrection struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1AngularImpulse.html b/preview/pr-1379/structcubos_1_1engine_1_1AngularImpulse.html new file mode 100644 index 0000000000..817fae5e40 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1AngularImpulse.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::AngularImpulse struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1AngularVelocity.html b/preview/pr-1379/structcubos_1_1engine_1_1AngularVelocity.html new file mode 100644 index 0000000000..0758b9851f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1AngularVelocity.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::AngularVelocity struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1AssetMeta_1_1Exclude.html b/preview/pr-1379/structcubos_1_1engine_1_1AssetMeta_1_1Exclude.html new file mode 100644 index 0000000000..35c681b34f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1AssetMeta_1_1Exclude.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::AssetMeta::Exclude struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Audio.html b/preview/pr-1379/structcubos_1_1engine_1_1Audio.html new file mode 100644 index 0000000000..70b174584f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Audio.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::Audio struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Bloom.html b/preview/pr-1379/structcubos_1_1engine_1_1Bloom.html new file mode 100644 index 0000000000..5ef32d6a5e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Bloom.html @@ -0,0 +1,185 @@ + + + + + cubos::engine::Bloom struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Bloom struct + +

+

Component which stores the Bloom state for a render target.

+ +
+

Public variables

+
+
+ int iterations +
+
Number of blur passes to apply.
+
+ float threshold +
+
Threshold for the Bloom effect.
+
+ float softThreshold +
+
Soft threshold for the Bloom effect.
+
+ float intensity +
+
Intensity of the Bloom effect.
+
+ glm::vec3 luminance +
+
Luminance values used to calculate the Bloom effect.
+
+ core::gl::Framebuffer frontFramebuffer +
+
Framebuffer used to draw to the HDR texture.
+
+ core::gl::Framebuffer backFramebuffer +
+
Framebuffer used to draw to the back HDR texture.
+
+ core::gl::Texture2D frontHDR +
+
HDR texture present in the frontFramebuffer.
+
+ core::gl::Texture2D backHDR +
+
HDR texture present in the backFramebuffer.
+
+ glm::uvec2 size +
+
Size of the textures.
+
+ core::gl::Texture2D extractionTexture +
+
Texture where the Bloom extraction result is stored.
+
+ core::gl::Framebuffer extractionFramebuffer +
+
Framebuffer used to draw to the Bloom extraction texture.
+
+ std::vector<core::gl::Texture2D> bloomTextures +
+
Textures where the Bloom result is stored.
+
+ std::vector<core::gl::Framebuffer> bloomFramebuffers +
+
Framebuffers used to draw to the Bloom textures.
+
+
+
+

Variable documentation

+
+

+ core::gl::Framebuffer cubos::engine::Bloom::backFramebuffer +

+

Framebuffer used to draw to the back HDR texture.

+

Swapped with frontFramebuffer as needed so that the textures match with the HDR component.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1BoxCollisionShape.html b/preview/pr-1379/structcubos_1_1engine_1_1BoxCollisionShape.html new file mode 100644 index 0000000000..f24547a1f5 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1BoxCollisionShape.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::BoxCollisionShape struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Camera.html b/preview/pr-1379/structcubos_1_1engine_1_1Camera.html new file mode 100644 index 0000000000..8f3f5b74ff --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Camera.html @@ -0,0 +1,136 @@ + + + + + cubos::engine::Camera struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Camera struct + +

+

Generic component to hold the projection matrix of a specific camera (either perspective or orthogonal).

+ + +
+

Public variables

+
+
+ bool active +
+
Whether the camera is drawing to a target.
+
+ glm::mat4 projection +
+
Projection matrix of the camera.
+
+ float zNear +
+
Near clipping plane.
+
+ float zFar +
+
Far clipping plane.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1CapsuleCollisionShape.html b/preview/pr-1379/structcubos_1_1engine_1_1CapsuleCollisionShape.html new file mode 100644 index 0000000000..93e5bef37c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1CapsuleCollisionShape.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::CapsuleCollisionShape struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1CenterOfMass.html b/preview/pr-1379/structcubos_1_1engine_1_1CenterOfMass.html new file mode 100644 index 0000000000..58cca6c427 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1CenterOfMass.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::CenterOfMass struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ChildOf.html b/preview/pr-1379/structcubos_1_1engine_1_1ChildOf.html new file mode 100644 index 0000000000..63b8a61ed3 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ChildOf.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::ChildOf struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Collider.html b/preview/pr-1379/structcubos_1_1engine_1_1Collider.html new file mode 100644 index 0000000000..743f0b98d9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Collider.html @@ -0,0 +1,145 @@ + + + + + cubos::engine::Collider struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Collider struct + +

+

Component which adds a collider to an entity.

+ +
+

Public variables

+
+
+ glm::mat4 transform +
+
Transform of the collider.
+
+ core::geom::AABB localAABB +
+
Local space AABB of the collider.
+
+ core::geom::AABB worldAABB +
+
World space AABB of the collider.
+
+ float margin +
+
Margin of the collider.
+
+
+
+

Variable documentation

+
+

+ float cubos::engine::Collider::margin +

+

Margin of the collider.

+

When the collider shape has sharp edges, a margin is needed. The plugin will set it based on the shape associated with the collider.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1CollidingWith.html b/preview/pr-1379/structcubos_1_1engine_1_1CollidingWith.html new file mode 100644 index 0000000000..f52bbd4623 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1CollidingWith.html @@ -0,0 +1,135 @@ + + + + + cubos::engine::CollidingWith struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::CollidingWith struct + +

+

Relation which represents a collision.

+ +
+

Public variables

+
+
+ cubos::core::ecs::Entity entity +
+
Entity to which the normal is relative to.
+
+ float penetration +
+
Penetration depth of the collision.
+
+ glm::vec3 position +
+
Position of contact on the surface of the entity.
+
+ glm::vec3 normal +
+
Normal of contact on the surface of the entity.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ContactManifold.html b/preview/pr-1379/structcubos_1_1engine_1_1ContactManifold.html new file mode 100644 index 0000000000..e74386c20d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ContactManifold.html @@ -0,0 +1,140 @@ + + + + + cubos::engine::ContactManifold struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ContactManifold struct + +

+

Represents a contact interface between two bodies.

+ +
+

Public variables

+
+
+ cubos::core::ecs::Entity entity +
+
Entity to which the normal is relative to.
+
+ glm::vec3 normal +
+
+
+ std::vector<ContactPointData> points +
+
Contact points of this manifold.
+
+
+
+

Variable documentation

+
+

+ glm::vec3 cubos::engine::ContactManifold::normal +

+

A contact normal shared by all contacts in this manifold, expressed in the local space of the first entity.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ContactPointData.html b/preview/pr-1379/structcubos_1_1engine_1_1ContactPointData.html new file mode 100644 index 0000000000..ce26f482eb --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ContactPointData.html @@ -0,0 +1,162 @@ + + + + + cubos::engine::ContactPointData struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ContactPointData struct + +

+

Contains info regarding a contact point of a @ContactManifold.

+ +
+

Public variables

+
+
+ cubos::core::ecs::Entity entity +
+
Entity to which the normal is relative to.
+
+ glm::vec3 globalOn1 +
+
Position on the entity of the contact in global coordinates.
+
+ glm::vec3 globalOn2 +
+
Position on the other entity of the contact in global coordinates.
+
+ glm::vec3 localOn1 +
+
Position on the entity of the contact in local coordinates.
+
+ glm::vec3 localOn2 +
+
Position on the other entity of the contact in local coordinates.
+
+ float penetration +
+
+
+ int id +
+
+
+
+
+

Variable documentation

+
+

+ float cubos::engine::ContactPointData::penetration +

+

Penetration of the contact point. Always positive.

+
+
+

+ int cubos::engine::ContactPointData::id +

+

The contact feature ID on the first shape. This indicates the ID of the vertex, edge, or face of the contact, if one can be determined.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Damping.html b/preview/pr-1379/structcubos_1_1engine_1_1Damping.html new file mode 100644 index 0000000000..41f029d04c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Damping.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::Damping struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1DeferredShading.html b/preview/pr-1379/structcubos_1_1engine_1_1DeferredShading.html new file mode 100644 index 0000000000..ad7a78bea8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1DeferredShading.html @@ -0,0 +1,145 @@ + + + + + cubos::engine::DeferredShading struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::DeferredShading struct + +

+

Component which stores the Deferred Shading state for a render target.

+ +
+

Public variables

+
+
+ core::gl::Framebuffer frontFramebuffer +
+
Framebuffer used to draw to the HDR texture.
+
+ core::gl::Framebuffer backFramebuffer +
+
Framebuffer used to draw to the back HDR texture.
+
+ core::gl::Texture2D frontHDR +
+
HDR texture present in the frontFramebuffer.
+
+ core::gl::Texture2D backHDR +
+
HDR texture present in the backFramebuffer.
+
+
+
+

Variable documentation

+
+

+ core::gl::Framebuffer cubos::engine::DeferredShading::backFramebuffer +

+

Framebuffer used to draw to the back HDR texture.

+

Swapped with frontFramebuffer as needed so that the textures match with the HDR component.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1DirectionalLight.html b/preview/pr-1379/structcubos_1_1engine_1_1DirectionalLight.html new file mode 100644 index 0000000000..2f69163b56 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1DirectionalLight.html @@ -0,0 +1,128 @@ + + + + + cubos::engine::DirectionalLight struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1DirectionalShadowCaster.html b/preview/pr-1379/structcubos_1_1engine_1_1DirectionalShadowCaster.html new file mode 100644 index 0000000000..e020284a91 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1DirectionalShadowCaster.html @@ -0,0 +1,226 @@ + + + + + cubos::engine::DirectionalShadowCaster struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::DirectionalShadowCaster struct + +

+

Component which enables shadow casting on a directional light.

+ +
+

Public functions

+
+
+ void updateShadowMaps(cubos::core::gl::RenderDevice& rd) +
+
Update shadow maps to the target size and target number of cascades.
+
+ void setDefaultSplitDistances(int numCascades) +
+
Set splits to have the same distance between each other.
+
+ auto getCurrentSplitDistances() const -> const std::vector<float>& +
+
Get the real current distances of each split.
+
+ auto getCurrentSize() const -> glm::uvec2 +
+
Get the real current size of shadow maps.
+
+
+
+

Public variables

+
+
+ std::vector<float> splitDistances +
+
Target distance of each split from 0 to 1 (interpolated between nearDistance and maxDistance).
+
+ float maxDistance +
+
Max distance (if 0, uses camera zFar).
+
+ float nearDistance +
+
Near distance of shadow frustum (if 0, uses camera zNear).
+
+ std::unordered_map<core::ecs::Entity, std::shared_ptr<ShadowMap>, core::ecs::EntityHash> shadowMaps +
+
Caster's shadow maps for each camera.
+
+ glm::uvec2 size +
+
Target size of the shadow map textures, in pixels. Use this to change the resolution of the shadow maps. Note that the real resolution may not match this, as it may be dynamically adjusted.
+
+
+
+

Function documentation

+
+

+ void cubos::engine::DirectionalShadowCaster::updateShadowMaps(cubos::core::gl::RenderDevice& rd) +

+

Update shadow maps to the target size and target number of cascades.

+ + + + + + + + + + +
Parameters
rdRender device used to create the textures.
+
+
+

+ void cubos::engine::DirectionalShadowCaster::setDefaultSplitDistances(int numCascades) +

+

Set splits to have the same distance between each other.

+ + + + + + + + + + +
Parameters
numCascadesNumber of shadow map cascades.
+
+
+

+ const std::vector<float>& cubos::engine::DirectionalShadowCaster::getCurrentSplitDistances() const +

+

Get the real current distances of each split.

+ + + + + + + +
ReturnsCurrent distances of each split.
+
+
+

+ glm::uvec2 cubos::engine::DirectionalShadowCaster::getCurrentSize() const +

+

Get the real current size of shadow maps.

+ + + + + + + +
ReturnsSize of the shadow map textures, in pixels.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1DrawsTo.html b/preview/pr-1379/structcubos_1_1engine_1_1DrawsTo.html new file mode 100644 index 0000000000..cc9617943d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1DrawsTo.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::DrawsTo struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1FixedDeltaTime.html b/preview/pr-1379/structcubos_1_1engine_1_1FixedDeltaTime.html new file mode 100644 index 0000000000..700754cb8b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1FixedDeltaTime.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::FixedDeltaTime struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Force.html b/preview/pr-1379/structcubos_1_1engine_1_1Force.html new file mode 100644 index 0000000000..8974d0cea0 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Force.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::Force struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1FreeCameraController.html b/preview/pr-1379/structcubos_1_1engine_1_1FreeCameraController.html new file mode 100644 index 0000000000..8811ca252a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1FreeCameraController.html @@ -0,0 +1,155 @@ + + + + + cubos::engine::FreeCameraController struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::FreeCameraController struct + +

+

Component which moves the camera.

+ +
+

Public variables

+
+
+ bool enabled +
+
Whether the controller is enabled. Mouse is only captured when enabled.
+
+ bool unscaledDeltaTime +
+
Whether the controller uses unscaled delta time.
+
+ std::string lateral +
+
Action used to move the camera laterally (positive is right).
+
+ std::string vertical +
+
Action used to move the camera vertically (positive is up).
+
+ std::string longitudinal +
+
Action used to move the camera longitudinally (positive is forward).
+
+ float speed +
+
Speed at which the camera moves.
+
+ float sens +
+
Sensitivity of the camera rotation, i.e,, how fast the camera rotates.
+
+ float phi +
+
Inclination of the camera.
+
+ float theta +
+
Azimuth of the camera.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1GBuffer.html b/preview/pr-1379/structcubos_1_1engine_1_1GBuffer.html new file mode 100644 index 0000000000..9dee44a85e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1GBuffer.html @@ -0,0 +1,139 @@ + + + + + cubos::engine::GBuffer struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::GBuffer struct + +

+

Component which stores the GBuffer textures of a render target.

+ +
+

Public variables

+
+
+ glm::uvec2 size +
+
Size of the GBuffer textures, in pixels.
+
+ bool cleared +
+
Whether the GBuffer textures have already been cleared this frame.
+
+ core::gl::Texture2D position +
+
Stores the position of the objects in the scene.
+
+ core::gl::Texture2D normal +
+
Stores the normal of the objects in the scene.
+
+ core::gl::Texture2D albedo +
+
Stores the albedo of the objects in the scene.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1GBufferRasterizer.html b/preview/pr-1379/structcubos_1_1engine_1_1GBufferRasterizer.html new file mode 100644 index 0000000000..d0fa978a44 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1GBufferRasterizer.html @@ -0,0 +1,161 @@ + + + + + cubos::engine::GBufferRasterizer struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::GBufferRasterizer struct + +

+

Component which stores the GBuffer rasterizer state.

+ +
+

Public variables

+
+
+ core::gl::Framebuffer frontFramebuffer +
+
Framebuffer used by the rasterizer to render to the GBuffer.
+
+ core::gl::Framebuffer backFramebuffer +
+
Back framebuffer (swapped with front framebuffer every frame).
+
+ core::gl::Texture2D position +
+
GBuffer's position texture in the current framebuffers.
+
+ core::gl::Texture2D normal +
+
GBuffer's normal texture in the current framebuffers.
+
+ core::gl::Texture2D albedo +
+
GBuffer's albedo texture in the current framebuffers.
+
+ core::gl::Texture2D depth +
+
RenderDepth texture in the current framebuffers.
+
+ core::gl::Texture2D frontPicker +
+
RenderPicker texture in the current front framebuffer.
+
+ core::gl::Texture2D backPicker +
+
RenderPicker texture in the current back framebuffer.
+
+
+
+

Variable documentation

+
+

+ core::gl::Framebuffer cubos::engine::GBufferRasterizer::backFramebuffer +

+

Back framebuffer (swapped with front framebuffer every frame).

+

This is necessary due to the double-buffering technique used by the RenderPicker.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1GizmosTarget.html b/preview/pr-1379/structcubos_1_1engine_1_1GizmosTarget.html new file mode 100644 index 0000000000..a9c523f5b6 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1GizmosTarget.html @@ -0,0 +1,135 @@ + + + + + cubos::engine::GizmosTarget struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::GizmosTarget struct + +

+

Component used to indicate that Gizmos should be rendered to a given RenderTarget.

+ +
+

Public variables

+
+
+ core::gl::Framebuffer frontFramebuffer +
+
Framebuffer used to draw to the front RenderPicker texture.
+
+ core::gl::Framebuffer backFramebuffer +
+
Framebuffer used to draw to the back RenderPicker texture.
+
+ core::gl::Texture2D frontPicker +
+
Picker texture present in the frontFramebuffer.
+
+ core::gl::Texture2D backPicker +
+
Picker texture present in the backFramebuffer.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Gravity.html b/preview/pr-1379/structcubos_1_1engine_1_1Gravity.html new file mode 100644 index 0000000000..4300014fcc --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Gravity.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::Gravity struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1HDR.html b/preview/pr-1379/structcubos_1_1engine_1_1HDR.html new file mode 100644 index 0000000000..446f4992c8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1HDR.html @@ -0,0 +1,141 @@ + + + + + cubos::engine::HDR struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::HDR struct + +

+

Component which stores the HDR texture of a render target.

+ +
+

Public variables

+
+
+ glm::uvec2 size +
+
Size of the HDR textures, in pixels.
+
+ core::gl::Texture2D frontTexture +
+
Handle to the HDR texture to write to/read from.
+
+ core::gl::Texture2D backTexture +
+
Handle to the HDR texture to be written to by post-processing plugins.
+
+
+
+

Variable documentation

+
+

+ core::gl::Texture2D cubos::engine::HDR::backTexture +

+

Handle to the HDR texture to be written to by post-processing plugins.

+

Each effect should write to this texture and then swap it with frontTexture.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ImGuiTarget.html b/preview/pr-1379/structcubos_1_1engine_1_1ImGuiTarget.html new file mode 100644 index 0000000000..8b71b93a7f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ImGuiTarget.html @@ -0,0 +1,135 @@ + + + + + cubos::engine::ImGuiTarget struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ImGuiTarget struct + +

+

Component used to indicate that the ImGui frame should be rendered to a given RenderTarget.

+ +
+

Public variables

+
+
+ core::gl::Framebuffer frontFramebuffer +
+
Framebuffer used to draw to the front RenderPicker texture.
+
+ core::gl::Framebuffer backFramebuffer +
+
Framebuffer used to draw to the back RenderPicker texture.
+
+ core::gl::Texture2D frontPicker +
+
Picker texture present in the frontFramebuffer.
+
+ core::gl::Texture2D backPicker +
+
Picker texture present in the backFramebuffer.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Image.html b/preview/pr-1379/structcubos_1_1engine_1_1Image.html new file mode 100644 index 0000000000..ebfb4bcf23 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Image.html @@ -0,0 +1,131 @@ + + + + + cubos::engine::Image struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Impulse.html b/preview/pr-1379/structcubos_1_1engine_1_1Impulse.html new file mode 100644 index 0000000000..8d22384394 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Impulse.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::Impulse struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Inertia.html b/preview/pr-1379/structcubos_1_1engine_1_1Inertia.html new file mode 100644 index 0000000000..3511c9e1d6 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Inertia.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::Inertia struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1LoadRenderVoxels.html b/preview/pr-1379/structcubos_1_1engine_1_1LoadRenderVoxels.html new file mode 100644 index 0000000000..850278c285 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1LoadRenderVoxels.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::LoadRenderVoxels struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::LoadRenderVoxels struct + +

+

Component used to indicate that a voxel grid should be sent to the GPU.

+

To be used in conjunction with a RenderVoxelGrid component. Read its documentation for more information. Automatically removed after the task is completed.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1LocalToParent.html b/preview/pr-1379/structcubos_1_1engine_1_1LocalToParent.html new file mode 100644 index 0000000000..40facdfe28 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1LocalToParent.html @@ -0,0 +1,124 @@ + + + + + cubos::engine::LocalToParent struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::LocalToParent struct + +

+

Component which stores the transformation matrix of an entity, from local to parent space.

+ + +
+

Public variables

+
+
+ glm::mat4 mat +
+
Local to parent space matrix.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1LocalToWorld.html b/preview/pr-1379/structcubos_1_1engine_1_1LocalToWorld.html new file mode 100644 index 0000000000..ed2ecd277e --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1LocalToWorld.html @@ -0,0 +1,205 @@ + + + + + cubos::engine::LocalToWorld struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::LocalToWorld struct + +

+

Component which stores the transformation matrix of an entity, from local to world space.

+ + +
+

Public functions

+
+
+ auto inverse() const -> glm::mat4 +
+
Gets Local to world space matrix reversed.
+
+ auto worldPosition() const -> glm::vec3 +
+
Gets global position of the entity.
+
+ auto worldRotation() const -> glm::quat +
+
Gets global rotation of the entity.
+
+ auto worldScale() const -> float +
+
Gets global scale of the entity.
+
+
+
+

Public variables

+
+
+ glm::mat4 mat +
+
Local to world space matrix.
+
+
+
+

Function documentation

+
+

+ glm::mat4 cubos::engine::LocalToWorld::inverse() const +

+

Gets Local to world space matrix reversed.

+ + + + + + + +
ReturnsWorld to local space matrix inversed.
+
+
+

+ glm::vec3 cubos::engine::LocalToWorld::worldPosition() const +

+

Gets global position of the entity.

+ + + + + + + +
ReturnsPosition vector in world space.
+
+
+

+ glm::quat cubos::engine::LocalToWorld::worldRotation() const +

+

Gets global rotation of the entity.

+ + + + + + + +
ReturnsRotation quaternion in world space.
+
+
+

+ float cubos::engine::LocalToWorld::worldScale() const +

+

Gets global scale of the entity.

+ + + + + + + +
ReturnsScale value in world space.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Mass.html b/preview/pr-1379/structcubos_1_1engine_1_1Mass.html new file mode 100644 index 0000000000..fa32dbad22 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Mass.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::Mass struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1OrthographicCamera.html b/preview/pr-1379/structcubos_1_1engine_1_1OrthographicCamera.html new file mode 100644 index 0000000000..d59d7c019a --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1OrthographicCamera.html @@ -0,0 +1,139 @@ + + + + + cubos::engine::OrthographicCamera struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::OrthographicCamera struct + +

+

Component which defines parameters of a orthographic camera used to render the world.

+ + +
+

Public types

+
+
+ enum class Axis { Horizontal, + Vertical } +
+
The axis that can be fixed for this projection.
+
+
+
+

Public variables

+
+
+ float size +
+
The size of the fixed axis of the projection.
+
+ Axis axis +
+
The axis to be fixed for the projection.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1PerspectiveCamera.html b/preview/pr-1379/structcubos_1_1engine_1_1PerspectiveCamera.html new file mode 100644 index 0000000000..a4decd854d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1PerspectiveCamera.html @@ -0,0 +1,124 @@ + + + + + cubos::engine::PerspectiveCamera struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1PhysicsBundle.html b/preview/pr-1379/structcubos_1_1engine_1_1PhysicsBundle.html new file mode 100644 index 0000000000..386e5640cc --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1PhysicsBundle.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::PhysicsBundle struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1PhysicsMaterial.html b/preview/pr-1379/structcubos_1_1engine_1_1PhysicsMaterial.html new file mode 100644 index 0000000000..45b23d9ce8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1PhysicsMaterial.html @@ -0,0 +1,186 @@ + + + + + cubos::engine::PhysicsMaterial struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::PhysicsMaterial struct + +

+

Component which defines the friction and bounciness of a body.

+ +
+

Public types

+
+
+ enum class MixProperty { Maximum, + Multiply, + Minimum, + Average } +
+
Type of mixing for the material property. When mixing between bodies with different types, the priority is taken into account. The priority is as defined in the enum, lower priority takes precedence.
+
+
+
+

Public variables

+
+
+ float friction +
+
Static and Dynamic friction coefficient for the body. Range between 0, for no friction, and 1, for maximum friction.
+
+ float bounciness +
+
Bounciness of the body. Range between 0, for no bounce, and 1, for maximum bounce.
+
+ MixProperty frictionMix +
+
Type of value mixing for friction, according to MixProperty.
+
+ MixProperty bouncinessMix +
+
Type of value mixing for bounciness, according to MixProperty.
+
+
+
+

Enum documentation

+
+

+ enum class cubos::engine::PhysicsMaterial::MixProperty +

+

Type of mixing for the material property. When mixing between bodies with different types, the priority is taken into account. The priority is as defined in the enum, lower priority takes precedence.

+ + + + + + + + + + + + + + + + + + + + +
Enumerators
Maximum +

Use highest property value | Priority 0.

+
Multiply +

Multiply property values | Priority 1.

+
Minimum +

Use lowest property value | Priority 2.

+
Average +

Use the average of property values | Priority 3.

+
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1PointLight.html b/preview/pr-1379/structcubos_1_1engine_1_1PointLight.html new file mode 100644 index 0000000000..e12ca7bd3d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1PointLight.html @@ -0,0 +1,131 @@ + + + + + cubos::engine::PointLight struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1PointShadowCaster.html b/preview/pr-1379/structcubos_1_1engine_1_1PointShadowCaster.html new file mode 100644 index 0000000000..9d44da49cf --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1PointShadowCaster.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::PointShadowCaster struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Position.html b/preview/pr-1379/structcubos_1_1engine_1_1Position.html new file mode 100644 index 0000000000..5a6066289f --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Position.html @@ -0,0 +1,124 @@ + + + + + cubos::engine::Position struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Hit.html b/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Hit.html new file mode 100644 index 0000000000..215188c9ed --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Hit.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::Raycast::Hit struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Ray.html b/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Ray.html new file mode 100644 index 0000000000..1c823687d3 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Raycast_1_1Ray.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::Raycast::Ray struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderDepth.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderDepth.html new file mode 100644 index 0000000000..9cff9dbfe1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderDepth.html @@ -0,0 +1,131 @@ + + + + + cubos::engine::RenderDepth struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderEnvironment.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderEnvironment.html new file mode 100644 index 0000000000..9c325714ad --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderEnvironment.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::RenderEnvironment struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderMesh.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderMesh.html new file mode 100644 index 0000000000..cad0b8140b --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderMesh.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::RenderMesh struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshPool_1_1BucketId.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshPool_1_1BucketId.html new file mode 100644 index 0000000000..1190bce1e7 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshPool_1_1BucketId.html @@ -0,0 +1,169 @@ + + + + + cubos::engine::RenderMeshPool::BucketId struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderMeshPool::BucketId struct + +

+

Identifies a bucket in the pool.

+ +
+

Public static variables

+
+
+ static const BucketId Invalid +
+
Invalid bucket identifier.
+
+
+
+

Public functions

+
+
+ auto operator==(const BucketId& other) const -> bool defaulted +
+
Compares two bucket identifiers for equality.
+
+
+
+

Public variables

+
+
+ std::size_t inner +
+
Bucket identifier.
+
+
+
+

Function documentation

+
+

+ bool cubos::engine::RenderMeshPool::BucketId::operator==(const BucketId& other) const defaulted +

+

Compares two bucket identifiers for equality.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther bucket identifier.
ReturnsWhether the two bucket identifiers are equal.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshVertex.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshVertex.html new file mode 100644 index 0000000000..f490286208 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderMeshVertex.html @@ -0,0 +1,219 @@ + + + + + cubos::engine::RenderMeshVertex struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderMeshVertex struct + +

+

Vertex data type stored in the RenderMeshPool's vertex buffer.

+ +
+

Public static functions

+
+
+ static auto addVertexElements(const char* position, + const char* normal, + const char* material, + std::size_t bufferIndex, + core::gl::VertexArrayDesc& desc) -> bool +
+
Generates a vertex element description for this vertex type.
+
+ static void generate(const VoxelGrid& grid, + std::vector<RenderMeshVertex>& vertices) +
+
Generates a vertex mesh for the given voxel grid.
+
+
+
+

Public variables

+
+
+ glm::u8vec3 position +
+
Vertex position within the mesh.
+
+ glm::uint8 normal +
+
Vertex normal (0 for +X, 1 for -X, 2 for +Y, 3 for -Y, 4 for +Z, 5 for -Z).
+
+ glm::uint32 material +
+
Vertex material.
+
+
+
+

Function documentation

+
+

+ static bool cubos::engine::RenderMeshVertex::addVertexElements(const char* position, + const char* normal, + const char* material, + std::size_t bufferIndex, + core::gl::VertexArrayDesc& desc) +

+

Generates a vertex element description for this vertex type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
positionPosition attribute name in the pipeline.
normalNormal attribute name in the pipeline.
materialMaterial attribute name in the pipeline.
bufferIndexIndex of the vertex buffer where the elements will be stored.
descVertex array description to add the elements to.
ReturnsWhether the vertex elements fitted in the vertex array description.
+

Assumes a vertex buffer stores this and only this type, as an array of ivec2, where the x component is the positionAndSize, and the colorAndNormal is the y component.

+
+
+

+ static void cubos::engine::RenderMeshVertex::generate(const VoxelGrid& grid, + std::vector<RenderMeshVertex>& vertices) +

+

Generates a vertex mesh for the given voxel grid.

+ + + + + + + + + + + + + + +
Parameters
gridVoxel grid.
vertices outVertices generated from the voxel grid.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderPalette.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderPalette.html new file mode 100644 index 0000000000..c075967d77 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderPalette.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::RenderPalette struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderPicker.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderPicker.html new file mode 100644 index 0000000000..869f528bfb --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderPicker.html @@ -0,0 +1,182 @@ + + + + + cubos::engine::RenderPicker struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderPicker struct + +

+

Component which provides a texture to store entity/gizmo ids, for selection with a mouse.

+ +
+

Public functions

+
+
+ auto read(unsigned int x, + unsigned int y) const -> uint32_t +
+
Reads the identifier at the given pixel coordinates.
+
+
+
+

Public variables

+
+
+ glm::uvec2 size +
+
Size of the RenderPicker textures, in pixels.
+
+ bool cleared +
+
Whether the RenderPicker front texture has already been cleared this frame.
+
+ core::gl::Texture2D backTexture +
+
Picking back texture, stores entity/gizmo ids for each pixel on the screen. Access to the picker results is made through this texture, to ensure the CPU doesn't wait for the current frame to finish.
+
+ core::gl::Texture2D frontTexture +
+
Picking front texture, stores entity/gizmo ids for each pixel on the screen. This is the texture used by the renderer to write ids. It is automatically swapped with the back texture by the renderPickerPlugin.
+
+ core::gl::PixelPackBuffer pixelBuffer +
+
Pixel pack buffer used to access the data in the backTexture.
+
+
+
+

Function documentation

+
+

+ uint32_t cubos::engine::RenderPicker::read(unsigned int x, + unsigned int y) const +

+

Reads the identifier at the given pixel coordinates.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
xX coordinate.
yY coordinate.
ReturnsIdentifier.
+ +
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderTarget.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderTarget.html new file mode 100644 index 0000000000..37d833b9b7 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderTarget.html @@ -0,0 +1,132 @@ + + + + + cubos::engine::RenderTarget struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderTarget struct + +

+

Component which represents a render target.

+ +

If the framebuffer is set to nullptr, the target will be assumed to be the window. In that case, the size will be automatically updated to the window's size.

+
+

Public variables

+
+
+ glm::uvec2 size +
+
Size of the target texture, in pixels.
+
+ core::gl::Framebuffer framebuffer +
+
Framebuffer to render to.
+
+ bool cleared +
+
Whether the target has been already cleared this frame.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderTargetDefaults.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderTargetDefaults.html new file mode 100644 index 0000000000..8d9c5a4aeb --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderTargetDefaults.html @@ -0,0 +1,163 @@ + + + + + cubos::engine::RenderTargetDefaults struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderTargetDefaults struct + +

+

Component which replaces itself by the default render target components to an entity.

+ +
+

Public variables

+
+
+ RenderTarget target +
+
Target component.
+
+ HDR hdr +
+
HDR component.
+
+ GBuffer gBuffer +
+
GBuffer component.
+
+ RenderPicker picker +
+
Picker component.
+
+ RenderDepth depth +
+
Depth component.
+
+ GBufferRasterizer gBufferRasterizer +
+
GBuffer Rasterizer component.
+
+ SSAO ssao +
+
SSAO component.
+
+ ToneMapping toneMapping +
+
Tone Mapping component.
+
+ DeferredShading deferredShading +
+
Deferred Shading component.
+
+ core::memory::Opt<SplitScreen> splitScreen +
+
SplitScreen component.
+
+ core::memory::Opt<Bloom> bloom +
+
Bloom component.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1RenderVoxelGrid.html b/preview/pr-1379/structcubos_1_1engine_1_1RenderVoxelGrid.html new file mode 100644 index 0000000000..4e5189e1e9 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1RenderVoxelGrid.html @@ -0,0 +1,138 @@ + + + + + cubos::engine::RenderVoxelGrid struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::RenderVoxelGrid struct + +

+

Component used to draw voxel grids.

+ +

When added to an entity, the grid may not be able to be rendered immediately, as the asset must load first, and the necessary data must be sent to the GPU. A LoadRenderVoxels component is automatically added to the entity by an observer, which can be used to track the grid's loading progress. When the grid is loaded, the task is removed.

If the grid is changed, in order to update the rendering, a new LoadRenderVoxels component must be added to the entity, manually.

+
+

Public variables

+
+
+ Asset<VoxelGrid> asset +
+
Handle to the grid asset to be rendered.
+
+ glm::vec3 offset +
+
Translation applied to the grid.
+
+
+
+

Variable documentation

+
+

+ Asset<VoxelGrid> cubos::engine::RenderVoxelGrid::asset +

+

Handle to the grid asset to be rendered.

+

When null, no grid will be rendered.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Rotation.html b/preview/pr-1379/structcubos_1_1engine_1_1Rotation.html new file mode 100644 index 0000000000..dbeec541fa --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Rotation.html @@ -0,0 +1,166 @@ + + + + + cubos::engine::Rotation struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Rotation struct + +

+

Component which assigns a rotation to an entity.

+ + +
+

Public static functions

+
+
+ static auto lookingAt(glm::vec3 direction, + glm::vec3 up = {0.0F, 1.0F, 0.0F}) -> Rotation +
+
Returns a rotation component looking at the given direction.
+
+
+
+

Public variables

+
+
+ glm::quat quat +
+
Rotation of the entity.
+
+
+
+

Function documentation

+
+

+ static Rotation cubos::engine::Rotation::lookingAt(glm::vec3 direction, + glm::vec3 up = {0.0F, 1.0F, 0.0F}) +

+

Returns a rotation component looking at the given direction.

+ + + + + + + + + + + + + + + + + + + + +
Parameters
directionDirection to look at.
upUp vector.
ReturnsRotation component.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1SSAO.html b/preview/pr-1379/structcubos_1_1engine_1_1SSAO.html new file mode 100644 index 0000000000..c51a9b0b46 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1SSAO.html @@ -0,0 +1,151 @@ + + + + + cubos::engine::SSAO struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::SSAO struct + +

+

Component which stores the SSAO textures for a render target.

+ +
+

Public variables

+
+
+ glm::uvec2 size +
+
Size of the SSAO textures, in pixels.
+
+ int samples +
+
Number of samples to use.
+
+ float radius +
+
Radius parameter.
+
+ float bias +
+
Bias parameter.
+
+ core::gl::Framebuffer baseFramebuffer +
+
Framebuffer used to draw to the base SSAO texture.
+
+ core::gl::Framebuffer blurFramebuffer +
+
Framebuffer used to draw to the base SSAO texture.
+
+ core::gl::Texture2D baseTexture +
+
SSAO base texture.
+
+ core::gl::Texture2D blurTexture +
+
SSAO blurred texture.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Scale.html b/preview/pr-1379/structcubos_1_1engine_1_1Scale.html new file mode 100644 index 0000000000..3ce1d19dbc --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Scale.html @@ -0,0 +1,124 @@ + + + + + cubos::engine::Scale struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Scene.html b/preview/pr-1379/structcubos_1_1engine_1_1Scene.html new file mode 100644 index 0000000000..5096588dd5 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Scene.html @@ -0,0 +1,128 @@ + + + + + cubos::engine::Scene struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::Scene struct + +

+

Asset equivalent to ECS blueprints - a bundle of entities and their components.

+ +

Scene assets produce a blueprint when loaded which can be used to spawn them. Entity names in the resulting blueprint follow the format "foo", "import1.bar", "import1.import2.baz", etc.

+
+

Public variables

+
+
+ core::ecs::Blueprint blueprint +
+
Resulting blueprint which contains all the entities of the scene and its imported scenes. If you want to spawn the scene, use this blueprint.
+
+ std::unordered_map<std::string, Asset<Scene>> imports +
+
Handles to other scenes that are imported by this scene, mapped by their import names. Imports of imports ar not included in this map.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Selection.html b/preview/pr-1379/structcubos_1_1engine_1_1Selection.html new file mode 100644 index 0000000000..cb37ad19ec --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Selection.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::Selection struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlasRasterizer.html b/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlasRasterizer.html new file mode 100644 index 0000000000..56e334f506 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlasRasterizer.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::ShadowAtlasRasterizer struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlas_1_1Slot.html b/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlas_1_1Slot.html new file mode 100644 index 0000000000..396703db24 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ShadowAtlas_1_1Slot.html @@ -0,0 +1,173 @@ + + + + + cubos::engine::ShadowAtlas::Slot struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::ShadowAtlas::Slot struct + +

+

Slot for a shadow map in the shadow atlas.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Slot(glm::vec2 size, + glm::vec2 offset, + int casterId) +
+
Constructs.
+
+
+
+

Public variables

+
+
+ glm::vec2 size +
+
Shadow map size, in normalized coordinates.
+
+ glm::vec2 offset +
+
Shadow map offset, in normalized coordinates.
+
+ int casterId +
+
Id of the shadow caster (-1 if none).
+
+
+
+

Function documentation

+
+

+ cubos::engine::ShadowAtlas::Slot::Slot(glm::vec2 size, + glm::vec2 offset, + int casterId) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
sizeShadow map size, in normalized coordinates.
offsetShadow map offset, in normalized coordinates.
casterIdId of the shadow caster (-1 if none).
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ShadowCaster.html b/preview/pr-1379/structcubos_1_1engine_1_1ShadowCaster.html new file mode 100644 index 0000000000..f1b454929d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ShadowCaster.html @@ -0,0 +1,131 @@ + + + + + cubos::engine::ShadowCaster struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1SplitScreen.html b/preview/pr-1379/structcubos_1_1engine_1_1SplitScreen.html new file mode 100644 index 0000000000..9a0e7781fa --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1SplitScreen.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::SplitScreen struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1SpotLight.html b/preview/pr-1379/structcubos_1_1engine_1_1SpotLight.html new file mode 100644 index 0000000000..df60c8864c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1SpotLight.html @@ -0,0 +1,139 @@ + + + + + cubos::engine::SpotLight struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::SpotLight struct + +

+

Component which makes an entity emit a spot light in the direction of its local forward vector.

+ +
+

Public variables

+
+
+ glm::vec3 color +
+
Color of the light.
+
+ float intensity +
+
Intensity of the light.
+
+ float range +
+
Range of the light.
+
+ float spotAngle +
+
Angle of the spot light in degrees.
+
+ float innerSpotAngle +
+
Angle of the spot light in degrees.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1SpotShadowCaster.html b/preview/pr-1379/structcubos_1_1engine_1_1SpotShadowCaster.html new file mode 100644 index 0000000000..a5f39457b6 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1SpotShadowCaster.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::SpotShadowCaster struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1ToneMapping.html b/preview/pr-1379/structcubos_1_1engine_1_1ToneMapping.html new file mode 100644 index 0000000000..c0f8f53922 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1ToneMapping.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::ToneMapping struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Torque.html b/preview/pr-1379/structcubos_1_1engine_1_1Torque.html new file mode 100644 index 0000000000..1efe295909 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Torque.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::Torque struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UICanvas.html b/preview/pr-1379/structcubos_1_1engine_1_1UICanvas.html new file mode 100644 index 0000000000..20fa048585 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UICanvas.html @@ -0,0 +1,131 @@ + + + + + cubos::engine::UICanvas struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIColorRect.html b/preview/pr-1379/structcubos_1_1engine_1_1UIColorRect.html new file mode 100644 index 0000000000..57c6252a61 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIColorRect.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::UIColorRect struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Command.html b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Command.html new file mode 100644 index 0000000000..a908cb49b8 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Command.html @@ -0,0 +1,139 @@ + + + + + cubos::engine::UIDrawList::Command struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIDrawList::Command struct + +

+

Describes a UI draw instruction.

+ +
+

Public variables

+
+
+ cubos::core::gl::VertexArray vertexArray +
+
Vertex array handle.
+
+ size_t vertexOffset +
+
Index of the first vertex to be drawn.
+
+ size_t vertexCount +
+
Number of vertexes to draw.
+
+ cubos::core::gl::Sampler samplers +
+
Samplers.
+
+ cubos::core::gl::Texture2D textures +
+
Textures.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Entry.html b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Entry.html new file mode 100644 index 0000000000..1f4d6b6bec --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Entry.html @@ -0,0 +1,194 @@ + + + + + cubos::engine::UIDrawList::Entry struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIDrawList::Entry struct + +

+

Describes a draw commands and how it fits into the draw list carrying it.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Entry(const Type& commandType) explicit +
+
Constructs.
+
+ Entry(const Type& commandType, + Command drawCommand, + size_t dataOffset) +
+
Constructs.
+
+
+
+

Public variables

+
+
+ const Type& type +
+
Command type.
+
+ Command command +
+
UI draw command.
+
+ size_t offset +
+
Position of the command data in the draw list.
+
+
+
+

Function documentation

+
+

+ cubos::engine::UIDrawList::Entry::Entry(const Type& commandType) explicit +

+

Constructs.

+ + + + + + + + + + +
Parameters
commandTypeCommand type.
+
+
+

+ cubos::engine::UIDrawList::Entry::Entry(const Type& commandType, + Command drawCommand, + size_t dataOffset) +

+

Constructs.

+ + + + + + + + + + + + + + + + + + +
Parameters
commandTypeCommand type.
drawCommandUI draw command.
dataOffsetPosition of the command data in the draw list.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Type.html b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Type.html new file mode 100644 index 0000000000..aad2cad807 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIDrawList_1_1Type.html @@ -0,0 +1,149 @@ + + + + + cubos::engine::UIDrawList::Type struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIDrawList::Type struct + +

+

Describes a UI draw call type.

+ +
+

Constructors, destructors, conversion operators

+
+
+ Type() +
+
Constructs.
+
+
+
+

Public variables

+
+
+ cubos::core::gl::ShaderPipeline pipeline +
+
Handle to shader pipeline.
+
+ cubos::core::gl::ConstantBuffer constantBuffer +
+
Handle to the constant buffer to hold the per element data.
+
+ cubos::core::gl::ShaderBindingPoint constantBufferBindingPoint +
+
Binding point of the element data.
+
+ size_t perElementSize +
+
Size of the struct holding the element data.
+
+ cubos::core::gl::ShaderBindingPoint texBindingPoint +
+
Textures binding points.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIElement.html b/preview/pr-1379/structcubos_1_1engine_1_1UIElement.html new file mode 100644 index 0000000000..e8d79d2c1c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIElement.html @@ -0,0 +1,311 @@ + + + + + cubos::engine::UIElement struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIElement struct + +

+

Component which defines the space an element of the UI occupies as a rect.

+ +
+

Public functions

+
+
+ auto bottomLeftCorner() const -> glm::vec2 +
+
Gets global position of the bottom left corner of the element.
+
+ auto topRightCorner() const -> glm::vec2 +
+
Gets global position of the top right corner of the element.
+
+ auto drawUntyped(const UIDrawList::Type& type, + const core::gl::VertexArray& vertexArray, + size_t vertexOffset, + size_t vertexCount, + const void* data) -> UIDrawList::EntryBuilder +
+
Adds new entry to the draw list, with undefined data type.
+
+
template<typename T>
+ auto draw(const UIDrawList::Type& type, + const core::gl::VertexArray& vertexArray, + size_t vertexOffset, + size_t vertexCount, + const T& data) -> UIDrawList::EntryBuilder +
+
Adds new entry to the draw list, with a defined data type.
+
+
+
+

Public variables

+
+
+ glm::vec2 offset +
+
Offset of the pivot.
+
+ glm::vec2 size +
+
Size of the element.
+
+ glm::vec2 pivot +
+
Relative position of the pivot to the element itself.
+
+ glm::vec2 anchor +
+
Relative position of the pivot to the parent element.
+
+ int layer +
+
Rendering order layer.
+
+ glm::vec2 position +
+
Global position of the pivot.
+
+ int hierarchyDepth +
+
Depth in hierarchy. Used for depth sorting.
+
+ UIDrawList drawList +
+
Draw list holding draw commands from this element.
+
+
+
+

Function documentation

+
+

+ glm::vec2 cubos::engine::UIElement::bottomLeftCorner() const +

+

Gets global position of the bottom left corner of the element.

+ + + + + + + +
ReturnsPosition value in global coordinates.
+
+
+

+ glm::vec2 cubos::engine::UIElement::topRightCorner() const +

+

Gets global position of the top right corner of the element.

+ + + + + + + +
ReturnsPosition value in global coordinates.
+
+
+

+ UIDrawList::EntryBuilder cubos::engine::UIElement::drawUntyped(const UIDrawList::Type& type, + const core::gl::VertexArray& vertexArray, + size_t vertexOffset, + size_t vertexCount, + const void* data) +

+

Adds new entry to the draw list, with undefined data type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameters
typeCommand type.
vertexArrayVertex array handle.
vertexOffsetIndex of the first vertex to be drawn.
vertexCountNumber of vertexes to draw.
dataUntyped command data.
ReturnsA builder for the created entry.
+
+
+

+
+ template<typename T> +
+ UIDrawList::EntryBuilder cubos::engine::UIElement::draw(const UIDrawList::Type& type, + const core::gl::VertexArray& vertexArray, + size_t vertexOffset, + size_t vertexCount, + const T& data) +

+

Adds new entry to the draw list, with a defined data type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Template parameters
TCommand data type.
Parameters
typeCommand type.
vertexArrayVertex array handle.
vertexOffsetIndex of the first vertex to be drawn.
vertexCountNumber of vertexes to draw.
dataTyped command data.
ReturnsA builder for the created entry.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIExpand.html b/preview/pr-1379/structcubos_1_1engine_1_1UIExpand.html new file mode 100644 index 0000000000..db93554437 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIExpand.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::UIExpand struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIExpand struct + +

+

Component which makes a UI canvas scale to maintain proportions, choosing the dimension which reduces the element sizes on screen.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIHorizontalStretch.html b/preview/pr-1379/structcubos_1_1engine_1_1UIHorizontalStretch.html new file mode 100644 index 0000000000..08406a9329 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIHorizontalStretch.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::UIHorizontalStretch struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIImage.html b/preview/pr-1379/structcubos_1_1engine_1_1UIImage.html new file mode 100644 index 0000000000..aa5734b7bd --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIImage.html @@ -0,0 +1,137 @@ + + + + + cubos::engine::UIImage struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::UIImage struct + +

+

Component used to draw images on the UI.

+ +
+

Public variables

+
+
+ Asset<Image> asset +
+
Handle to the image asset to be rendered.
+
+ cubos::core::gl::Texture2D texture +
+
Handle to the generated 2D texture.
+
+
+
+

Variable documentation

+
+

+ Asset<Image> cubos::engine::UIImage::asset +

+

Handle to the image asset to be rendered.

+

When null, no image will be rendered.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIKeepPixelSize.html b/preview/pr-1379/structcubos_1_1engine_1_1UIKeepPixelSize.html new file mode 100644 index 0000000000..b24d514c0d --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIKeepPixelSize.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::UIKeepPixelSize struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIMatchHeight.html b/preview/pr-1379/structcubos_1_1engine_1_1UIMatchHeight.html new file mode 100644 index 0000000000..cc36ca733c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIMatchHeight.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::UIMatchHeight struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIMatchWidth.html b/preview/pr-1379/structcubos_1_1engine_1_1UIMatchWidth.html new file mode 100644 index 0000000000..277fae2f12 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIMatchWidth.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::UIMatchWidth struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UINativeAspectRatio.html b/preview/pr-1379/structcubos_1_1engine_1_1UINativeAspectRatio.html new file mode 100644 index 0000000000..dcc33ae110 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UINativeAspectRatio.html @@ -0,0 +1,123 @@ + + + + + cubos::engine::UINativeAspectRatio struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1UIVerticalStretch.html b/preview/pr-1379/structcubos_1_1engine_1_1UIVerticalStretch.html new file mode 100644 index 0000000000..47febfa8f1 --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1UIVerticalStretch.html @@ -0,0 +1,127 @@ + + + + + cubos::engine::UIVerticalStretch struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1Velocity.html b/preview/pr-1379/structcubos_1_1engine_1_1Velocity.html new file mode 100644 index 0000000000..6f8861dfcf --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1Velocity.html @@ -0,0 +1,104 @@ + + + + + cubos::engine::Velocity struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1VoxelCollisionShape_1_1BoxShiftPair.html b/preview/pr-1379/structcubos_1_1engine_1_1VoxelCollisionShape_1_1BoxShiftPair.html new file mode 100644 index 0000000000..8f19b36d4c --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1VoxelCollisionShape_1_1BoxShiftPair.html @@ -0,0 +1,103 @@ + + + + + cubos::engine::VoxelCollisionShape::BoxShiftPair struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/structcubos_1_1engine_1_1VoxelMaterial.html b/preview/pr-1379/structcubos_1_1engine_1_1VoxelMaterial.html new file mode 100644 index 0000000000..1baf0d22be --- /dev/null +++ b/preview/pr-1379/structcubos_1_1engine_1_1VoxelMaterial.html @@ -0,0 +1,170 @@ + + + + + cubos::engine::VoxelMaterial struct | Cubos Docs + + + + + + + +
+
+
+
+
+

+ cubos::engine::VoxelMaterial struct + +

+

Describes a voxel material.

+ +
+

Public static variables

+
+
+ static const VoxelMaterial Empty +
+
Empty material, used for voxels with index 0.
+
+
+
+

Public functions

+
+
+ auto similarity(const VoxelMaterial& other) const -> float +
+
Compares this material with another and returns a number which indicates how similar they are.
+
+
+
+

Public variables

+
+
+ glm::vec4 color +
+
Color of the material.
+
+
+
+

Function documentation

+
+

+ float cubos::engine::VoxelMaterial::similarity(const VoxelMaterial& other) const +

+

Compares this material with another and returns a number which indicates how similar they are.

+ + + + + + + + + + + + + + + + +
Parameters
otherOther material to compare with.
ReturnsSimilarity between the two materials.
+

The number is in the range [0, 1], where 0 means they are completely different and 1 means they are exactly the same.

+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/structtesseratos_1_1AssetSelectedEvent.html b/preview/pr-1379/structtesseratos_1_1AssetSelectedEvent.html new file mode 100644 index 0000000000..591b395fbe --- /dev/null +++ b/preview/pr-1379/structtesseratos_1_1AssetSelectedEvent.html @@ -0,0 +1,123 @@ + + + + + tesseratos::AssetSelectedEvent struct | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/system_2arguments_2world_8hpp.html b/preview/pr-1379/system_2arguments_2world_8hpp.html new file mode 100644 index 0000000000..35bc88406d --- /dev/null +++ b/preview/pr-1379/system_2arguments_2world_8hpp.html @@ -0,0 +1,124 @@ + + + + + core/ecs/system/arguments/world.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/system_2fetcher_8hpp.html b/preview/pr-1379/system_2fetcher_8hpp.html new file mode 100644 index 0000000000..ee5de8061b --- /dev/null +++ b/preview/pr-1379/system_2fetcher_8hpp.html @@ -0,0 +1,139 @@ + + + + + core/ecs/system/fetcher.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/fetcher.hpp file +

+

Class cubos::core::ecs::SystemFetcher.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SystemContext +
+
Context passed by the system caller to the fetchers.
+
+
template<typename T>
+ class cubos::core::ecs::SystemFetcher +
+
Type meant to be specialized which implements for each argument type the necessary logic to extract it from the world.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/system_2registry_8hpp.html b/preview/pr-1379/system_2registry_8hpp.html new file mode 100644 index 0000000000..81fb0673ab --- /dev/null +++ b/preview/pr-1379/system_2registry_8hpp.html @@ -0,0 +1,142 @@ + + + + + core/ecs/system/registry.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/registry.hpp file +

+

Class cubos::core::ecs::SystemRegistry.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SystemId +
+
Identifies a system.
+
+ struct cubos::core::ecs::ConditionId +
+
Identifies a condition.
+
+ class cubos::core::ecs::SystemRegistry +
+
Stores known systems and conditions.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/system_8hpp.html b/preview/pr-1379/system_8hpp.html new file mode 100644 index 0000000000..5737265281 --- /dev/null +++ b/preview/pr-1379/system_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/system/system.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/table_2dense_2registry_8hpp.html b/preview/pr-1379/table_2dense_2registry_8hpp.html new file mode 100644 index 0000000000..207a90f134 --- /dev/null +++ b/preview/pr-1379/table_2dense_2registry_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/table/dense/registry.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/table_2sparse__relation_2id_8hpp.html b/preview/pr-1379/table_2sparse__relation_2id_8hpp.html new file mode 100644 index 0000000000..c0806eb782 --- /dev/null +++ b/preview/pr-1379/table_2sparse__relation_2id_8hpp.html @@ -0,0 +1,140 @@ + + + + + core/ecs/table/sparse_relation/id.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/sparse_relation/id.hpp file +

+

Struct cubos::core::ecs::SparseRelationTableId.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::reflection
+
Reflection module.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::SparseRelationTableId +
+
Identifies a sparse relation table.
+
+ struct cubos::core::ecs::SparseRelationTableIdHash +
+
Hash functor for SparseRelationTableId.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/table_2sparse__relation_2registry_8hpp.html b/preview/pr-1379/table_2sparse__relation_2registry_8hpp.html new file mode 100644 index 0000000000..9b3f2ff0be --- /dev/null +++ b/preview/pr-1379/table_2sparse__relation_2registry_8hpp.html @@ -0,0 +1,138 @@ + + + + + core/ecs/table/sparse_relation/registry.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/table/sparse_relation/registry.hpp file +

+

Class cubos::core::ecs::SparseRelationTableRegistry.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::SparseRelationTableRegistry +
+
Stores all of the sparse relation tables.
+
+ class cubos::core::ecs::SparseRelationTableRegistry::TypeIndex +
+
Stores the ids of tables of a given type.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/tables_8hpp.html b/preview/pr-1379/tables_8hpp.html new file mode 100644 index 0000000000..bbbb2c7568 --- /dev/null +++ b/preview/pr-1379/tables_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/ecs/table/tables.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tag_8hpp.html b/preview/pr-1379/tag_8hpp.html new file mode 100644 index 0000000000..3ff0366f8e --- /dev/null +++ b/preview/pr-1379/tag_8hpp.html @@ -0,0 +1,172 @@ + + + + + core/ecs/system/tag.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/system/tag.hpp file +

+

Class cubos::core::ecs::Tag.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::Tag +
+
Represents a tag to be used with the Cubos class.
+
+
+
+

Defines

+
+
+ #define CUBOS_DEFINE_TAG(tag) +
+
Utility used to define tags more easily.
+
+
+
+

Define documentation

+
+

+ #define CUBOS_DEFINE_TAG(tag) +

+

Utility used to define tags more easily.

+ + + + + + + + + + +
Parameters
tagTag type.
+
// in file.hpp
+namespace my
+{
+    cubos::core::ecs::Tag MyTag;
+}
+
+// in file.cpp
+CUBOS_DEFINE_TAG(my::MyTag);
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/task_8hpp.html b/preview/pr-1379/task_8hpp.html new file mode 100644 index 0000000000..1f7abe7e3d --- /dev/null +++ b/preview/pr-1379/task_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/thread/task.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tcp__listener_8hpp.html b/preview/pr-1379/tcp__listener_8hpp.html new file mode 100644 index 0000000000..658453e1c6 --- /dev/null +++ b/preview/pr-1379/tcp__listener_8hpp.html @@ -0,0 +1,132 @@ + + + + + core/net/tcp_listener.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tcp__stream_8hpp.html b/preview/pr-1379/tcp__stream_8hpp.html new file mode 100644 index 0000000000..2c50ff9a61 --- /dev/null +++ b/preview/pr-1379/tcp__stream_8hpp.html @@ -0,0 +1,132 @@ + + + + + core/net/tcp_stream.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/term_8hpp.html b/preview/pr-1379/term_8hpp.html new file mode 100644 index 0000000000..917310942d --- /dev/null +++ b/preview/pr-1379/term_8hpp.html @@ -0,0 +1,158 @@ + + + + + core/ecs/query/term.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/query/term.hpp file +

+

Struct cubos::core::ecs::QueryTerm.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::QueryTerm +
+
Describes a term in a query.
+
+ struct cubos::core::ecs::QueryTerm::Entity +
+
Stores entity term data.
+
+ struct cubos::core::ecs::QueryTerm::Component +
+
Stores component term data.
+
+ struct cubos::core::ecs::QueryTerm::Relation +
+
Stores relation term data.
+
+
+
+

Enums

+
+
+ enum class Traversal { Random, + Down, + Up } +
+
Possible traversal types for tree relation terms.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/tone__mapping_8hpp.html b/preview/pr-1379/tone__mapping_8hpp.html new file mode 100644 index 0000000000..4b8e3775a1 --- /dev/null +++ b/preview/pr-1379/tone__mapping_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/tone_mapping/tone_mapping.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/toolbox_8hpp.html b/preview/pr-1379/toolbox_8hpp.html new file mode 100644 index 0000000000..d040faf531 --- /dev/null +++ b/preview/pr-1379/toolbox_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/tools/toolbox/toolbox.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2asset__explorer_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2asset__explorer_2plugin_8hpp.html new file mode 100644 index 0000000000..6dbec1f511 --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2asset__explorer_2plugin_8hpp.html @@ -0,0 +1,140 @@ + + + + + tesseratos/asset_explorer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2debugger_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2debugger_2plugin_8hpp.html new file mode 100644 index 0000000000..fa46e810cf --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2debugger_2plugin_8hpp.html @@ -0,0 +1,130 @@ + + + + + tesseratos/debugger/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2importer_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2importer_2plugin_8hpp.html new file mode 100644 index 0000000000..35467145ce --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2importer_2plugin_8hpp.html @@ -0,0 +1,130 @@ + + + + + tesseratos/importer/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2project_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2project_2plugin_8hpp.html new file mode 100644 index 0000000000..56495684f2 --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2project_2plugin_8hpp.html @@ -0,0 +1,130 @@ + + + + + tesseratos/project/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2scene__editor_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2scene__editor_2plugin_8hpp.html new file mode 100644 index 0000000000..79dc3f0ec3 --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2scene__editor_2plugin_8hpp.html @@ -0,0 +1,130 @@ + + + + + tesseratos/scene_editor/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2voxel__palette__editor_2plugin_8hpp.html b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2voxel__palette__editor_2plugin_8hpp.html new file mode 100644 index 0000000000..f3e42a1bc3 --- /dev/null +++ b/preview/pr-1379/tools_2tesseratos_2src_2tesseratos_2voxel__palette__editor_2plugin_8hpp.html @@ -0,0 +1,130 @@ + + + + + tesseratos/voxel_palette_editor/plugin.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/torque_8hpp.html b/preview/pr-1379/torque_8hpp.html new file mode 100644 index 0000000000..d883d43095 --- /dev/null +++ b/preview/pr-1379/torque_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/torque.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/tracing_8hpp.html b/preview/pr-1379/tracing_8hpp.html new file mode 100644 index 0000000000..36d400d8d1 --- /dev/null +++ b/preview/pr-1379/tracing_8hpp.html @@ -0,0 +1,163 @@ + + + + + core/tel/tracing.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/tel/tracing.hpp file +

+

Tracing macros.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
+
+
+

Classes

+
+
+ struct cubos::core::tel::SpanId +
+
Uniquely identifies a span.
+
+ class cubos::core::tel::SpanGuard +
+
A guard object that automatically ends the current span when it goes out of scope.
+
+ class cubos::core::tel::SpanManager +
+
Manages the creation and ending of spans.
+
+
+
+

Defines

+
+
+ #define CUBOS_SPAN(name, + level) +
+
Constructs a new span with a specified level.
+
+ #define CUBOS_SPAN_INFO(name) +
+
Constructs a new info span.
+
+ #define CUBOS_SPAN_DEBUG(name) +
+
Constructs a new debug span.
+
+ #define CUBOS_SPAN_TRACE(name) +
+
Constructs a new trace span.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/type_8hpp.html b/preview/pr-1379/type_8hpp.html new file mode 100644 index 0000000000..58b152d159 --- /dev/null +++ b/preview/pr-1379/type_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/type.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/type__client_8hpp.html b/preview/pr-1379/type__client_8hpp.html new file mode 100644 index 0000000000..558c62f993 --- /dev/null +++ b/preview/pr-1379/type__client_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/type_client.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/type__map_8hpp.html b/preview/pr-1379/type__map_8hpp.html new file mode 100644 index 0000000000..97450d3360 --- /dev/null +++ b/preview/pr-1379/type__map_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/memory/type_map.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/type__registry_8hpp.html b/preview/pr-1379/type__registry_8hpp.html new file mode 100644 index 0000000000..54581e13d3 --- /dev/null +++ b/preview/pr-1379/type__registry_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/type_registry.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/type__server_8hpp.html b/preview/pr-1379/type__server_8hpp.html new file mode 100644 index 0000000000..c75f7a8256 --- /dev/null +++ b/preview/pr-1379/type__server_8hpp.html @@ -0,0 +1,134 @@ + + + + + core/reflection/type_server.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/types_8hpp.html b/preview/pr-1379/types_8hpp.html new file mode 100644 index 0000000000..13a8c86acf --- /dev/null +++ b/preview/pr-1379/types_8hpp.html @@ -0,0 +1,142 @@ + + + + + core/ecs/types.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/types.hpp file +

+

Class cubos::core::ecs::Types.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ struct cubos::core::ecs::DataTypeId +
+
Identifies a data type registered in the world.
+
+ struct cubos::core::ecs::DataTypeIdHash +
+
Hash functor for DataTypeId.
+
+ class cubos::core::ecs::Types +
+
Registry of all data types used in an ECS world.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/udp__socket_8hpp.html b/preview/pr-1379/udp__socket_8hpp.html new file mode 100644 index 0000000000..249c74d3fd --- /dev/null +++ b/preview/pr-1379/udp__socket_8hpp.html @@ -0,0 +1,132 @@ + + + + + core/net/udp_socket.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/ui_2image_2image_8hpp.html b/preview/pr-1379/ui_2image_2image_8hpp.html new file mode 100644 index 0000000000..43632d349c --- /dev/null +++ b/preview/pr-1379/ui_2image_2image_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/image/image.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/ui_output.png b/preview/pr-1379/ui_output.png new file mode 100644 index 0000000000..b2836f0837 Binary files /dev/null and b/preview/pr-1379/ui_output.png differ diff --git a/preview/pr-1379/unordered__bimap_8hpp.html b/preview/pr-1379/unordered__bimap_8hpp.html new file mode 100644 index 0000000000..9d12825c85 --- /dev/null +++ b/preview/pr-1379/unordered__bimap_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/memory/unordered_bimap.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/memory/unordered_bimap.hpp file +

+

Class cubos::core::memory::UnorderedBimap.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::memory
+
Memory module.
+
+
+
+

Classes

+
+
+
template<typename L, typename R, typename LHash = std::hash<L>, typename RHash = std::hash<R>>
+ class cubos::core::memory::UnorderedBimap +
+
A bidirectional hash table.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/unordered__map_8hpp.html b/preview/pr-1379/unordered__map_8hpp.html new file mode 100644 index 0000000000..70621e2fee --- /dev/null +++ b/preview/pr-1379/unordered__map_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/unordered_map.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/reflection/external/unordered_map.hpp file +

+

Reflection declaration for std::unordered_map.

+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/util_8hpp.html b/preview/pr-1379/util_8hpp.html new file mode 100644 index 0000000000..1b2d3e3060 --- /dev/null +++ b/preview/pr-1379/util_8hpp.html @@ -0,0 +1,136 @@ + + + + + core/gl/util.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/gl/util.hpp file +

+

Function cubos::core::gl::generateScreenQuad.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::gl
+
Graphics module.
+
+
+
+

Functions

+
+
+ auto generateScreenQuad(RenderDevice& renderDevice, + const ShaderPipeline& pipeline, + VertexArray& va) -> CUBOS_CORE_API void +
+
Creates the resources required to draw a quad that fills the screen and returns its VertexArray.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/uuid_8hpp.html b/preview/pr-1379/uuid_8hpp.html new file mode 100644 index 0000000000..c5a2a31491 --- /dev/null +++ b/preview/pr-1379/uuid_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/uuid.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/vector_8hpp.html b/preview/pr-1379/vector_8hpp.html new file mode 100644 index 0000000000..e6f77e93ec --- /dev/null +++ b/preview/pr-1379/vector_8hpp.html @@ -0,0 +1,102 @@ + + + + + core/reflection/external/vector.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/velocity_8hpp.html b/preview/pr-1379/velocity_8hpp.html new file mode 100644 index 0000000000..691170e8eb --- /dev/null +++ b/preview/pr-1379/velocity_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/physics/components/velocity.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/vertex_8hpp.html b/preview/pr-1379/vertex_8hpp.html new file mode 100644 index 0000000000..443d35838c --- /dev/null +++ b/preview/pr-1379/vertex_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/render/mesh/vertex.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/vertical__stretch_8hpp.html b/preview/pr-1379/vertical__stretch_8hpp.html new file mode 100644 index 0000000000..73b12e5e89 --- /dev/null +++ b/preview/pr-1379/vertical__stretch_8hpp.html @@ -0,0 +1,132 @@ + + + + + engine/ui/canvas/vertical_stretch.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/voxel_8hpp.html b/preview/pr-1379/voxel_8hpp.html new file mode 100644 index 0000000000..27b00088f2 --- /dev/null +++ b/preview/pr-1379/voxel_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/collisions/shapes/voxel.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ engine/collisions/shapes/voxel.hpp file +

+

Component cubos::engine::VoxelCollisionShape.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::engine
+
Engine module.
+
+
+
+

Classes

+
+
+ class cubos::engine::VoxelCollisionShape +
+
Component which adds a collision shape corresponding to a given voxel grid to an entity, used with a Collider component.
+
+ struct cubos::engine::VoxelCollisionShape::BoxShiftPair +
+
Struct which holds a sub-box of the voxel collision shape, and its shift from the center of the shape.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/voxels_2grid_8hpp.html b/preview/pr-1379/voxels_2grid_8hpp.html new file mode 100644 index 0000000000..c185909037 --- /dev/null +++ b/preview/pr-1379/voxels_2grid_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/voxels/grid.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/voxels_2palette_8hpp.html b/preview/pr-1379/voxels_2palette_8hpp.html new file mode 100644 index 0000000000..efc3e1f02b --- /dev/null +++ b/preview/pr-1379/voxels_2palette_8hpp.html @@ -0,0 +1,136 @@ + + + + + engine/voxels/palette.hpp file | Cubos Docs + + + + + + + +
+
+ + + +
+ + diff --git a/preview/pr-1379/voxels_output.png b/preview/pr-1379/voxels_output.png new file mode 100644 index 0000000000..73a8bd9a3e Binary files /dev/null and b/preview/pr-1379/voxels_output.png differ diff --git a/preview/pr-1379/window_8hpp.html b/preview/pr-1379/window_8hpp.html new file mode 100644 index 0000000000..3dfe10e132 --- /dev/null +++ b/preview/pr-1379/window_8hpp.html @@ -0,0 +1,229 @@ + + + + + core/io/window.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/io/window.hpp file +

+

Class cubos::core::io::Window and related types.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::gl
+
Graphics module.
+
namespace cubos::core::io
+
Input and output module.
+
+
+
+

Classes

+
+
+ struct cubos::core::io::KeyEvent +
+
Event sent when a key is pressed or released.
+
+ struct cubos::core::io::ModifiersEvent +
+
Event sent when the modifiers change.
+
+ struct cubos::core::io::MouseButtonEvent +
+
Event sent when a mouse button state changes.
+
+ struct cubos::core::io::MouseMoveEvent +
+
Event sent when the mouse cursor moves.
+
+ struct cubos::core::io::MouseScrollEvent +
+
Event sent when the mouse wheel is scrolled.
+
+ struct cubos::core::io::ResizeEvent +
+
Event sent when the window framebuffer is resized.
+
+ struct cubos::core::io::TextEvent +
+
Event sent when a unicode character is input.
+
+ struct cubos::core::io::GamepadConnectionEvent +
+
Event sent when a gamepad is connected or disconnected.
+
+ class cubos::core::io::BaseWindow +
+
Interface used to wrap low-level window API implementations.
+
+
+
+

Enums

+
+
+ enum class MouseButton { Invalid = -1, + Left, + Right, + Middle, + Extra1, + Extra2 } +
+
Mouse buttons enum.
+
+ enum class MouseAxis { X, + Y, + Scroll } +
+
Mouse axes enums.
+
+ enum class MouseState { Default, + Locked, + Hidden } +
+
Possible mouse states.
+
+
+
+

Typedefs

+
+
+ using WindowEvent = std::variant<KeyEvent, ModifiersEvent, MouseButtonEvent, MouseMoveEvent, MouseScrollEvent, ResizeEvent, TextEvent, GamepadConnectionEvent> +
+
Variant that can hold any of the window events.
+
+ using Window = std::shared_ptr<BaseWindow> +
+
Handle to a window.
+
+
+
+

Functions

+
+
+ auto openWindow(const std::string& title = "Cubos", + const glm::ivec2& size = {800, 600}, + bool vSync = true) -> CUBOS_CORE_API Window +
+
Opens a new window.
+
+ auto mouseButtonToString(MouseButton button) -> CUBOS_CORE_API std::string +
+
Converts a MouseButton enum to a string.
+
+ auto stringToMouseButton(const std::string& str) -> CUBOS_CORE_API MouseButton +
+
Convert a string to a MouseButton enum.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/world_8hpp.html b/preview/pr-1379/world_8hpp.html new file mode 100644 index 0000000000..aa512ac379 --- /dev/null +++ b/preview/pr-1379/world_8hpp.html @@ -0,0 +1,142 @@ + + + + + core/ecs/world.hpp file | Cubos Docs + + + + + + + +
+
+
+
+
+

+ core/ecs/world.hpp file +

+

Class cubos::core::ecs::World.

+ +
+

Namespaces

+
+
namespace cubos
+
Cubos libraries namespace.
+
namespace cubos::core
+
Core namespace.
+
namespace cubos::core::ecs
+
ECS module.
+
+
+
+

Classes

+
+
+ class cubos::core::ecs::World +
+
Holds entities, their components and resources.
+
+ struct cubos::core::ecs::World::Component +
+
Output structure for the iterator.
+
+ struct cubos::core::ecs::World::Relation +
+
Output structure for the iterator.
+
+
+
+
+
+
+ + + +
+ + diff --git a/preview/pr-1379/writer_8hpp.html b/preview/pr-1379/writer_8hpp.html new file mode 100644 index 0000000000..a34882ace7 --- /dev/null +++ b/preview/pr-1379/writer_8hpp.html @@ -0,0 +1,135 @@ + + + + + core/ecs/system/arguments/event/writer.hpp file | Cubos Docs + + + + + + + +
+
+ + + + + +