1#![allow(
25 clippy::type_complexity,
26 clippy::unwrap_or_default,
27 dead_code,
28 unused_variables,
29 unused_imports,
30 unused_mut,
31 unused_parens
32)]
33
34mod kvasir;
35mod material;
36
37pub use material::builtins;
39pub use material::{CompiledMaterial, MaterialCompiler, MaterialError, MaterialGraph, MaterialOp};
40
41pub mod accessibility;
42pub mod ai;
43mod api;
44pub mod draw;
45pub mod filter;
46pub mod passes;
47pub mod pyramid;
48pub mod renderer;
49mod surtr_util;
50pub mod types;
51pub mod vertex;
52
53pub mod heim;
54pub use heim::SkylinePacker;
55
56pub mod subsystems;
60pub use subsystems::RendererConfig;
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 use super::heim::SkylinePacker;
67
68 #[test]
69 fn test_shelf_packer_basic() {
70 let mut packer = SkylinePacker::new(100, 100);
71 assert_eq!(packer.pack(10, 10), Some((0, 0)));
72 assert_eq!(packer.pack(20, 15), Some((10, 0)));
73 }
74
75 #[test]
76 fn test_shelf_packer_wrap() {
77 let mut packer = SkylinePacker::new(100, 100);
78 packer.pack(60, 10);
79 assert_eq!(packer.pack(50, 20), Some((0, 10)));
80 }
81
82 #[test]
83 fn test_parse_svg_animations() {
84 let svg = r##"
85 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
86 <g id="spinner">
87 <animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="2s" />
88 </g>
89 <circle id="pulse">
90 <animate attributeName="opacity" from="0.5" to="1.0" dur="0.5s" />
91 </circle>
92 <!-- Edge cases: xlink:href, ms suffix, values list -->
93 <rect>
94 <animate xlink:href="#myRect" attributeName="x" values="10; 20; 30" dur="500ms" />
95 </rect>
96 </svg>
97 "##;
98 let anims = draw::parse_svg_animations(svg.as_bytes());
99 assert_eq!(anims.len(), 3);
100
101 assert_eq!(anims[0].target_id, "spinner");
102 assert_eq!(anims[0].keyframe_values, vec![0.0, 360.0]);
103
104 assert_eq!(anims[1].target_id, "pulse");
105 assert_eq!(anims[1].attribute_name, "opacity");
106 assert_eq!(anims[1].duration, 0.5);
107 assert_eq!(anims[1].keyframe_values, vec![0.5, 1.0]);
108
109 assert_eq!(anims[2].target_id, "myRect");
110 assert_eq!(anims[2].attribute_name, "x");
111 assert_eq!(anims[2].duration, 0.5); assert_eq!(anims[2].keyframe_values, vec![10.0, 20.0, 30.0]);
113 }
114
115 #[test]
116 fn test_shelf_packer_full() {
117 let mut packer = SkylinePacker::new(10, 10);
118 assert_eq!(packer.pack(11, 5), None);
119 assert_eq!(packer.pack(5, 11), None);
120 }
121}
122
123#[cfg(target_arch = "wasm32")]
131pub(crate) const WGSL_COMMON: &str = include_str!("shaders/common_wasm.wgsl");
132#[cfg(not(target_arch = "wasm32"))]
133pub(crate) const WGSL_COMMON: &str = include_str!("shaders/common.wgsl");
134
135pub(crate) const WGSL_SHAPES: &str = include_str!("shaders/shapes.wgsl");
136
137#[cfg(target_arch = "wasm32")]
138pub(crate) const WGSL_MATERIAL_OPAQUE: &str = include_str!("shaders/material_opaque_wasm.wgsl");
139#[cfg(not(target_arch = "wasm32"))]
140pub(crate) const WGSL_MATERIAL_OPAQUE: &str = include_str!("shaders/material_opaque.wgsl");
141
142pub(crate) const WGSL_MATERIAL_GLASS: &str = include_str!("shaders/material_glass.wgsl");
143pub(crate) const WGSL_BIFROST: &str = include_str!("shaders/bifrost.wgsl");
144
145#[cfg(target_arch = "wasm32")]
146pub(crate) const WGSL_BLOOM: &str = include_str!("shaders/bloom_wasm.wgsl");
147#[cfg(not(target_arch = "wasm32"))]
148pub(crate) const WGSL_BLOOM: &str = include_str!("shaders/bloom.wgsl");
149
150pub(crate) const WGSL_COLOR_BLIND: &str = include_str!("shaders/color_blind.wgsl");
151pub(crate) const WGSL_TONEMAP: &str = include_str!("shaders/tonemap.wgsl");
152pub(crate) const WGSL_PARTICLES: &str = include_str!("shaders/particles.wgsl");
153
154pub mod color_blindness;
155
156pub use color_blindness::ColorBlindMode;
158
159pub use accesskit::{
162 ActionHandler, ActionRequest, ActivationHandler, DeactivationHandler, Node, NodeId, Role, Tree,
163 TreeId, TreeUpdate,
164};
165pub use accesskit_winit::Adapter as ShieldWallAdapter;
166
167pub use cvkg_core::{ColorTheme, SceneUniforms};
169
170pub use renderer::GpuRenderer;
171
172pub use types::{SvgAnimation, SvgModel};
174pub use vertex::{InstanceData, Vertex};