use scenix_core::Color;
use crate::{
AlphaMode, FEATURE_SIZE_ATTENUATION, Material, PipelineAlphaMode, PipelineKey, ShaderKind,
};
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PointsMaterial {
pub color: Color,
pub size: f32,
pub size_attenuation: bool,
pub alpha_mode: AlphaMode,
}
impl PointsMaterial {
#[inline]
pub const fn new() -> Self {
Self {
color: Color::WHITE,
size: 1.0,
size_attenuation: true,
alpha_mode: AlphaMode::Opaque,
}
}
}
impl Default for PointsMaterial {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl Material for PointsMaterial {
#[inline]
fn pipeline_key(&self) -> PipelineKey {
let bits = if self.size_attenuation {
FEATURE_SIZE_ATTENUATION
} else {
0
};
let alpha = if self.color.a < 1.0 {
PipelineAlphaMode::Blend
} else {
self.alpha_mode.pipeline_alpha()
};
PipelineKey::new(ShaderKind::Points, alpha, bits)
}
#[inline]
fn is_transparent(&self) -> bool {
self.alpha_mode.is_transparent() || self.color.a < 1.0
}
#[inline]
fn double_sided(&self) -> bool {
true
}
#[inline]
fn alpha_cutoff(&self) -> Option<f32> {
self.alpha_mode.cutoff()
}
}