code wiki / (root) / nx_multi_body_test.nx

nx_multi_body_test.nx source

↩ module page · 67 lines · 2291 B

1// nx_multi_body_test.nx -- smoke for multi-subject presence. 2// T1: empty -> NO_BODY. T2: 25x25 torso -> SOLO. T3: two 30x50 -> TWO_BODY. 3 4import "nx_syscalls.nx" 5import "nx_image.nx" 6import "nx_multi_body.nx" 7 8func fill_rect_skin(img: *Image, x0: i64, y0: i64, x1: i64, y1: i64) -> i64 { 9 var y: i64 = y0 10 while y < y1 { 11 var x: i64 = x0 12 while x < x1 { 13 nx_image_set(img, x, y, 0, 200) 14 nx_image_set(img, x, y, 1, 150) 15 nx_image_set(img, x, y, 2, 130) 16 x = x + 1 17 } 18 y = y + 1 19 } 20 return 0 21} 22 23func fill_black(img: *Image) -> i64 { 24 var y: i64 = 0 25 while y < img.height { 26 var x: i64 = 0 27 while x < img.width { 28 nx_image_set(img, x, y, 0, 0); nx_image_set(img, x, y, 1, 0); nx_image_set(img, x, y, 2, 0) 29 x = x + 1 30 } 31 y = y + 1 32 } 33 return 0 34} 35 36func main() -> i64 { 37 let v: *MultiBodyVerdict = (sys_mmap(64)) as *MultiBodyVerdict 38 39 // T1: empty 128x128 -> NO_BODY 40 let img1: *Image = nx_image_alloc(128, 128, 3) 41 fill_black(img1) 42 nx_multi_body_compute(img1, v) 43 if v.kind != NX_MB_NO_BODY { return 1 } 44 if v.skin_region_count != 0 { return 2 } 45 46 // T2: single 25x25 torso 2025 px > major_floor 800 -> SOLO 47 let img2: *Image = nx_image_alloc(128, 128, 3) 48 fill_black(img2) 49 fill_rect_skin(img2, 40, 40, 85, 85) 50 nx_multi_body_compute(img2, v) 51 if v.kind != NX_MB_SOLO { return 10 } 52 if v.skin_region_count != 1 { return 11 } 53 if v.largest_area < 2000 { return 12 } 54 55 // T3: two separated 30x50 bodies -> TWO_BODY 56 let img3: *Image = nx_image_alloc(128, 128, 3) 57 fill_black(img3) 58 fill_rect_skin(img3, 10, 30, 40, 80) 59 fill_rect_skin(img3, 60, 30, 90, 80) 60 nx_multi_body_compute(img3, v) 61 if v.kind != NX_MB_TWO_BODY { return 20 } 62 if v.skin_region_count != 2 { return 21 } 63 if v.largest_area < 1400 { return 22 } 64 if v.second_area < 1400 { return 23 } 65 66 return 0 67}