#![cfg(feature = "gpu")]
use combs_mesh::render::WgpuRenderer;
use combs_mesh::{CpuRenderer, Renderer, SpriteAtlas};
fn atlas() -> SpriteAtlas {
let mut rgba = vec![0u8; 4 * 2 * 4];
let px = |x: usize, y: usize, p: [u8; 4], rgba: &mut Vec<u8>| {
let i = (y * 4 + x) * 4;
rgba[i..i + 4].copy_from_slice(&p);
};
px(0, 0, [255, 0, 0, 255], &mut rgba); px(1, 0, [255, 0, 0, 255], &mut rgba);
px(2, 0, [0, 255, 0, 255], &mut rgba); px(3, 0, [0, 255, 0, 255], &mut rgba);
px(0, 1, [0, 0, 255, 128], &mut rgba); px(1, 1, [0, 0, 255, 128], &mut rgba);
SpriteAtlas {
width: 4,
height: 2,
frame_width: 2,
frame_height: 1,
frame_count: 4,
rgba,
}
}
#[test]
#[ignore = "gpu"]
fn render_frame_parity() {
let atlas = atlas();
let cpu = CpuRenderer::new();
let gpu = WgpuRenderer::new();
for frame in 0..4 {
let c = cpu.render_frame(&atlas, frame).expect("cpu frame");
let g = gpu.render_frame(&atlas, frame).expect("gpu frame");
assert_eq!(c, g, "frame {frame} pixels differ");
}
}
#[test]
#[ignore = "gpu"]
fn compose_parity() {
let atlas = atlas();
let cpu = CpuRenderer::new();
let gpu = WgpuRenderer::new();
let layers: &[(&SpriteAtlas, u32, i32, i32)] = &[
(&atlas, 0, 0, 0), (&atlas, 1, 2, 1), (&atlas, 2, 1, 0), (&atlas, 1, -1, -1), (&atlas, 0, 100, 50), (&atlas, 3, 0, 2), ];
let c = cpu.compose(layers, 8, 8).expect("cpu compose");
let g = gpu.compose(layers, 8, 8).expect("gpu compose");
assert_eq!(c, g, "compose pixels differ");
}
#[test]
#[ignore = "gpu"]
fn compose_empty_canvas_layers() {
let atlas = atlas();
let gpu = WgpuRenderer::new();
let cpu = CpuRenderer::new();
let layers: &[(&SpriteAtlas, u32, i32, i32)] = &[(&atlas, 0, 50, 50)];
let c = cpu.compose(layers, 4, 4).expect("cpu");
let g = gpu.compose(layers, 4, 4).expect("gpu");
assert_eq!(c, g);
assert!(c.iter().all(|&b| b == 0), "expected a transparent canvas");
}