1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//! Macros that make it easier to load resources.
//!
//! All require the [crate::start_engine] macro to be executed before usage.
//!
//! All the macros are just a shortening of `any Resource`::new(data, &[Resources](crate::prelude::Resources)).

/// Loads a model to the engine using the vertex and index data of the inserted
/// [Data](crate::prelude::Data) and returns a [Model](crate::prelude::Model).
#[macro_export]
macro_rules! model {
    ($data:expr) => {{
        let_engine::prelude::Model::new($data, &RESOURCES)
    }};
}

/// Loads a font to the engine using binary true type font data of the inserted
/// `&[u8]` and returns an [`Option<Font>`](crate::prelude::Font).
///
/// Returns `None` in case the provided bytes don't work.
#[macro_export]
macro_rules! font {
    ($data:expr) => {{
        let_engine::prelude::Font::from_bytes($data, &RESOURCES)
    }};
}

/// Loads a texture to the engine using one of
/// the supported file formats and returns a [Texture](crate::prelude::Texture).
#[macro_export]
macro_rules! texture {
    (
        $data:expr,
        $image_format:expr,
        $settings:expr,
    ) => {{
        let_engine::prelude::Texture::from_bytes($data, $image_format, 1, $settings, &RESOURCES)
    }};
    (
        $data:expr,
        $image_format:expr,
        $layers:expr,
        $settings:expr,
    ) => {{
        let_engine::prelude::Texture::from_bytes(
            $data,
            $image_format,
            $layers,
            $settings,
            &RESOURCES,
        )
    }};
}

/// Loads a texture to the engine using raw image bytes and context and returns a [Texture](crate::prelude::Texture).
#[macro_export]
macro_rules! texture_from_raw {
    (
        $data:expr,
        $dimensions:expr,
        $format:expr,
        $settings:expr,
    ) => {{
        let_engine::prelude::Texture::from_raw(
            $data,
            $dimensions,
            $format,
            1,
            $settings,
            &RESOURCES,
        )
    }};
    (
        $data:expr,
        $dimensions:expr,
        $format:expr,
        $layers:expr,
        $settings:expr,
    ) => {{
        let_engine::prelude::Texture::from_raw(
            $data,
            $dimensions,
            $format,
            $layers,
            $settings,
            &RESOURCES,
        )
    }};
}

/// Loads a shader from glsl bytes. Takes `&[u8]` and returns [Shaders](crate::materials::Shaders).
/// Those shaders can be used when making materials.
///
/// # Safety
///
/// Doesn't validate the rightness of the given data.
/// Crashes the program in case the bytes provided aren't spirv.
#[macro_export]
macro_rules! raw_shader {
    (
        $vertex_data:expr,
        $fragment_data:expr,
    ) => {{
        let_engine::prelude::Shaders::from_bytes($vertex_data, $fragment_data, &RESOURCES)
    }};
}

/// Loads a new material.
#[macro_export]
macro_rules! material {
    (
        $settings:expr,
    ) => {{
        let_engine::prelude::Material::new($settings, &RESOURCES)
    }};
    (
        $settings:expr,
        $shaders:expr,
        $descriptor_bindings:expr,
    ) => {{
        let_engine::prelude::Material::new_with_shaders(
            $settings,
            $shaders,
            $descriptor_bindings,
            &RESOURCES,
        )
    }};
}

/// Describes a write operation for a descriptor.
/// Used with materials to interact with custom shaders inside them.
#[macro_export]
macro_rules! write_descriptor {
    (
        $buf:expr,
        $set:expr,
    ) => {{
        RESOURCES.new_descriptor_write($buf, $set)
    }};
}