test_senc2d_scene.c (13530B)
1 /* Copyright (C) 2018-2021, 2023, 2024 |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 "senc2d.h" 17 #include "test_senc2d_utils.h" 18 19 #include <rsys/float2.h> 20 #include <rsys/double2.h> 21 22 int 23 main(int argc, char** argv) 24 { 25 struct mem_allocator allocator; 26 struct senc2d_device* dev = NULL; 27 struct senc2d_scene* scn = NULL; 28 struct senc2d_enclosure* enc = NULL; 29 struct senc2d_enclosure_header header; 30 struct context ctx = CONTEXT_NULL__; 31 unsigned medfront[2], medback[2], ind[2], ids[2], seg; 32 double vrtx[2]; 33 unsigned count, i, maxm; 34 int convention; 35 (void)argc, (void)argv; 36 37 OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); 38 OK(senc2d_device_create(NULL, &allocator, SENC2D_NTHREADS_DEFAULT, 1, &dev)); 39 40 /* A 2D square. 41 * With this geometry front is inside with NORMAL_BACK convention, 42 * outside with NORMAL_FRONT convention */ 43 ctx.positions = box_vertices; 44 ctx.indices = box_indices; 45 ctx.front_media = medium0; 46 ctx.back_media = medium1; 47 48 BA(senc2d_scene_create(NULL, 49 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 50 nsegments, get_indices, get_media, 51 nvertices, get_position, &ctx, &scn)); 52 BA(senc2d_scene_create(dev, 53 0, 54 nsegments, get_indices, get_media, 55 nvertices, get_position, &ctx, &scn)); 56 BA(senc2d_scene_create(dev, 57 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 58 0, get_indices, get_media, 59 nvertices, get_position, &ctx, &scn)); 60 BA(senc2d_scene_create(dev, 61 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 62 nsegments, NULL, get_media, 63 nvertices, get_position, &ctx, &scn)); 64 BA(senc2d_scene_create(dev, 65 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 66 nsegments, get_indices, get_media, 67 0, get_position, &ctx, &scn)); 68 BA(senc2d_scene_create(dev, 69 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 70 nsegments, get_indices, get_media, 71 nvertices, NULL, &ctx, &scn)); 72 BA(senc2d_scene_create(dev, 73 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 74 nsegments, get_indices, get_media, 75 nvertices, get_position, &ctx, NULL)); 76 OK(senc2d_scene_create(dev, 77 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 78 nsegments, get_indices, get_media, 79 nvertices, get_position, &ctx, &scn)); 80 81 BA(senc2d_scene_get_convention(NULL, &convention)); 82 BA(senc2d_scene_get_convention(scn, NULL)); 83 BA(senc2d_scene_get_convention(NULL, NULL)); 84 OK(senc2d_scene_get_convention(scn, &convention)); 85 CHK(convention 86 == (SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE)); 87 88 BA(senc2d_scene_get_segments_count(NULL, &count)); 89 BA(senc2d_scene_get_segments_count(scn, NULL)); 90 BA(senc2d_scene_get_segments_count(NULL, NULL)); 91 OK(senc2d_scene_get_segments_count(scn, &count)); 92 CHK(count == nsegments); 93 94 BA(senc2d_scene_get_vertices_count(NULL, &count)); 95 BA(senc2d_scene_get_vertices_count(scn, NULL)); 96 BA(senc2d_scene_get_vertices_count(NULL, NULL)); 97 OK(senc2d_scene_get_vertices_count(scn, &count)); 98 CHK(count == nvertices); 99 100 BA(senc2d_scene_get_segment(NULL, 0, ind)); 101 BA(senc2d_scene_get_segment(scn, UINT_MAX, ind)); 102 BA(senc2d_scene_get_segment(scn, 0, NULL)); 103 BA(senc2d_scene_get_segment(NULL, UINT_MAX, ind)); 104 BA(senc2d_scene_get_segment(NULL, 0, NULL)); 105 BA(senc2d_scene_get_segment(scn, UINT_MAX, NULL)); 106 BA(senc2d_scene_get_segment(NULL, UINT_MAX, NULL)); 107 OK(senc2d_scene_get_segment(scn, 0, ind)); 108 109 BA(senc2d_scene_get_segment_media(NULL, 0, ind)); 110 BA(senc2d_scene_get_segment_media(scn, UINT_MAX, ind)); 111 BA(senc2d_scene_get_segment_media(scn, 0, NULL)); 112 BA(senc2d_scene_get_segment_media(NULL, UINT_MAX, ind)); 113 BA(senc2d_scene_get_segment_media(NULL, 0, NULL)); 114 BA(senc2d_scene_get_segment_media(scn, UINT_MAX, NULL)); 115 BA(senc2d_scene_get_segment_media(NULL, UINT_MAX, NULL)); 116 OK(senc2d_scene_get_segment_media(scn, 0, ind)); 117 118 BA(senc2d_scene_get_vertex(NULL, 0, vrtx)); 119 BA(senc2d_scene_get_vertex(scn, UINT_MAX, vrtx)); 120 BA(senc2d_scene_get_vertex(scn, 0, NULL)); 121 BA(senc2d_scene_get_vertex(NULL, UINT_MAX, vrtx)); 122 BA(senc2d_scene_get_vertex(NULL, 0, NULL)); 123 BA(senc2d_scene_get_vertex(scn, UINT_MAX, NULL)); 124 BA(senc2d_scene_get_vertex(NULL, UINT_MAX, NULL)); 125 OK(senc2d_scene_get_vertex(scn, 0, vrtx)); 126 127 BA(senc2d_scene_get_max_medium(NULL, &maxm)); 128 BA(senc2d_scene_get_max_medium(scn, NULL)); 129 BA(senc2d_scene_get_max_medium(NULL, NULL)); 130 OK(senc2d_scene_get_max_medium(scn, &maxm)); 131 CHK(maxm == 1); 132 133 BA(senc2d_scene_get_enclosure_count(NULL, &count)); 134 BA(senc2d_scene_get_enclosure_count(scn, NULL)); 135 BA(senc2d_scene_get_enclosure_count(NULL, NULL)); 136 OK(senc2d_scene_get_enclosure_count(scn, &count)); 137 CHK(count == 2); 138 139 BA(senc2d_scene_get_enclosure_count_by_medium(NULL, 0, &count)); 140 BA(senc2d_scene_get_enclosure_count_by_medium(scn, 100, &count)); 141 BA(senc2d_scene_get_enclosure_count_by_medium(scn, 0, NULL)); 142 BA(senc2d_scene_get_enclosure_count_by_medium(NULL, 100, &count)); 143 BA(senc2d_scene_get_enclosure_count_by_medium(NULL, 0, NULL)); 144 BA(senc2d_scene_get_enclosure_count_by_medium(scn, 100, NULL)); 145 BA(senc2d_scene_get_enclosure_count_by_medium(NULL, 100, NULL)); 146 OK(senc2d_scene_get_enclosure_count_by_medium(scn, 0, &count)); 147 CHK(count == 1); 148 OK(senc2d_scene_get_enclosure_count_by_medium(scn, SENC2D_UNSPECIFIED_MEDIUM, 149 &count)); 150 CHK(count == 0); 151 152 BA(senc2d_scene_get_enclosure(NULL, 0, &enc)); 153 BA(senc2d_scene_get_enclosure(scn, UINT_MAX, &enc)); 154 BA(senc2d_scene_get_enclosure(scn, 0, NULL)); 155 BA(senc2d_scene_get_enclosure(NULL, UINT_MAX, &enc)); 156 BA(senc2d_scene_get_enclosure(NULL, 0, NULL)); 157 BA(senc2d_scene_get_enclosure(scn, UINT_MAX, NULL)); 158 BA(senc2d_scene_get_enclosure(NULL, UINT_MAX, NULL)); 159 OK(senc2d_scene_get_enclosure(scn, 0, &enc)); 160 OK(senc2d_enclosure_ref_put(enc)); 161 162 BA(senc2d_scene_get_enclosure_by_medium(NULL, 0, 0, &enc)); 163 BA(senc2d_scene_get_enclosure_by_medium(scn, 100, 0, &enc)); 164 BA(senc2d_scene_get_enclosure_by_medium(scn, 0, UINT_MAX, &enc)); 165 BA(senc2d_scene_get_enclosure_by_medium(scn, 0, 0, NULL)); 166 BA(senc2d_scene_get_enclosure_by_medium(NULL, 100, 0, &enc)); 167 BA(senc2d_scene_get_enclosure_by_medium(NULL, 0, UINT_MAX, &enc)); 168 BA(senc2d_scene_get_enclosure_by_medium(NULL, 0, 0, NULL)); 169 BA(senc2d_scene_get_enclosure_by_medium(scn, 100, UINT_MAX, &enc)); 170 BA(senc2d_scene_get_enclosure_by_medium(scn, 100, 0, NULL)); 171 BA(senc2d_scene_get_enclosure_by_medium(scn, 0, UINT_MAX, NULL)); 172 BA(senc2d_scene_get_enclosure_by_medium(scn, 100, UINT_MAX, NULL)); 173 BA(senc2d_scene_get_enclosure_by_medium(NULL, 0, UINT_MAX, NULL)); 174 BA(senc2d_scene_get_enclosure_by_medium(NULL, 100, 0, NULL)); 175 BA(senc2d_scene_get_enclosure_by_medium(NULL, 100, UINT_MAX, &enc)); 176 BA(senc2d_scene_get_enclosure_by_medium(NULL, 100, UINT_MAX, NULL)); 177 OK(senc2d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 178 OK(senc2d_enclosure_ref_put(enc)); 179 /* Index 0 is out of range for SENC2D_UNSPECIFIED_MEDIUM. */ 180 BA(senc2d_scene_get_enclosure_by_medium(scn, SENC2D_UNSPECIFIED_MEDIUM, 0, &enc)); 181 182 BA(senc2d_scene_get_segment_enclosures(NULL, 0, ids)); 183 BA(senc2d_scene_get_segment_enclosures(scn, UINT_MAX, ids)); 184 BA(senc2d_scene_get_segment_enclosures(scn, 0, NULL)); 185 BA(senc2d_scene_get_segment_enclosures(NULL, UINT_MAX, ids)); 186 BA(senc2d_scene_get_segment_enclosures(NULL, 0, NULL)); 187 BA(senc2d_scene_get_segment_enclosures(scn, UINT_MAX, NULL)); 188 BA(senc2d_scene_get_segment_enclosures(NULL, UINT_MAX, NULL)); 189 OK(senc2d_scene_get_segment_enclosures(scn, 0, ids)); 190 191 BA(senc2d_scene_get_frontier_vertice_count(NULL, &count)); 192 BA(senc2d_scene_get_frontier_vertice_count(scn, NULL)); 193 BA(senc2d_scene_get_frontier_vertice_count(NULL, NULL)); 194 OK(senc2d_scene_get_frontier_vertice_count(scn, &count)); 195 CHK(count == 0); 196 197 BA(senc2d_scene_get_frontier_vertex(NULL, 0, &ids[0], &seg)); 198 BA(senc2d_scene_get_frontier_vertex(scn, UINT_MAX, &ids[0], &seg)); 199 BA(senc2d_scene_get_frontier_vertex(scn, 0, NULL, &seg)); 200 BA(senc2d_scene_get_frontier_vertex(scn, 0, &ids[0], NULL)); 201 BA(senc2d_scene_get_frontier_vertex(NULL, UINT_MAX, &ids[0], &seg)); 202 BA(senc2d_scene_get_frontier_vertex(NULL, 0, NULL, &seg)); 203 BA(senc2d_scene_get_frontier_vertex(NULL, 0, &ids[0], NULL)); 204 BA(senc2d_scene_get_frontier_vertex(scn, UINT_MAX, NULL, &seg)); 205 BA(senc2d_scene_get_frontier_vertex(scn, UINT_MAX, &ids[0], NULL)); 206 BA(senc2d_scene_get_frontier_vertex(scn, 0, NULL, NULL)); 207 BA(senc2d_scene_get_frontier_vertex(NULL, UINT_MAX, NULL, &seg)); 208 BA(senc2d_scene_get_frontier_vertex(NULL, UINT_MAX, &ids[0], NULL)); 209 BA(senc2d_scene_get_frontier_vertex(NULL, 0, NULL, NULL)); 210 BA(senc2d_scene_get_frontier_vertex(scn, UINT_MAX, NULL, NULL)); 211 BA(senc2d_scene_get_frontier_vertex(NULL, UINT_MAX, NULL, NULL)); 212 213 BA(senc2d_scene_get_overlapping_segments_count(NULL, NULL)); 214 BA(senc2d_scene_get_overlapping_segments_count(scn, NULL)); 215 BA(senc2d_scene_get_overlapping_segments_count(NULL, &count)); 216 OK(senc2d_scene_get_overlapping_segments_count(scn, &count)); 217 CHK(count == 0); 218 219 BA(senc2d_scene_get_overlapping_segment(NULL, 0, &seg)); 220 BA(senc2d_scene_get_overlapping_segment(scn, UINT_MAX, &seg)); 221 BA(senc2d_scene_get_overlapping_segment(scn, 0, NULL)); 222 BA(senc2d_scene_get_overlapping_segment(NULL, UINT_MAX, &seg)); 223 BA(senc2d_scene_get_overlapping_segment(NULL, 0, NULL)); 224 BA(senc2d_scene_get_overlapping_segment(scn, UINT_MAX, NULL)); 225 BA(senc2d_scene_get_overlapping_segment(NULL, UINT_MAX, NULL)); 226 227 BA(senc2d_scene_ref_get(NULL)); 228 OK(senc2d_scene_ref_get(scn)); 229 BA(senc2d_scene_ref_put(NULL)); 230 OK(senc2d_scene_ref_put(scn)); 231 232 OK(senc2d_scene_ref_put(scn)); 233 234 /* Same geometry with SENC2D_UNSPECIFIED_MEDIUM */ 235 OK(senc2d_scene_create(dev, 236 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 237 nsegments, get_indices, NULL, 238 nvertices, get_position, &ctx, &scn)); 239 240 OK(senc2d_scene_get_enclosure_by_medium(scn, SENC2D_UNSPECIFIED_MEDIUM, 0, &enc)); 241 OK(senc2d_enclosure_ref_put(enc)); 242 BA(senc2d_scene_get_enclosure_by_medium(scn, SENC2D_UNSPECIFIED_MEDIUM, 100, &enc)); 243 244 OK(senc2d_scene_ref_put(scn)); 245 246 /* Same geometry with a hole (1 missing segment) */ 247 OK(senc2d_scene_create(dev, 248 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 249 nsegments - 1, get_indices, get_media, 250 nvertices, get_position, &ctx, &scn)); 251 252 OK(senc2d_scene_get_frontier_vertice_count(scn, &count)); 253 CHK(count == 2); 254 OK(senc2d_scene_get_frontier_vertex(scn, 0, &ids[0], &seg)); 255 BA(senc2d_scene_get_frontier_vertex(scn, 3, &ids[0], &seg)); 256 257 OK(senc2d_scene_ref_put(scn)); 258 259 OK(senc2d_scene_create(dev, 260 SENC2D_CONVENTION_NORMAL_BACK | SENC2D_CONVENTION_NORMAL_INSIDE, 261 nsegments, get_indices, get_media, 262 nvertices, get_position, &ctx, &scn)); 263 264 OK(senc2d_scene_get_convention(scn, &convention)); 265 CHK(convention 266 == (SENC2D_CONVENTION_NORMAL_BACK | SENC2D_CONVENTION_NORMAL_INSIDE)); 267 /* Check that medium 0 is inside */ 268 OK(senc2d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 269 OK(senc2d_enclosure_get_header(enc, &header)); 270 CHK(!header.is_infinite); 271 OK(senc2d_enclosure_ref_put(enc)); 272 273 OK(senc2d_scene_get_segment_media(scn, 0, medback)); 274 OK(senc2d_scene_ref_put(scn)); 275 276 /* Medium mismatch between neighbour segments, but OK */ 277 ctx.front_media = medium1_3; 278 OK(senc2d_scene_create(dev, 279 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 280 nsegments, get_indices, get_media, 281 nvertices, get_position, &ctx, &scn)); 282 283 OK(senc2d_scene_get_max_medium(scn, &maxm)); 284 CHK(maxm == 3); 285 OK(senc2d_scene_get_enclosure_count_by_medium(scn, 0, &count)); 286 CHK(count == 0); /* Medium 0 unused */ 287 OK(senc2d_scene_get_enclosure_count_by_medium(scn, 1, &count)); 288 CHK(count == 2); /* Medium 1 used twice */ 289 OK(senc2d_scene_get_enclosure_count_by_medium(scn, 2, &count)); 290 CHK(count == 0); /* Medium 2 unused */ 291 OK(senc2d_scene_get_enclosure_count_by_medium(scn, 3, &count)); 292 CHK(count == 1); /* Medium 3 used */ 293 294 OK(senc2d_scene_ref_put(scn)); 295 296 ctx.front_media = medium0; 297 OK(senc2d_scene_create(dev, 298 SENC2D_CONVENTION_NORMAL_FRONT | SENC2D_CONVENTION_NORMAL_INSIDE, 299 nsegments, get_indices, get_media, 300 nvertices, get_position, &ctx, &scn)); 301 /* Check that medium 0 is outside */ 302 OK(senc2d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 303 OK(senc2d_enclosure_get_header(enc, &header)); 304 CHK(header.is_infinite); 305 OK(senc2d_enclosure_ref_put(enc)); 306 307 OK(senc2d_scene_get_segment_media(scn, 0, medfront)); 308 FOR_EACH(i, 0, 2) CHK(medback[i] == medfront[i]); 309 310 OK(senc2d_scene_ref_put(scn)); 311 OK(senc2d_device_ref_put(dev)); 312 313 check_memory_allocator(&allocator); 314 mem_shutdown_proxy_allocator(&allocator); 315 CHK(mem_allocated_size() == 0); 316 317 return 0; 318 }