#![allow(clippy::type_complexity, clippy::unwrap_or_default)]
mod kvasir;
mod material;
pub use material::{MaterialGraph, MaterialCompiler, CompiledMaterial, MaterialOp, MaterialError};
pub use material::builtins;
pub mod types;
pub mod vertex;
pub mod renderer;
mod surtr_util;
mod draw;
mod api;
pub mod heim;
pub use heim::SundrPacker;
#[cfg(test)]
mod tests {
use super::*;
use super::heim::SundrPacker;
#[test]
fn test_shelf_packer_basic() {
let mut packer = SundrPacker::new(100, 100);
assert_eq!(packer.pack(10, 10), Some((0, 0)));
assert_eq!(packer.pack(20, 15), Some((10, 0)));
}
#[test]
fn test_shelf_packer_wrap() {
let mut packer = SundrPacker::new(100, 100);
packer.pack(60, 10);
assert_eq!(packer.pack(50, 20), Some((0, 10)));
}
#[test]
fn test_parse_svg_animations() {
let svg = r##"
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="spinner">
<animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="2s" />
</g>
<circle id="pulse">
<animate attributeName="opacity" from="0.5" to="1.0" dur="0.5s" />
</circle>
<!-- Edge cases: xlink:href, ms suffix, values list -->
<rect>
<animate xlink:href="#myRect" attributeName="x" values="10; 20; 30" dur="500ms" />
</rect>
</svg>
"##;
let anims = draw::parse_svg_animations(svg.as_bytes());
assert_eq!(anims.len(), 3);
assert_eq!(anims[0].target_id, "spinner");
assert_eq!(anims[0].attribute_name, "transform");
assert_eq!(anims[0].duration, 2.0);
assert_eq!(anims[0].from_val, 0.0);
assert_eq!(anims[0].to_val, 360.0);
assert_eq!(anims[1].target_id, "pulse");
assert_eq!(anims[1].attribute_name, "opacity");
assert_eq!(anims[1].duration, 0.5);
assert_eq!(anims[1].from_val, 0.5);
assert_eq!(anims[1].to_val, 1.0);
assert_eq!(anims[2].target_id, "myRect");
assert_eq!(anims[2].attribute_name, "x");
assert_eq!(anims[2].duration, 0.5); assert_eq!(anims[2].from_val, 10.0);
assert_eq!(anims[2].to_val, 30.0);
}
#[test]
fn test_shelf_packer_full() {
let mut packer = SundrPacker::new(10, 10);
assert_eq!(packer.pack(11, 5), None);
assert_eq!(packer.pack(5, 11), None);
}
}
pub(crate) const WGSL_SRC: &str = concat!(
include_str!("shaders/common.wgsl"),
include_str!("shaders/shapes.wgsl"),
include_str!("shaders/bifrost.wgsl"),
include_str!("shaders/bloom.wgsl"),
include_str!("shaders/color_blind.wgsl"),
include_str!(concat!(env!("OUT_DIR"), "/materials_generated.wgsl"))
);
pub(crate) const WGSL_OPAQUE: &str = concat!(
include_str!("shaders/common.wgsl"),
include_str!("shaders/material_opaque.wgsl"),
include_str!("shaders/bifrost.wgsl"),
include_str!("shaders/bloom.wgsl"),
include_str!("shaders/color_blind.wgsl"),
include_str!(concat!(env!("OUT_DIR"), "/materials_generated.wgsl"))
);
pub(crate) const WGSL_GLASS: &str = concat!(
include_str!("shaders/common.wgsl"),
include_str!("shaders/material_glass.wgsl"),
include_str!("shaders/bifrost.wgsl"),
include_str!("shaders/bloom.wgsl"),
include_str!("shaders/color_blind.wgsl"),
include_str!(concat!(env!("OUT_DIR"), "/materials_generated.wgsl"))
);
pub mod color_blindness;
pub use color_blindness::ColorBlindMode;
pub use accesskit::{
ActionHandler, ActionRequest, ActivationHandler, DeactivationHandler, Node, NodeId, Role, Tree,
TreeId, TreeUpdate,
};
pub use accesskit_winit::Adapter as ShieldWallAdapter;
pub use cvkg_core::{ColorTheme, SceneUniforms};
pub use renderer::SurtrRenderer;
pub use types::{SvgModel, SvgAnimation};
pub use vertex::{Vertex, InstanceData};