1use crate::MaterialId;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum MaterialKind {
10 DotGrid,
11 Grid,
12 Checkerboard,
13 Stripe,
14 Noise,
15 Beam,
16 Sparkle,
17 ConicSweep,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
24#[serde(rename_all = "snake_case")]
25pub enum MaterialCatalogTextureKind {
26 BlueNoise64x64R8,
28 Bayer8x8R8,
30}
31
32#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
36#[serde(rename_all = "snake_case")]
37pub enum MaterialBindingShape {
38 #[default]
40 ParamsOnly,
41 ParamsPlusCatalogTexture { texture: MaterialCatalogTextureKind },
43}
44
45#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
49pub struct MaterialDescriptor {
50 pub kind: MaterialKind,
51 #[serde(default)]
52 pub binding: MaterialBindingShape,
53}
54
55impl MaterialDescriptor {
56 pub const fn new(kind: MaterialKind) -> Self {
57 Self {
58 kind,
59 binding: MaterialBindingShape::ParamsOnly,
60 }
61 }
62
63 pub const fn sampled_with_catalog_texture(
64 kind: MaterialKind,
65 texture: MaterialCatalogTextureKind,
66 ) -> Self {
67 Self {
68 kind,
69 binding: MaterialBindingShape::ParamsPlusCatalogTexture { texture },
70 }
71 }
72}
73
74#[derive(Debug, Clone, Copy, PartialEq, Eq)]
75pub enum MaterialRegistrationError {
76 Unsupported,
77}
78
79pub trait MaterialService {
84 fn register_material(
85 &mut self,
86 desc: MaterialDescriptor,
87 ) -> Result<MaterialId, MaterialRegistrationError>;
88
89 fn unregister_material(&mut self, id: MaterialId) -> bool;
90}