use bevy::prelude::*;
use bevy::render::render_resource::{DynamicUniformBuffer, ShaderType};
pub type ColorMode = u32;
pub const COLOR_MODE_RGB: ColorMode = 0;
pub const COLOR_MODE_SCALAR_HUE: ColorMode = 1;
#[derive(Clone, Component, Copy, Eq, Hash, PartialEq)]
pub struct CuboidMaterialId(pub usize);
#[derive(Clone, Debug, ShaderType)]
pub struct CuboidMaterial {
pub color_mode: ColorMode,
pub wireframe: u32,
#[align(16)]
pub scalar_hue: ScalarHueOptions,
pub emissive_gain: Vec3,
}
impl Default for CuboidMaterial {
fn default() -> Self {
Self {
color_mode: COLOR_MODE_RGB,
wireframe: default(),
scalar_hue: default(),
emissive_gain: Vec3::splat(30.0),
}
}
}
#[derive(Clone, Debug, ShaderType)]
pub struct ScalarHueOptions {
pub min_visible: f32,
pub max_visible: f32,
pub clamp_min: f32,
pub clamp_max: f32,
pub hue_zero: f32,
pub hue_slope: f32,
pub lightness: f32,
pub saturation: f32,
}
impl Default for ScalarHueOptions {
fn default() -> Self {
Self {
min_visible: 0.0,
max_visible: 1000.0,
clamp_min: 0.0,
clamp_max: 1000.0,
hue_zero: 240.0,
hue_slope: -300.0,
lightness: 0.5,
saturation: 1.0,
}
}
}
#[derive(Clone, Debug, Resource)]
pub struct CuboidMaterialMap {
materials: Vec<CuboidMaterial>,
}
impl Default for CuboidMaterialMap {
fn default() -> Self {
Self {
materials: vec![default()],
}
}
}
impl CuboidMaterialMap {
pub fn is_empty(&self) -> bool {
self.materials.is_empty()
}
pub fn clear(&mut self) {
self.materials.clear();
}
pub fn get(&self, id: CuboidMaterialId) -> &CuboidMaterial {
&self.materials[id.0]
}
pub fn get_mut(&mut self, id: CuboidMaterialId) -> &mut CuboidMaterial {
&mut self.materials[id.0]
}
pub fn push(&mut self, material: CuboidMaterial) -> CuboidMaterialId {
let id = CuboidMaterialId(self.materials.len());
self.materials.push(material);
id
}
pub(crate) fn write_uniforms(
&self,
uniforms: &mut DynamicUniformBuffer<CuboidMaterial>,
) -> Vec<CuboidMaterialUniformIndex> {
uniforms.clear();
let mut indices = Vec::new();
for material in self.materials.iter() {
indices.push(CuboidMaterialUniformIndex(uniforms.push(material.clone())));
}
indices
}
}
#[derive(Clone, Copy, Debug, Component)]
pub(crate) struct CuboidMaterialUniformIndex(pub u32);