bevy_shader_utils/
lib.rs

1use bevy::{
2    asset::{
3        embedded_asset, load_internal_asset, weak_handle,
4    },
5    prelude::*,
6    render::render_resource::{AsBindGroup, ShaderRef},
7};
8
9// some wgsl from https://gist.github.com/munrocket/236ed5ba7e409b8bdf1ff6eca5dcdc39
10
11// Noise Functions
12
13const PERLIN_NOISE_2D: Handle<Shader> =
14    weak_handle!("990ee5ac-3d4a-4593-841f-6b46f02abcb3");
15pub const PERLIN_NOISE_3D: Handle<Shader> =
16    weak_handle!("70568ff4-c5ca-4411-b099-692926332401");
17pub const SIMPLEX_NOISE_2D: Handle<Shader> =
18    weak_handle!("f6a37262-741d-442e-b990-fb2851253284");
19pub const SIMPLEX_NOISE_3D: Handle<Shader> =
20    weak_handle!("6239ad8c-41e1-4302-8f03-b2e41c154764");
21// pub const FBM: Handle<Shader> =
22// weak_handle!("b84472cd-83dc-4cc2-b18a-021b42d11cb8");
23pub const VORONOISE: Handle<Shader> =
24    weak_handle!("06dc4bde-2702-4fe2-aff5-df69078c4b59");
25// other utility functions
26pub const MOCK_FRESNEL: Handle<Shader> =
27    weak_handle!("294d2ab5-554b-41f2-a1ca-95fb3689c1c3");
28pub const PRISTINE_GRID: Handle<Shader> =
29    weak_handle!("3511cc56-fc6c-44c6-bde3-1591164fbc79");
30
31/// To use the shader utility functions, add the
32/// plugin to your app.
33///
34/// ```rust
35/// use bevy::prelude::*;
36/// use bevy_shader_utils::ShaderUtilsPlugin;
37/// App::new()
38///     .add_plugins((
39///         DefaultPlugins,
40///         ShaderUtilsPlugin,
41///     ));
42/// ```
43///
44/// then import the relevant function in your
45/// shader.
46///
47/// ```ignore
48/// #import bevy_shader_utils::perlin_noise_2d::perlin_noise_2d
49/// ```
50pub struct ShaderUtilsPlugin;
51
52impl Plugin for ShaderUtilsPlugin {
53    fn build(&self, app: &mut App) {
54        // embedded_asset!(
55        //     app,
56        //     "shaders/perlin_noise_2d.wgsl"
57        // );
58        // embedded_asset!(
59        //     app,
60        //     "shaders/perlin_noise_3d.wgsl"
61        // );
62        // embedded_asset!(
63        //     app,
64        //     "shaders/simplex_noise_2d.wgsl"
65        // );
66        // embedded_asset!(
67        //     app,
68        //     "shaders/simplex_noise_3d.wgsl"
69        // );
70        // embedded_asset!(app, "shaders/voronoise.wgsl");
71        // embedded_asset!(app,
72        // "shaders/mock_fresnel.wgsl");
73        // embedded_asset!(app,
74        // "shaders/pristine_grid.wgsl");
75
76        embedded_asset!(
77            app,
78            "materials/pristine_grid.wgsl"
79        );
80
81        load_internal_asset!(
82            app,
83            PERLIN_NOISE_2D,
84            "shaders/perlin_noise_2d.wgsl",
85            Shader::from_wgsl
86        );
87        load_internal_asset!(
88            app,
89            PERLIN_NOISE_3D,
90            "shaders/perlin_noise_3d.wgsl",
91            Shader::from_wgsl
92        );
93        load_internal_asset!(
94            app,
95            SIMPLEX_NOISE_2D,
96            "shaders/simplex_noise_2d.wgsl",
97            Shader::from_wgsl
98        );
99        load_internal_asset!(
100            app,
101            SIMPLEX_NOISE_3D,
102            "shaders/simplex_noise_3d.wgsl",
103            Shader::from_wgsl
104        );
105        load_internal_asset!(
106            app,
107            VORONOISE,
108            "shaders/voronoise.wgsl",
109            Shader::from_wgsl
110        );
111        load_internal_asset!(
112            app,
113            MOCK_FRESNEL,
114            "shaders/mock_fresnel.wgsl",
115            Shader::from_wgsl
116        );
117        load_internal_asset!(
118            app,
119            PRISTINE_GRID,
120            "shaders/pristine_grid.wgsl",
121            Shader::from_wgsl
122        );
123
124        app.add_plugins(MaterialPlugin::<
125            PristineGridMaterial,
126        >::default());
127    }
128}
129
130impl Material for PristineGridMaterial {
131    fn fragment_shader() -> ShaderRef {
132        "embedded://bevy_shader_utils/materials/pristine_grid.wgsl".into()
133    }
134}
135
136// This is the struct that will be passed to your
137// shader
138#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)]
139pub struct PristineGridMaterial {
140    #[uniform(0)]
141    pub color: LinearRgba,
142    #[uniform(0)]
143    pub cell_multiplier: Vec2,
144    #[uniform(0)]
145    pub line_size: Vec2,
146}
147
148impl Default for PristineGridMaterial {
149    fn default() -> Self {
150        Self {
151            color: LinearRgba::WHITE,
152            cell_multiplier: Vec2::splat(10.),
153            line_size: Vec2::splat(0.1),
154        }
155    }
156}