use std::collections::HashSet;
use noesis_runtime::render_device::types::Shader;
use crate::custom_shader::PixelShaderKind;
#[must_use]
#[allow(clippy::too_many_lines)] pub fn defines_for_shader(shader: Shader) -> Option<HashSet<&'static str>> {
let mut d: HashSet<&'static str> = HashSet::new();
match shader.0 {
n if n == Shader::RGBA.0 => {
d.insert("EFFECT_RGBA");
}
n if n == Shader::MASK.0 => {
d.insert("EFFECT_MASK");
}
n if n == Shader::CLEAR.0 => {
d.insert("EFFECT_CLEAR");
}
n if n == Shader::PATH_SOLID.0 => {
d.insert("HAS_COLOR");
d.insert("PAINT_SOLID");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_SOLID.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_COVERAGE");
d.insert("PAINT_SOLID");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN.0 => {
d.insert("HAS_UV0");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("PAINT_PATTERN_PLAIN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("PAINT_PATTERN_PLAIN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN_CLAMP.0 => {
d.insert("HAS_UV0");
d.insert("HAS_RECT");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("CLAMP_PATTERN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN_CLAMP.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_RECT");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("CLAMP_PATTERN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN_REPEAT.0 => {
d.insert("HAS_UV0");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("REPEAT_PATTERN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN_REPEAT.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("REPEAT_PATTERN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN_MIRROR_U.0 => {
d.insert("HAS_UV0");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORU_PATTERN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN_MIRROR_U.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORU_PATTERN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN_MIRROR_V.0 => {
d.insert("HAS_UV0");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORV_PATTERN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN_MIRROR_V.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORV_PATTERN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_PATTERN_MIRROR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRROR_PATTERN");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_PATTERN_MIRROR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRROR_PATTERN");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_LINEAR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_LINEAR");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_LINEAR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_LINEAR");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::PATH_RADIAL.0 => {
d.insert("HAS_UV0");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_RADIAL");
d.insert("EFFECT_PATH");
}
n if n == Shader::PATH_AA_RADIAL.0 => {
d.insert("HAS_UV0");
d.insert("HAS_COVERAGE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("PAINT_RADIAL");
d.insert("EFFECT_PATH_AA");
}
n if n == Shader::SDF_SOLID.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV1");
d.insert("HAS_ST1");
d.insert("HAS_GLYPHS_TEXTURE");
d.insert("PAINT_SOLID");
d.insert("EFFECT_SDF");
}
n if n == Shader::SDF_LINEAR.0 => {
d.extend(SDF_PAINT);
d.insert("PAINT_LINEAR");
}
n if n == Shader::SDF_RADIAL.0 => {
d.extend(SDF_PAINT);
d.insert("PAINT_RADIAL");
}
n if n == Shader::SDF_PATTERN.0 => {
d.extend(SDF_PAINT);
d.extend(["PAINT_PATTERN", "PAINT_PATTERN_PLAIN"]);
}
n if n == Shader::SDF_PATTERN_CLAMP.0 => {
d.extend(SDF_PAINT);
d.extend(["HAS_RECT", "PAINT_PATTERN", "CLAMP_PATTERN"]);
}
n if n == Shader::SDF_PATTERN_REPEAT.0 => {
d.extend(SDF_PAINT);
d.extend(["HAS_RECT", "HAS_TILE", "PAINT_PATTERN", "REPEAT_PATTERN"]);
}
n if n == Shader::SDF_PATTERN_MIRROR_U.0 => {
d.extend(SDF_PAINT);
d.extend(["HAS_RECT", "HAS_TILE", "PAINT_PATTERN", "MIRRORU_PATTERN"]);
}
n if n == Shader::SDF_PATTERN_MIRROR_V.0 => {
d.extend(SDF_PAINT);
d.extend(["HAS_RECT", "HAS_TILE", "PAINT_PATTERN", "MIRRORV_PATTERN"]);
}
n if n == Shader::SDF_PATTERN_MIRROR.0 => {
d.extend(SDF_PAINT);
d.extend(["HAS_RECT", "HAS_TILE", "PAINT_PATTERN", "MIRROR_PATTERN"]);
}
n if n == Shader::SDF_LCD_SOLID.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV1");
d.insert("HAS_ST1");
d.insert("HAS_GLYPHS_TEXTURE");
d.insert("PAINT_SOLID");
d.insert("EFFECT_SDF_LCD");
}
n if n == Shader::OPACITY_SOLID.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV1");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_SOLID");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_LINEAR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_LINEAR");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_RADIAL.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_RADIAL");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("PAINT_PATTERN_PLAIN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN_CLAMP.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("CLAMP_PATTERN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN_REPEAT.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("REPEAT_PATTERN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN_MIRROR_U.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORU_PATTERN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN_MIRROR_V.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRRORV_PATTERN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::OPACITY_PATTERN_MIRROR.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_TILE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("PAINT_PATTERN");
d.insert("MIRROR_PATTERN");
d.insert("EFFECT_OPACITY");
}
n if n == Shader::DOWNSAMPLE.0 => {
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("DOWNSAMPLE");
d.insert("HAS_PAINT_TEXTURE");
d.insert("EFFECT_DOWNSAMPLE");
}
n if n == Shader::UPSAMPLE.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV0");
d.insert("HAS_UV1");
d.insert("HAS_PAINT_TEXTURE");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("EFFECT_UPSAMPLE");
}
n if n == Shader::SHADOW.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV1");
d.insert("HAS_RECT");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("HAS_SHADOW_TEXTURE");
d.insert("HAS_CBUFFER1_PS");
d.insert("PAINT_SOLID");
d.insert("EFFECT_SHADOW");
}
n if n == Shader::BLUR.0 => {
d.insert("HAS_COLOR");
d.insert("HAS_UV1");
d.insert("HAS_IMAGE_TEXTURE");
d.insert("HAS_SHADOW_TEXTURE");
d.insert("HAS_CBUFFER1_PS");
d.insert("PAINT_SOLID");
d.insert("EFFECT_BLUR");
}
_ => return None,
}
Some(d)
}
const SDF_PAINT: [&str; 6] = [
"HAS_UV0",
"HAS_UV1",
"HAS_ST1",
"HAS_PAINT_TEXTURE",
"HAS_GLYPHS_TEXTURE",
"EFFECT_SDF",
];
const PATTERN_FETCH: [&str; 6] = [
"PAINT_PATTERN_PLAIN",
"CLAMP_PATTERN",
"REPEAT_PATTERN",
"MIRRORU_PATTERN",
"MIRRORV_PATTERN",
"MIRROR_PATTERN",
];
#[must_use]
pub fn defines_for_custom(
shader: Shader,
kind: PixelShaderKind,
constants: bool,
) -> Option<HashSet<&'static str>> {
let mut d = match kind {
PixelShaderKind::Brush => {
let mut d = defines_for_shader(shader)?;
if !d.contains("PAINT_PATTERN") {
return None;
}
for define in PATTERN_FETCH {
d.remove(define);
}
d.insert("CUSTOM_PATTERN");
d
}
PixelShaderKind::Effect => {
if shader != Shader::CUSTOM_EFFECT {
return None;
}
HashSet::from([
"HAS_COLOR",
"HAS_UV0",
"HAS_RECT",
"HAS_IMAGE_POS",
"HAS_PAINT_TEXTURE",
"PAINT_SOLID",
"EFFECT_CUSTOM",
])
}
};
d.insert("CUSTOM_SHADER");
if constants {
d.insert("CUSTOM_CONSTANTS");
}
Some(d)
}