star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

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 }