test_senc3d_scene.c (14138B)
1 /* Copyright (C) 2018-2020, 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 "senc3d.h" 17 #include "test_senc3d_utils.h" 18 19 #include <rsys/float3.h> 20 #include <rsys/double3.h> 21 22 int 23 main(int argc, char** argv) 24 { 25 struct mem_allocator allocator; 26 struct senc3d_device* dev = NULL; 27 struct senc3d_scene* scn = NULL; 28 struct senc3d_enclosure* enc = NULL; 29 struct senc3d_enclosure_header header; 30 struct context ctx = CONTEXT_NULL__; 31 unsigned medfront[2], medback[2], ind[3], ids[2], trg; 32 double vrtx[3]; 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(senc3d_device_create(NULL, &allocator, SENC3D_NTHREADS_DEFAULT, 1, &dev)); 39 40 /* A 3D cube. 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(senc3d_scene_create(NULL, 49 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 50 ntriangles, get_indices, get_media, 51 nvertices, get_position, &ctx, &scn)); 52 BA(senc3d_scene_create(dev, 53 0, 54 ntriangles, get_indices, get_media, 55 nvertices, get_position, &ctx, &scn)); 56 BA(senc3d_scene_create(dev, 57 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 58 0, get_indices, get_media, 59 nvertices, get_position, &ctx, &scn)); 60 BA(senc3d_scene_create(dev, 61 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 62 ntriangles, NULL, get_media, 63 nvertices, get_position, &ctx, &scn)); 64 BA(senc3d_scene_create(dev, 65 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 66 ntriangles, get_indices, get_media, 67 0, get_position, &ctx, &scn)); 68 BA(senc3d_scene_create(dev, 69 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 70 ntriangles, get_indices, get_media, 71 nvertices, NULL, &ctx, &scn)); 72 BA(senc3d_scene_create(dev, 73 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 74 ntriangles, get_indices, get_media, 75 nvertices, get_position, &ctx, NULL)); 76 OK(senc3d_scene_create(dev, 77 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 78 ntriangles, get_indices, get_media, 79 nvertices, get_position, &ctx, &scn)); 80 81 BA(senc3d_scene_get_convention(NULL, &convention)); 82 BA(senc3d_scene_get_convention(scn, NULL)); 83 BA(senc3d_scene_get_convention(NULL, NULL)); 84 OK(senc3d_scene_get_convention(scn, &convention)); 85 CHK(convention 86 == (SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE)); 87 88 BA(senc3d_scene_get_triangles_count(NULL, &count)); 89 BA(senc3d_scene_get_triangles_count(scn, NULL)); 90 BA(senc3d_scene_get_triangles_count(NULL, NULL)); 91 OK(senc3d_scene_get_triangles_count(scn, &count)); 92 CHK(count == ntriangles); 93 94 BA(senc3d_scene_get_vertices_count(NULL, &count)); 95 BA(senc3d_scene_get_vertices_count(scn, NULL)); 96 BA(senc3d_scene_get_vertices_count(NULL, NULL)); 97 OK(senc3d_scene_get_vertices_count(scn, &count)); 98 CHK(count == nvertices); 99 100 BA(senc3d_scene_get_triangle(NULL, 0, ind)); 101 BA(senc3d_scene_get_triangle(scn, UINT_MAX, ind)); 102 BA(senc3d_scene_get_triangle(scn, 0, NULL)); 103 BA(senc3d_scene_get_triangle(NULL, UINT_MAX, ind)); 104 BA(senc3d_scene_get_triangle(NULL, 0, NULL)); 105 BA(senc3d_scene_get_triangle(scn, UINT_MAX, NULL)); 106 BA(senc3d_scene_get_triangle(NULL, UINT_MAX, NULL)); 107 OK(senc3d_scene_get_triangle(scn, 0, ind)); 108 109 BA(senc3d_scene_get_triangle_media(NULL, 0, ind)); 110 BA(senc3d_scene_get_triangle_media(scn, UINT_MAX, ind)); 111 BA(senc3d_scene_get_triangle_media(scn, 0, NULL)); 112 BA(senc3d_scene_get_triangle_media(NULL, UINT_MAX, ind)); 113 BA(senc3d_scene_get_triangle_media(NULL, 0, NULL)); 114 BA(senc3d_scene_get_triangle_media(scn, UINT_MAX, NULL)); 115 BA(senc3d_scene_get_triangle_media(NULL, UINT_MAX, NULL)); 116 OK(senc3d_scene_get_triangle_media(scn, 0, ind)); 117 118 BA(senc3d_scene_get_vertex(NULL, 0, vrtx)); 119 BA(senc3d_scene_get_vertex(scn, UINT_MAX, vrtx)); 120 BA(senc3d_scene_get_vertex(scn, 0, NULL)); 121 BA(senc3d_scene_get_vertex(NULL, UINT_MAX, vrtx)); 122 BA(senc3d_scene_get_vertex(NULL, 0, NULL)); 123 BA(senc3d_scene_get_vertex(scn, UINT_MAX, NULL)); 124 BA(senc3d_scene_get_vertex(NULL, UINT_MAX, NULL)); 125 OK(senc3d_scene_get_vertex(scn, 0, vrtx)); 126 127 BA(senc3d_scene_get_max_medium(NULL, &maxm)); 128 BA(senc3d_scene_get_max_medium(scn, NULL)); 129 BA(senc3d_scene_get_max_medium(NULL, NULL)); 130 OK(senc3d_scene_get_max_medium(scn, &maxm)); 131 CHK(maxm == 1); 132 133 BA(senc3d_scene_get_enclosure_count(NULL, &count)); 134 BA(senc3d_scene_get_enclosure_count(scn, NULL)); 135 BA(senc3d_scene_get_enclosure_count(NULL, NULL)); 136 OK(senc3d_scene_get_enclosure_count(scn, &count)); 137 CHK(count == 2); 138 139 BA(senc3d_scene_get_enclosure_count_by_medium(NULL, 0, &count)); 140 BA(senc3d_scene_get_enclosure_count_by_medium(scn, 100, &count)); 141 BA(senc3d_scene_get_enclosure_count_by_medium(scn, 0, NULL)); 142 BA(senc3d_scene_get_enclosure_count_by_medium(NULL, 100, &count)); 143 BA(senc3d_scene_get_enclosure_count_by_medium(NULL, 0, NULL)); 144 BA(senc3d_scene_get_enclosure_count_by_medium(scn, 100, NULL)); 145 BA(senc3d_scene_get_enclosure_count_by_medium(NULL, 100, NULL)); 146 OK(senc3d_scene_get_enclosure_count_by_medium(scn, 0, &count)); 147 CHK(count == 1); 148 OK(senc3d_scene_get_enclosure_count_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 149 &count)); 150 CHK(count == 0); 151 152 BA(senc3d_scene_get_enclosure(NULL, 0, &enc)); 153 BA(senc3d_scene_get_enclosure(scn, UINT_MAX, &enc)); 154 BA(senc3d_scene_get_enclosure(scn, 0, NULL)); 155 BA(senc3d_scene_get_enclosure(NULL, UINT_MAX, &enc)); 156 BA(senc3d_scene_get_enclosure(NULL, 0, NULL)); 157 BA(senc3d_scene_get_enclosure(scn, UINT_MAX, NULL)); 158 BA(senc3d_scene_get_enclosure(NULL, UINT_MAX, NULL)); 159 OK(senc3d_scene_get_enclosure(scn, 0, &enc)); 160 OK(senc3d_enclosure_ref_put(enc)); 161 162 BA(senc3d_scene_get_enclosure_by_medium(NULL, 0, 0, &enc)); 163 BA(senc3d_scene_get_enclosure_by_medium(scn, 100, 0, &enc)); 164 BA(senc3d_scene_get_enclosure_by_medium(scn, 0, UINT_MAX, &enc)); 165 BA(senc3d_scene_get_enclosure_by_medium(scn, 0, 0, NULL)); 166 BA(senc3d_scene_get_enclosure_by_medium(NULL, 100, 0, &enc)); 167 BA(senc3d_scene_get_enclosure_by_medium(NULL, 0, UINT_MAX, &enc)); 168 BA(senc3d_scene_get_enclosure_by_medium(NULL, 0, 0, NULL)); 169 BA(senc3d_scene_get_enclosure_by_medium(scn, 100, UINT_MAX, &enc)); 170 BA(senc3d_scene_get_enclosure_by_medium(scn, 100, 0, NULL)); 171 BA(senc3d_scene_get_enclosure_by_medium(scn, 0, UINT_MAX, NULL)); 172 BA(senc3d_scene_get_enclosure_by_medium(scn, 100, UINT_MAX, NULL)); 173 BA(senc3d_scene_get_enclosure_by_medium(NULL, 0, UINT_MAX, NULL)); 174 BA(senc3d_scene_get_enclosure_by_medium(NULL, 100, 0, NULL)); 175 BA(senc3d_scene_get_enclosure_by_medium(NULL, 100, UINT_MAX, &enc)); 176 BA(senc3d_scene_get_enclosure_by_medium(NULL, 100, UINT_MAX, NULL)); 177 OK(senc3d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 178 OK(senc3d_enclosure_ref_put(enc)); 179 /* Index 0 is out of range for SENC3D_UNSPECIFIED_MEDIUM. */ 180 BA(senc3d_scene_get_enclosure_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 0, &enc)); 181 182 BA(senc3d_scene_get_triangle_enclosures(NULL, 0, ids)); 183 BA(senc3d_scene_get_triangle_enclosures(scn, UINT_MAX, ids)); 184 BA(senc3d_scene_get_triangle_enclosures(scn, 0, NULL)); 185 BA(senc3d_scene_get_triangle_enclosures(NULL, UINT_MAX, ids)); 186 BA(senc3d_scene_get_triangle_enclosures(NULL, 0, NULL)); 187 BA(senc3d_scene_get_triangle_enclosures(scn, UINT_MAX, NULL)); 188 BA(senc3d_scene_get_triangle_enclosures(NULL, UINT_MAX, NULL)); 189 OK(senc3d_scene_get_triangle_enclosures(scn, 0, ids)); 190 191 BA(senc3d_scene_get_frontier_segments_count(NULL, &count)); 192 BA(senc3d_scene_get_frontier_segments_count(scn, NULL)); 193 BA(senc3d_scene_get_frontier_segments_count(NULL, NULL)); 194 OK(senc3d_scene_get_frontier_segments_count(scn, &count)); 195 CHK(count == 0); 196 197 BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, &trg)); 198 BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, &trg)); 199 BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, &trg)); 200 BA(senc3d_scene_get_frontier_segment(scn, 0, ids, NULL)); 201 BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, &trg)); 202 BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, &trg)); 203 BA(senc3d_scene_get_frontier_segment(NULL, 0, ids, NULL)); 204 BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, &trg)); 205 BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, ids, NULL)); 206 BA(senc3d_scene_get_frontier_segment(scn, 0, NULL, NULL)); 207 BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, &trg)); 208 BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, ids, NULL)); 209 BA(senc3d_scene_get_frontier_segment(NULL, 0, NULL, NULL)); 210 BA(senc3d_scene_get_frontier_segment(scn, UINT_MAX, NULL, NULL)); 211 BA(senc3d_scene_get_frontier_segment(NULL, UINT_MAX, NULL, NULL)); 212 213 BA(senc3d_scene_get_overlapping_triangles_count(NULL, NULL)); 214 BA(senc3d_scene_get_overlapping_triangles_count(scn, NULL)); 215 BA(senc3d_scene_get_overlapping_triangles_count(NULL, &count)); 216 OK(senc3d_scene_get_overlapping_triangles_count(scn, &count)); 217 CHK(count == 0); 218 219 BA(senc3d_scene_get_overlapping_triangle(NULL, 0, &trg)); 220 BA(senc3d_scene_get_overlapping_triangle(scn, UINT_MAX, &trg)); 221 BA(senc3d_scene_get_overlapping_triangle(scn, 0, NULL)); 222 BA(senc3d_scene_get_overlapping_triangle(NULL, UINT_MAX, &trg)); 223 BA(senc3d_scene_get_overlapping_triangle(NULL, 0, NULL)); 224 BA(senc3d_scene_get_overlapping_triangle(scn, UINT_MAX, NULL)); 225 BA(senc3d_scene_get_overlapping_triangle(NULL, UINT_MAX, NULL)); 226 227 BA(senc3d_scene_ref_get(NULL)); 228 OK(senc3d_scene_ref_get(scn)); 229 BA(senc3d_scene_ref_put(NULL)); 230 OK(senc3d_scene_ref_put(scn)); 231 232 OK(senc3d_scene_ref_put(scn)); 233 234 /* Same geometry with SENC3D_UNSPECIFIED_MEDIUM */ 235 OK(senc3d_scene_create(dev, 236 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 237 ntriangles, get_indices, NULL, 238 nvertices, get_position, &ctx, &scn)); 239 240 OK(senc3d_scene_get_enclosure_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 0, &enc)); 241 OK(senc3d_enclosure_ref_put(enc)); 242 BA(senc3d_scene_get_enclosure_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 100, &enc)); 243 244 OK(senc3d_scene_ref_put(scn)); 245 246 /* Same geometry with a hole (1 missing triangle) */ 247 OK(senc3d_scene_create(dev, 248 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 249 ntriangles - 1, get_indices, get_media, 250 nvertices, get_position, &ctx, &scn)); 251 252 OK(senc3d_scene_get_frontier_segments_count(scn, &count)); 253 CHK(count == 3); 254 OK(senc3d_scene_get_frontier_segment(scn, 0, ids, &trg)); 255 BA(senc3d_scene_get_frontier_segment(scn, 3, ids, &trg)); 256 257 OK(senc3d_scene_ref_put(scn)); 258 259 OK(senc3d_scene_create(dev, 260 SENC3D_CONVENTION_NORMAL_BACK | SENC3D_CONVENTION_NORMAL_INSIDE, 261 ntriangles, get_indices, get_media, 262 nvertices, get_position, &ctx, &scn)); 263 264 OK(senc3d_scene_get_convention(scn, &convention)); 265 CHK(convention 266 == (SENC3D_CONVENTION_NORMAL_BACK | SENC3D_CONVENTION_NORMAL_INSIDE)); 267 /* Check that medium 0 is inside */ 268 OK(senc3d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 269 OK(senc3d_enclosure_get_header(enc, &header)); 270 CHK(!header.is_infinite); 271 OK(senc3d_enclosure_ref_put(enc)); 272 273 OK(senc3d_scene_get_triangle_media(scn, 0, medback)); 274 OK(senc3d_scene_ref_put(scn)); 275 276 /* Medium mismatch between neighbour segments, but OK */ 277 ctx.front_media = medium1_3; 278 OK(senc3d_scene_create(dev, 279 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 280 ntriangles, get_indices, get_media, 281 nvertices, get_position, &ctx, &scn)); 282 283 OK(senc3d_scene_get_max_medium(scn, &maxm)); 284 CHK(maxm == 3); 285 OK(senc3d_scene_get_enclosure_count_by_medium(scn, 0, &count)); 286 CHK(count == 0); /* Medium 0 unused */ 287 OK(senc3d_scene_get_enclosure_count_by_medium(scn, 1, &count)); 288 CHK(count == 2); /* Medium 1 used twice */ 289 OK(senc3d_scene_get_enclosure_count_by_medium(scn, 2, &count)); 290 CHK(count == 0); /* Medium 2 unused */ 291 OK(senc3d_scene_get_enclosure_count_by_medium(scn, 3, &count)); 292 CHK(count == 1); /* Medium 3 used */ 293 OK(senc3d_scene_get_enclosure_count_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 294 &count)); 295 CHK(count == 0); 296 297 OK(senc3d_scene_ref_put(scn)); 298 299 ctx.front_media = medium0; 300 OK(senc3d_scene_create(dev, 301 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 302 ntriangles, get_indices, get_media, 303 nvertices, get_position, &ctx, &scn)); 304 /* Check that medium 0 is outside */ 305 OK(senc3d_scene_get_enclosure_by_medium(scn, 0, 0, &enc)); 306 OK(senc3d_enclosure_get_header(enc, &header)); 307 CHK(header.is_infinite); 308 OK(senc3d_enclosure_ref_put(enc)); 309 310 OK(senc3d_scene_get_triangle_media(scn, 0, medfront)); 311 FOR_EACH(i, 0, 2) CHK(medback[i] == medfront[i]); 312 313 OK(senc3d_scene_ref_put(scn)); 314 315 /* Geometry with no media information */ 316 OK(senc3d_scene_create(dev, 317 SENC3D_CONVENTION_NORMAL_FRONT | SENC3D_CONVENTION_NORMAL_INSIDE, 318 ntriangles, get_indices, NULL, 319 nvertices, get_position, &ctx, &scn)); 320 OK(senc3d_scene_get_max_medium(scn, &maxm)); 321 CHK(maxm == SENC3D_UNSPECIFIED_MEDIUM); 322 OK(senc3d_scene_get_enclosure_count_by_medium(scn, SENC3D_UNSPECIFIED_MEDIUM, 323 &count)); 324 CHK(count == 2); 325 326 OK(senc3d_scene_ref_put(scn)); 327 OK(senc3d_device_ref_put(dev)); 328 329 check_memory_allocator(&allocator); 330 mem_shutdown_proxy_allocator(&allocator); 331 CHK(mem_allocated_size() == 0); 332 333 return 0; 334 }