devela/ui/back/miniquad/
namespace.rs

1// devela::ui::back::miniquad::namespace
2//
3//! Defines the [`miniquad!`] macro.
4//
5
6#[cfg(doc)]
7use ::miniquad::{
8    Bindings, BufferId, BufferSource, BufferType, BufferUsage, RenderingBackend, ShaderId,
9    ShaderMeta,
10};
11
12/// A macro for namespaced [`miniquad`][::miniquad] operations.
13///
14/// # Arms
15/// - [`new_buffer`] wrappers:
16///   - new_vertices([`$ctx`], [`$usage`], `&[vertices]`) -> [`BufferId`];
17///   - new_indices([`$ctx`], [`$usage`], `&[indices]`) -> [`BufferId`];
18///   - new_vertices_indices([`$ctx`], [`$usage`], `&[vertices]`, `&[indices]`)
19///     -> ([`BufferId`], [`BufferId`]);
20/// - [`new_shader`] wrappers:
21///   - new_shader([`$ctx`], `&str`, `&str`, `&str`, [`$meta`]) -> [`ShaderId`];
22///   - new_shader_glsl([`$ctx`], `&str`, `&str`, [`$meta`]) -> [`ShaderId`];
23///   - new_shader_msl([`$ctx`], `&str`, [`$meta`]) -> [`ShaderId`];
24/// - [`Bindings`] wrappers:
25///   - bindings(`Vec<`[`BufferId`]`>`, [`BufferId`], `Vec<`[`ShaderId`]`>`) -> [`Bindings`];
26///
27/// [`new_buffer`]: ::miniquad::RenderingBackend::new_buffer
28/// [`$ctx`]: ::miniquad::RenderingBackend
29/// [`$usage`]: ::miniquad::BufferUsage
30/// [`new_shader`]: ::miniquad::RenderingBackend::new_shader
31/// [`$meta`]: ::miniquad::ShaderMeta
32#[doc(hidden)]
33#[macro_export]
34macro_rules! _miniquad {
35    (
36    /* buffers */
37
38    // Creates a vertex buffer resource object.
39    new_vertices($ctx:expr, $(BufferUsage::)?$usage:ident, $vertices:expr)) => { $crate::paste! {
40        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.BufferType.html
41        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.BufferUsage.html
42        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.BufferSource.html
43        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.BufferId.html
44        $ctx.new_buffer(
45            ::miniquad::BufferType::VertexBuffer,
46            ::miniquad::BufferUsage:: [<$usage:camel>],
47            ::miniquad::BufferSource::slice($vertices),
48        )
49    }};
50    (
51    // Creates an index buffer resource object.
52    new_indices($ctx:expr, $usage:ident, $indices:expr)) => { $crate::paste! {
53        $ctx.new_buffer(
54            ::miniquad::BufferType::IndexBuffer,
55            ::miniquad::BufferUsage:: [<$usage:camel>],
56            ::miniquad::BufferSource::slice($indices),
57        )
58    }};
59    (
60    // Creates both a vertex and index buffer resource objects.
61    new_vertices_indices($ctx:expr, $usage:ident, $vertices:expr, $indices:expr)) => {
62        (
63            $crate::miniquad![new_vertices($ctx, $usage, $vertices)],
64            $crate::miniquad![new_indices($ctx, $usage, $indices)],
65        )
66    };
67    (
68    /* shaders */
69
70    // Creates a OpenGL shader buffer resource object.
71    new_shader_glsl($ctx:expr, $vertex:expr, $fragment:expr, $meta:expr)) => {
72        // https://docs.rs/miniquad/latest/miniquad/graphics/trait.RenderingBackend.html#tymethod.new_shader
73        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.ShaderSource.html
74        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.ShaderMeta.html
75        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.ShaderId.html
76        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.ShaderError.html
77        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.ShaderType.html
78        $ctx.new_shader(
79            ::miniquad::ShaderSource::Glsl { vertex: $vertex, fragment: $fragment },
80            $meta
81        )
82    };
83    (
84    // Creates a Metal shader buffer resource object.
85    new_shader_msl($ctx:expr, $msl:expr, $meta:expr)) => {
86        $ctx.new_shader(::miniquad::ShaderSource::Msl { program: $msl }, $meta)
87    };
88    (
89    // Creates a Glsl or Metal shader buffer resource object, depending on the backend.
90    new_shader($ctx:expr, $vertex:expr, $fragment:expr, $msl:expr, $meta:expr)) => {
91        match $ctx.info().backend {
92           ::miniquad::Backend::OpenGl =>
93               $crate::miniquad![new_shader_glsl($ctx, $vertex, $fragment, $meta)],
94           ::miniquad::Backend::Metal =>
95               $crate::miniquad![new_shader_msl($ctx, $msl, $meta)],
96        }
97    };
98    (
99    /* bindings */
100
101    // Constructs Bindings.
102    bindings($vertex_buffers:expr, $index_buffer:expr, $images:expr) ) => {
103        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.Bindings.html
104        ::miniquad::Bindings {
105            vertex_buffers: $vertex_buffers, index_buffer: $index_buffer, images: $images
106        }
107    };
108    /*
109    (
110    // THINK MAYBE too complex
111    /* pipelines */
112
113    // Creates a new pipeline.
114    //
115    // ($ctx: RenderingBackend, $vertex: &str, $fragment: &str, $meta:ShaderMeta)
116    new_pipeline($ctx:expr, $msl:expr, $meta:expr)) => {
117        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.BufferLayout.html
118        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.VertexAttribute.html
119        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.PipelineParams.html
120    };
121    */
122    /*
123    (
124    // RETHINK: Maybe a helper for TextureParams?
125    /* textures */
126
127    new_texture($ctx:expr, $access:expr, $data:expr, $params)) => {
128        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.TextureAccess.html
129        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.TextureSource.html
130        // https://docs.rs/miniquad/latest/miniquad/graphics/struct.TextureParams.html
131    };
132    (
133    new_render_texture($ctx:expr, $w:expr, $h:expr, $fmt:exp, $mag:expr, $min:$inter, …)) => {
134        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.TextureKind.html
135        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.TextureFormat.html
136        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.TextureWrap.html
137        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.FilterMode.html
138        // https://docs.rs/miniquad/latest/miniquad/graphics/enum.MipmapFilterMode.html
139    };
140    */
141}
142#[doc(inline)]
143pub use _miniquad as miniquad;
144
145// https://docs.rs/miniquad/latest/miniquad/graphics/struct.TextureId.html
146
147// new_texture
148// https://docs.rs/miniquad/latest/miniquad/graphics/trait.RenderingBackend.html#tymethod.new_texture
149
150// new_render_texture
151//
152// https://docs.rs/miniquad/latest/miniquad/graphics/trait.RenderingBackend.html#method.new_render_texture
153// self.new_texture(TextureAccess::RenderTarget, TextureSource::Empty, params)
154
155// new_texture_from_data_and_format…
156// new_texture_from_rgba8
157//
158
159// new_shader_glsl($ctx:ident, $vertex:expr, $fragment:expr, $meta:expr)
160//     // -> Result<ShaderId, ShaderError>