test_s2d_primitive.c (5963B)
1 /* Copyright (C) 2016-2021, 2023 |Méso|Star> (contact@meso-star.com) 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "s2d.h" 17 #include "test_s2d_utils.h" 18 19 #include <rsys/float2.h> 20 21 #define NSAMPS 4096 22 23 int 24 main(int argc, char** argv) 25 { 26 struct mem_allocator allocator; 27 struct s2d_attrib attr; 28 struct s2d_primitive prim; 29 struct s2d_vertex_data vdata; 30 struct s2d_device* dev; 31 struct s2d_scene* scn; 32 struct s2d_scene_view* scnview; 33 struct s2d_shape* shape; 34 size_t nprims; 35 unsigned square_id; 36 float tmp[2]; 37 float length; 38 float s; 39 int i; 40 (void)argc, (void)argv; 41 42 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 43 44 CHK(s2d_device_create(NULL, &allocator, 1, &dev) == RES_OK); 45 CHK(s2d_scene_create(dev, &scn) == RES_OK); 46 CHK(s2d_shape_create_line_segments(dev, &shape) == RES_OK); 47 CHK(s2d_shape_get_id(shape, &square_id) == RES_OK); 48 CHK(s2d_scene_attach_shape(scn, shape) == RES_OK); 49 50 vdata.usage = S2D_POSITION; 51 vdata.type = S2D_FLOAT2; 52 vdata.get = line_segments_get_position; 53 CHK(s2d_line_segments_setup_indexed_vertices 54 (shape, square_nsegs, line_segments_get_ids, square_nverts, &vdata, 1, 55 (void*)&square_desc) == RES_OK); 56 57 CHK(s2d_scene_view_create(scn, S2D_SAMPLE, &scnview) == RES_OK); 58 CHK(s2d_scene_view_sample(scnview, 0, 0, &prim, &s) == RES_OK); 59 CHK(s2d_scene_view_ref_put(scnview) == RES_OK); 60 61 #define GET_ATTRIB s2d_primitive_get_attrib 62 CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, 2, NULL) == RES_BAD_ARG); 63 CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, 2, NULL) == RES_BAD_ARG); 64 CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, s, NULL) == RES_BAD_ARG); 65 CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, s, NULL) == RES_BAD_ARG); 66 CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, 2, &attr) == RES_BAD_ARG); 67 CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, 2, &attr) == RES_BAD_ARG); 68 CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, s, &attr) == RES_BAD_ARG); 69 CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, s, &attr) == RES_BAD_ARG); 70 CHK(GET_ATTRIB(NULL, S2D_POSITION, 2, NULL) == RES_BAD_ARG); 71 CHK(GET_ATTRIB(&prim, S2D_POSITION, 2, NULL) == RES_BAD_ARG); 72 CHK(GET_ATTRIB(NULL, S2D_POSITION, s, NULL) == RES_BAD_ARG); 73 CHK(GET_ATTRIB(&prim, S2D_POSITION, s, NULL) == RES_BAD_ARG); 74 CHK(GET_ATTRIB(NULL, S2D_POSITION, 2, &attr) == RES_BAD_ARG); 75 CHK(GET_ATTRIB(&prim, S2D_POSITION, 2, &attr) == RES_BAD_ARG); 76 CHK(GET_ATTRIB(NULL, S2D_POSITION, s, &attr) == RES_BAD_ARG); 77 CHK(GET_ATTRIB(&prim, S2D_POSITION, s, &attr) == RES_OK); 78 CHK(attr.type == S2D_FLOAT2); 79 CHK(attr.usage == S2D_POSITION); 80 81 CHK(GET_ATTRIB(&prim, S2D_GEOMETRY_NORMAL, s, &attr) == RES_OK); 82 f2_normalize(attr.value, attr.value); 83 switch(prim.prim_id) { 84 case 0: CHK(f2_eq_eps(attr.value, f2(tmp, 0.f, 1.f), 1.e-6f) == 1); break; 85 case 1: CHK(f2_eq_eps(attr.value, f2(tmp, 1.f, 0.f), 1.e-6f) == 1); break; 86 case 2: CHK(f2_eq_eps(attr.value, f2(tmp, 0.f,-1.f), 1.e-6f) == 1); break; 87 case 3: CHK(f2_eq_eps(attr.value, f2(tmp,-1.f, 0.f), 1.e-6f) == 1); break; 88 default: CHK(0 == 1); /* Invalid primitive id */ 89 } 90 91 CHK(GET_ATTRIB(&S2D_PRIMITIVE_NULL, S2D_GEOMETRY_NORMAL, s, &attr) 92 == RES_BAD_ARG); 93 #undef GET_ATTRIB 94 95 CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK); 96 CHK(s2d_scene_view_primitives_count(scnview, &nprims) == RES_OK); 97 CHK(nprims == 4); 98 99 CHK(s2d_primitive_compute_length(NULL, NULL) == RES_BAD_ARG); 100 CHK(s2d_primitive_compute_length(&prim, NULL) == RES_BAD_ARG); 101 CHK(s2d_primitive_compute_length(NULL, &length) == RES_BAD_ARG); 102 CHK(s2d_primitive_compute_length(&prim, &length) == RES_OK); 103 CHK(eq_epsf(length, 2, 1.e-6f) == 1); 104 105 CHK(s2d_primitive_sample(NULL, 2.f, NULL) == RES_BAD_ARG); 106 CHK(s2d_primitive_sample(&prim, 2.f, NULL) == RES_BAD_ARG); 107 CHK(s2d_primitive_sample(NULL, 0.5f, NULL) == RES_BAD_ARG); 108 CHK(s2d_primitive_sample(&prim, 0.5f, NULL) == RES_BAD_ARG); 109 CHK(s2d_primitive_sample(NULL, 2.f, &s) == RES_BAD_ARG); 110 CHK(s2d_primitive_sample(&prim, 2.f, &s) == RES_BAD_ARG); 111 CHK(s2d_primitive_sample(NULL, 0.5f, &s) == RES_BAD_ARG); 112 CHK(s2d_primitive_sample(&prim, 0.5f, &s) == RES_OK); 113 CHK(eq_epsf(s, 0.5f, 1.e-6f)); 114 115 FOR_EACH(i, 0, NSAMPS) { 116 CHK(s2d_primitive_sample(&prim, rand_canonic(), &s) == RES_OK); 117 CHK(s >= 0.f); 118 CHK(s <= 1.f); 119 } 120 121 CHK(s2d_scene_view_get_primitive(scnview, 0, &prim) == RES_OK); 122 123 #define GET_VERTEX_ATTR s2d_segment_get_vertex_attrib 124 CHK(GET_VERTEX_ATTR(NULL, 0, S2D_POSITION, &attr) == RES_BAD_ARG); 125 CHK(GET_VERTEX_ATTR(&prim, 2, S2D_POSITION, &attr) == RES_BAD_ARG); 126 CHK(GET_VERTEX_ATTR(&prim, 0, S2D_GEOMETRY_NORMAL, &attr) == RES_BAD_ARG); 127 CHK(GET_VERTEX_ATTR(&prim, 0, S2D_POSITION, NULL) == RES_BAD_ARG); 128 CHK(GET_VERTEX_ATTR(&prim, 0, S2D_POSITION, &attr) == RES_OK); 129 CHK(attr.type == S2D_FLOAT2); 130 CHK(f2_eq_eps(attr.value, square_verts + square_ids[0]*2, 1.e-6f)); 131 CHK(GET_VERTEX_ATTR(&prim, 1, S2D_POSITION, &attr) == RES_OK); 132 CHK(attr.type == S2D_FLOAT2); 133 CHK(f2_eq_eps(attr.value, square_verts + square_ids[1]*2, 1.e-6f)); 134 135 CHK(s2d_device_ref_put(dev) == RES_OK); 136 CHK(s2d_scene_ref_put(scn) == RES_OK); 137 CHK(s2d_scene_view_ref_put(scnview) == RES_OK); 138 CHK(s2d_shape_ref_put(shape) == RES_OK); 139 140 check_memory_allocator(&allocator); 141 mem_shutdown_proxy_allocator(&allocator); 142 CHK(mem_allocated_size() == 0); 143 return 0; 144 } 145