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_zero_distance.c (31542B)


      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 /* This test has been created using the sg3_geometry_dump_as_C_code feature
     17  * of star-geometry. It uses output from test_sg3_cube_on_cube. */
     18 
     19 #define _POSIX_C_SOURCE 200112L /* snprintf */
     20 
     21 #include "senc3d.h"
     22 #include "test_senc3d_utils.h"
     23 
     24 #include <rsys/double3.h>
     25 
     26 #include <stdio.h>
     27 
     28 /* Tests created using -c option of stardis */
     29 
     30 /* zero_1 geometry is made of a big distorded cube, that as a single highest
     31  * vertex V, and two internal shapes (highly distorded cubes) that joint at the
     32  * same V vertex. Distance between the 6 components (inside and outside of each
     33  * shape) is zero. */
     34 #define zero_1_UNSPECIFIED_PROPERTY 4294967295
     35 
     36 static const unsigned
     37 zero_1_vertices_count = 22;
     38 
     39 static const unsigned
     40 zero_1_triangles_count = 36;
     41 
     42 static const double
     43 zero_1_vertices[22][3] = {
     44    { 10, 10, 0 },
     45    { 10, 0, 0 },
     46    { 0, 10, 0 },
     47    { 0, 0, 0 },
     48    { 0, 10, 10 },
     49    { 0, 0, 10 },
     50    { 10, 0, 10 },
     51    { 9, 9, 11 },
     52    { 8, 9, 1 },
     53    { 4, 7, 1 },
     54    { 1, 9, 1 },
     55    { 1, 2, 1 },
     56    { 1, 9, 9 },
     57    { 1, 2, 9 },
     58    { 4, 7, 9 },
     59    { 7, 5, 1 },
     60    { 9, 8, 1 },
     61    { 9, 1, 1 },
     62    { 2, 1, 1 },
     63    { 2, 1, 9 },
     64    { 9, 1, 9 },
     65    { 7, 4, 9 }
     66 };
     67 
     68 static const unsigned
     69 zero_1_triangles[36][3] = {
     70    { 0, 1, 2 },
     71    { 1, 3, 2 },
     72    { 4, 5, 6 },
     73    { 7, 4, 6 },
     74    { 2, 3, 4 },
     75    { 3, 5, 4 },
     76    { 6, 1, 7 },
     77    { 1, 0, 7 },
     78    { 0, 2, 4 },
     79    { 7, 0, 4 },
     80    { 5, 3, 1 },
     81    { 6, 5, 1 },
     82    { 8, 9, 10 },
     83    { 9, 11, 10 },
     84    { 12, 13, 14 },
     85    { 7, 12, 14 },
     86    { 10, 11, 12 },
     87    { 11, 13, 12 },
     88    { 14, 9, 7 },
     89    { 9, 8, 7 },
     90    { 8, 10, 12 },
     91    { 7, 8, 12 },
     92    { 13, 11, 9 },
     93    { 14, 13, 9 },
     94    { 15, 16, 17 },
     95    { 18, 15, 17 },
     96    { 19, 20, 21 },
     97    { 20, 7, 21 },
     98    { 18, 17, 20 },
     99    { 19, 18, 20 },
    100    { 15, 21, 7 },
    101    { 16, 15, 7 },
    102    { 17, 16, 20 },
    103    { 16, 7, 20 },
    104    { 18, 19, 15 },
    105    { 19, 21, 15 }
    106 };
    107 
    108 static const unsigned
    109 zero_1_properties[36][3] = {
    110    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    111    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    112    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    113    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    114    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    115    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    116    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    117    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    118    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    119    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    120    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    121    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    122    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    123    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    124    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    125    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    126    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    127    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    128    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    129    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    130    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    131    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    132    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    133    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    134    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    135    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    136    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    137    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    138    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    139    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    140    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    141    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    142    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    143    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    144    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    145    { 1, 0, zero_1_UNSPECIFIED_PROPERTY }
    146 };
    147 
    148 /* zero_1d is similar as zero_1, with geometry duplicated in mirror along Z axis */
    149 static const unsigned
    150 zero_1d_vertices_count = 44;
    151 
    152 static const unsigned
    153 zero_1d_triangles_count = 72;
    154 
    155 static const double
    156 zero_1d_vertices[44][3] = {
    157    { 10, 10, -11 },
    158    { 10, 0, -11 },
    159    { 0, 10, -11 },
    160    { 0, 0, -11 },
    161    { 0, 10, -1 },
    162    { 0, 0, -1 },
    163    { 10, 0, -1 },
    164    { 9, 9, 0 },
    165    { 8, 9, -10 },
    166    { 4, 7, -10 },
    167    { 1, 9, -10 },
    168    { 1, 2, -10 },
    169    { 1, 9, -2 },
    170    { 1, 2, -2 },
    171    { 4, 7, -2 },
    172    { 7, 5, -10 },
    173    { 9, 8, -10 },
    174    { 9, 1, -10 },
    175    { 2, 1, -10 },
    176    { 2, 1, -2 },
    177    { 9, 1, -2 },
    178    { 7, 4, -2 }, 
    179    { 10, 10, 11 },
    180    { 10, 0, 11 },
    181    { 0, 10, 11 },
    182    { 0, 0, 11 },
    183    { 0, 10, 1 },
    184    { 0, 0, 1 },
    185    { 10, 0, 1 },
    186    { 9, 9, 0.1 }, /* Vertex #29 == vertex #7 => keep a dummy placeholder here and use #7 instead in triangles */
    187    { 8, 9, 10 },
    188    { 4, 7, 10 },
    189    { 1, 9, 10 },
    190    { 1, 2, 10 },
    191    { 1, 9, 2 },
    192    { 1, 2, 2 },
    193    { 4, 7, 2 },
    194    { 7, 5, 10 },
    195    { 9, 8, 10 },
    196    { 9, 1, 10 },
    197    { 2, 1, 10 },
    198    { 2, 1, 2 },
    199    { 9, 1, 2 },
    200    { 7, 4, 2 }
    201 };
    202 
    203 static const unsigned
    204 zero_1d_triangles[72][3] = {
    205    { 0, 1, 2 },
    206    { 1, 3, 2 },
    207    { 4, 5, 6 },
    208    { 7, 4, 6 },
    209    { 2, 3, 4 },
    210    { 3, 5, 4 },
    211    { 6, 1, 7 },
    212    { 1, 0, 7 },
    213    { 0, 2, 4 },
    214    { 7, 0, 4 },
    215    { 5, 3, 1 },
    216    { 6, 5, 1 },
    217    { 8, 9, 10 },
    218    { 9, 11, 10 },
    219    { 12, 13, 14 },
    220    { 7, 12, 14 },
    221    { 10, 11, 12 },
    222    { 11, 13, 12 },
    223    { 14, 9, 7 },
    224    { 9, 8, 7 },
    225    { 8, 10, 12 },
    226    { 7, 8, 12 },
    227    { 13, 11, 9 },
    228    { 14, 13, 9 },
    229    { 15, 16, 17 },
    230    { 18, 15, 17 },
    231    { 19, 20, 21 },
    232    { 20, 7, 21 },
    233    { 18, 17, 20 },
    234    { 19, 18, 20 },
    235    { 15, 21, 7 },
    236    { 16, 15, 7 },
    237    { 17, 16, 20 },
    238    { 16, 7, 20 },
    239    { 18, 19, 15 },
    240    { 19, 21, 15 },
    241    { 22, 23, 24 },
    242    { 23, 25, 24 },
    243    { 26, 27, 28 },
    244    { 7, 26, 28 },
    245    { 24, 25, 26 },
    246    { 25, 27, 26 },
    247    { 28, 23, 7 },
    248    { 23, 22, 7 },
    249    { 22, 24, 26 },
    250    { 7, 22, 26 },
    251    { 27, 25, 23 },
    252    { 28, 27, 23 },
    253    { 30, 31, 32 },
    254    { 31, 33, 32 },
    255    { 34, 35, 36 },
    256    { 7, 34, 36 },
    257    { 32, 33, 34 },
    258    { 33, 35, 34 },
    259    { 36, 31, 7 },
    260    { 31, 30, 7 },
    261    { 30, 32, 34 },
    262    { 7, 30, 34 },
    263    { 35, 33, 31 },
    264    { 36, 35, 31 },
    265    { 37, 38, 39 },
    266    { 40, 37, 39 },
    267    { 41, 42, 43 },
    268    { 42, 7, 43 },
    269    { 40, 39, 42 },
    270    { 41, 40, 42 },
    271    { 37, 43, 7 },
    272    { 38, 37, 7 },
    273    { 39, 38, 42 },
    274    { 38, 7, 42 },
    275    { 40, 41, 37 },
    276    { 41, 43, 37 }
    277 };
    278 
    279 static const unsigned
    280 zero_1d_properties[72][3] = {
    281    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    282    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    283    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    284    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    285    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    286    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    287    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    288    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    289    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    290    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    291    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    292    { 0, zero_1_UNSPECIFIED_PROPERTY, 2 },
    293    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    294    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    295    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    296    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    297    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    298    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    299    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    300    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    301    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    302    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    303    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    304    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    305    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    306    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    307    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    308    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    309    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    310    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    311    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    312    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    313    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    314    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    315    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    316    { 1, 0, zero_1_UNSPECIFIED_PROPERTY },
    317 
    318    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    319    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    320    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    321    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    322    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    323    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    324    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    325    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    326    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    327    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    328    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    329    { zero_1_UNSPECIFIED_PROPERTY, 0, 2 },
    330    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    331    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    332    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    333    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    334    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    335    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    336    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    337    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    338    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    339    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    340    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    341    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    342    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    343    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    344    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    345    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    346    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    347    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    348    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    349    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    350    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    351    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    352    { 0, 1, zero_1_UNSPECIFIED_PROPERTY },
    353    { 0, 1, zero_1_UNSPECIFIED_PROPERTY }
    354 };
    355 
    356 /* zero_1D is similar as zero_1d, with a tiny distance between mirrored
    357  * geometries */
    358 static const double
    359 zero_1D_vertices[44][3] = {
    360    { 10, 10, -11 },
    361    { 10, 0, -11 },
    362    { 0, 10, -11 },
    363    { 0, 0, -11 },
    364    { 0, 10, -1 },
    365    { 0, 0, -1 },
    366    { 10, 0, -1 },
    367    { 9, 9, 0 },
    368    { 8, 9, -10 },
    369    { 4, 7, -10 },
    370    { 1, 9, -10 },
    371    { 1, 2, -10 },
    372    { 1, 9, -2 },
    373    { 1, 2, -2 },
    374    { 4, 7, -2 },
    375    { 7, 5, -10 },
    376    { 9, 8, -10 },
    377    { 9, 1, -10 },
    378    { 2, 1, -10 },
    379    { 2, 1, -2 },
    380    { 9, 1, -2 },
    381    { 7, 4, -2 },
    382    { 10, 10, 11 },
    383    { 10, 0, 11 },
    384    { 0, 10, 11 },
    385    { 0, 0, 11 },
    386    { 0, 10, 1 },
    387    { 0, 0, 1 },
    388    { 10, 0, 1 },
    389    { 9, 9, 1e-30 },
    390    { 8, 9, 10 },
    391    { 4, 7, 10 },
    392    { 1, 9, 10 },
    393    { 1, 2, 10 },
    394    { 1, 9, 2 },
    395    { 1, 2, 2 },
    396    { 4, 7, 2 },
    397    { 7, 5, 10 },
    398    { 9, 8, 10 },
    399    { 9, 1, 10 },
    400    { 2, 1, 10 },
    401    { 2, 1, 2 },
    402    { 9, 1, 2 },
    403    { 7, 4, 2 }
    404 };
    405 
    406 #define zero_1D_triangles zero_1d_triangles
    407 
    408 #define zero_1D_properties zero_1d_properties
    409 static unsigned zero_1D_triangles_count = zero_1d_triangles_count;
    410 static unsigned zero_1D_vertices_count = zero_1d_vertices_count;
    411 
    412 /* zero_2 geometry is made of 5 nested distorded cubes of decreasing sizes, that
    413  * all join at a single vertex V (the highest vertex in the model). Distance between
    414  * the 10 components (inside and outside of each shape) is zero. */
    415 #define zero_2_UNSPECIFIED_PROPERTY 4294967295
    416 
    417 static const unsigned
    418 zero_2_vertices_count = 36;
    419 
    420 static const unsigned
    421 zero_2_triangles_count = 60;
    422 
    423 static const double
    424 zero_2_vertices[36][3] = {
    425    { 0, 10, 0 },
    426    { 0, 0, 0 },
    427    { 0, 10, 10 },
    428    { 0, 0, 10 },
    429    { 10, 0, 10 },
    430    { 10, 0, 0 },
    431    { 9, 9, 11 },
    432    { 10, 10, 0 },
    433    { 1, 9, 1 },
    434    { 1, 1, 1 },
    435    { 1, 9, 9 },
    436    { 1, 1, 9 },
    437    { 9, 1, 9 },
    438    { 9, 1, 1 },
    439    { 9, 9, 1 },
    440    { 2, 8, 2 },
    441    { 2, 2, 2 },
    442    { 2, 8, 8 },
    443    { 2, 2, 8 },
    444    { 8, 2, 8 },
    445    { 8, 2, 2 },
    446    { 8, 8, 2 },
    447    { 3, 7, 3 },
    448    { 3, 3, 3 },
    449    { 3, 7, 7 },
    450    { 3, 3, 7 },
    451    { 7, 3, 7 },
    452    { 7, 3, 3 },
    453    { 7, 7, 3 },
    454    { 4, 6, 4 },
    455    { 4, 4, 4 },
    456    { 4, 6, 6 },
    457    { 4, 4, 6 },
    458    { 6, 4, 6 },
    459    { 6, 4, 4 },
    460    { 6, 6, 4 }
    461 };
    462 
    463 static const unsigned
    464 zero_2_triangles[60][3] = {
    465    { 0, 1, 2 },
    466    { 1, 3, 2 },
    467    { 4, 5, 6 },
    468    { 5, 7, 6 },
    469    { 2, 3, 4 },
    470    { 6, 2, 4 },
    471    { 5, 1, 0 },
    472    { 7, 5, 0 },
    473    { 3, 1, 5 },
    474    { 4, 3, 5 },
    475    { 7, 0, 2 },
    476    { 6, 7, 2 },
    477    { 8, 9, 10 },
    478    { 9, 11, 10 },
    479    { 12, 13, 6 },
    480    { 13, 14, 6 },
    481    { 10, 11, 12 },
    482    { 6, 10, 12 },
    483    { 13, 9, 8 },
    484    { 14, 13, 8 },
    485    { 11, 9, 13 },
    486    { 12, 11, 13 },
    487    { 14, 8, 10 },
    488    { 6, 14, 10 },
    489    { 15, 16, 17 },
    490    { 16, 18, 17 },
    491    { 19, 20, 6 },
    492    { 20, 21, 6 },
    493    { 17, 18, 19 },
    494    { 6, 17, 19 },
    495    { 20, 16, 15 },
    496    { 21, 20, 15 },
    497    { 18, 16, 20 },
    498    { 19, 18, 20 },
    499    { 21, 15, 17 },
    500    { 6, 21, 17 },
    501    { 22, 23, 24 },
    502    { 23, 25, 24 },
    503    { 26, 27, 6 },
    504    { 27, 28, 6 },
    505    { 24, 25, 26 },
    506    { 6, 24, 26 },
    507    { 27, 23, 22 },
    508    { 28, 27, 22 },
    509    { 25, 23, 27 },
    510    { 26, 25, 27 },
    511    { 28, 22, 24 },
    512    { 6, 28, 24 },
    513    { 29, 30, 31 },
    514    { 30, 32, 31 },
    515    { 33, 34, 6 },
    516    { 34, 35, 6 },
    517    { 31, 32, 33 },
    518    { 6, 31, 33 },
    519    { 34, 30, 29 },
    520    { 35, 34, 29 },
    521    { 32, 30, 34 },
    522    { 33, 32, 34 },
    523    { 35, 29, 31 },
    524    { 6, 35, 31 }
    525 };
    526 
    527 static const unsigned
    528 zero_2_properties[60][3] = {
    529    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    530    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    531    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    532    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    533    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    534    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    535    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    536    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    537    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    538    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    539    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    540    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    541    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    542    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    543    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    544    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    545    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    546    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    547    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    548    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    549    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    550    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    551    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    552    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    553    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    554    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    555    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    556    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    557    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    558    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    559    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    560    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    561    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    562    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    563    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    564    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    565    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    566    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    567    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    568    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    569    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    570    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    571    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    572    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    573    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    574    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    575    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    576    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    577    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    578    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    579    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    580    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    581    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    582    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    583    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    584    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    585    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    586    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    587    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    588    { 4, 3, zero_2_UNSPECIFIED_PROPERTY }
    589 };
    590 
    591 /* zero_2d is similar as zero_2, with geometry duplicated in mirror along Z axis */
    592 static const unsigned
    593 zero_2d_vertices_count = 72;
    594 
    595 static const unsigned
    596 zero_2d_triangles_count = 120;
    597 
    598 static const double
    599 zero_2d_vertices[72][3] = {
    600    { 0, 10, -11 },
    601    { 0, 0, -11 },
    602    { 0, 10, -1 },
    603    { 0, 0, -1 },
    604    { 10, 0, -1 },
    605    { 10, 0, -11 },
    606    { 9, 9, 0 },
    607    { 10, 10, -11 },
    608    { 1, 9, -10 },
    609    { 1, 1, -10 },
    610    { 1, 9, -2 },
    611    { 1, 1, -2 },
    612    { 9, 1, -2 },
    613    { 9, 1, -10 },
    614    { 9, 9, -10 },
    615    { 2, 8, -9 },
    616    { 2, 2, -9 },
    617    { 2, 8, -3 },
    618    { 2, 2, -3 },
    619    { 8, 2, -3 },
    620    { 8, 2, -9 },
    621    { 8, 8, -9 },
    622    { 3, 7, -8 },
    623    { 3, 3, -8 },
    624    { 3, 7, -4 },
    625    { 3, 3, -4 },
    626    { 7, 3, -4 },
    627    { 7, 3, -8 },
    628    { 7, 7, -8 },
    629    { 4, 6, -7 },
    630    { 4, 4, -7 },
    631    { 4, 6, -5 },
    632    { 4, 4, -5 },
    633    { 6, 4, -5 },
    634    { 6, 4, -7 },
    635    { 6, 6, -7 },
    636    { 0, 10, 11 },
    637    { 0, 0, 11 },
    638    { 0, 10, 1 },
    639    { 0, 0, 1 },
    640    { 10, 0, 1 },
    641    { 10, 0, 11 },
    642    { 9, 9, 0.1 }, /* Vertex #42 == vertex #6 => keep a dummy placeholder here and use #6 instead in triangles */
    643    { 10, 10, 11 },
    644    { 1, 9, 10 },
    645    { 1, 1, 10 },
    646    { 1, 9, 2 },
    647    { 1, 1, 2 },
    648    { 9, 1, 2 },
    649    { 9, 1, 10 },
    650    { 9, 9, 10 },
    651    { 2, 8, 9 },
    652    { 2, 2, 9 },
    653    { 2, 8, 3 },
    654    { 2, 2, 3 },
    655    { 8, 2, 3 },
    656    { 8, 2, 9 },
    657    { 8, 8, 9 },
    658    { 3, 7, 8 },
    659    { 3, 3, 8 },
    660    { 3, 7, 4 },
    661    { 3, 3, 4 },
    662    { 7, 3, 4 },
    663    { 7, 3, 8 },
    664    { 7, 7, 8 },
    665    { 4, 6, 7 },
    666    { 4, 4, 7 },
    667    { 4, 6, 5 },
    668    { 4, 4, 5 },
    669    { 6, 4, 5 },
    670    { 6, 4, 7 },
    671    { 6, 6, 7 }
    672 };
    673 
    674 static const unsigned
    675 zero_2d_triangles[120][3] = {
    676    { 0, 1, 2 },
    677    { 1, 3, 2 },
    678    { 4, 5, 6 },
    679    { 5, 7, 6 },
    680    { 2, 3, 4 },
    681    { 6, 2, 4 },
    682    { 5, 1, 0 },
    683    { 7, 5, 0 },
    684    { 3, 1, 5 },
    685    { 4, 3, 5 },
    686    { 7, 0, 2 },
    687    { 6, 7, 2 },
    688    { 8, 9, 10 },
    689    { 9, 11, 10 },
    690    { 12, 13, 6 },
    691    { 13, 14, 6 },
    692    { 10, 11, 12 },
    693    { 6, 10, 12 },
    694    { 13, 9, 8 },
    695    { 14, 13, 8 },
    696    { 11, 9, 13 },
    697    { 12, 11, 13 },
    698    { 14, 8, 10 },
    699    { 6, 14, 10 },
    700    { 15, 16, 17 },
    701    { 16, 18, 17 },
    702    { 19, 20, 6 },
    703    { 20, 21, 6 },
    704    { 17, 18, 19 },
    705    { 6, 17, 19 },
    706    { 20, 16, 15 },
    707    { 21, 20, 15 },
    708    { 18, 16, 20 },
    709    { 19, 18, 20 },
    710    { 21, 15, 17 },
    711    { 6, 21, 17 },
    712    { 22, 23, 24 },
    713    { 23, 25, 24 },
    714    { 26, 27, 6 },
    715    { 27, 28, 6 },
    716    { 24, 25, 26 },
    717    { 6, 24, 26 },
    718    { 27, 23, 22 },
    719    { 28, 27, 22 },
    720    { 25, 23, 27 },
    721    { 26, 25, 27 },
    722    { 28, 22, 24 },
    723    { 6, 28, 24 },
    724    { 29, 30, 31 },
    725    { 30, 32, 31 },
    726    { 33, 34, 6 },
    727    { 34, 35, 6 },
    728    { 31, 32, 33 },
    729    { 6, 31, 33 },
    730    { 34, 30, 29 },
    731    { 35, 34, 29 },
    732    { 32, 30, 34 },
    733    { 33, 32, 34 },
    734    { 35, 29, 31 },
    735    { 6, 35, 31 },
    736    { 36, 37, 38 },
    737    { 37, 39, 38 },
    738    { 40, 41, 6 },
    739    { 41, 43, 6 },
    740    { 38, 39, 40 },
    741    { 6, 38, 40 },
    742    { 41, 37, 36 },
    743    { 43, 41, 36 },
    744    { 39, 37, 41 },
    745    { 40, 39, 41 },
    746    { 43, 36, 38 },
    747    { 6, 43, 38 },
    748    { 44, 45, 46 },
    749    { 45, 47, 46 },
    750    { 48, 49, 6 },
    751    { 49, 50, 6 },
    752    { 46, 47, 48 },
    753    { 6, 46, 48 },
    754    { 49, 45, 44 },
    755    { 50, 49, 44 },
    756    { 47, 45, 49 },
    757    { 48, 47, 49 },
    758    { 50, 44, 46 },
    759    { 6, 50, 46 },
    760    { 51, 52, 53 },
    761    { 52, 54, 53 },
    762    { 55, 56, 6 },
    763    { 56, 57, 6 },
    764    { 53, 54, 55 },
    765    { 6, 53, 55 },
    766    { 56, 52, 51 },
    767    { 57, 56, 51 },
    768    { 54, 52, 56 },
    769    { 55, 54, 56 },
    770    { 57, 51, 53 },
    771    { 6, 57, 53 },
    772    { 58, 59, 60 },
    773    { 59, 61, 60 },
    774    { 62, 63, 6 },
    775    { 63, 64, 6 },
    776    { 60, 61, 62 },
    777    { 6, 60, 62 },
    778    { 63, 59, 58 },
    779    { 64, 63, 58 },
    780    { 61, 59, 63 },
    781    { 62, 61, 63 },
    782    { 64, 58, 60 },
    783    { 6, 64, 60 },
    784    { 65, 66, 67 },
    785    { 66, 68, 67 },
    786    { 69, 70, 6 },
    787    { 70, 71, 6 },
    788    { 67, 68, 69 },
    789    { 6, 67, 69 },
    790    { 70, 66, 65 },
    791    { 71, 70, 65 },
    792    { 68, 66, 70 },
    793    { 69, 68, 70 },
    794    { 71, 65, 67 },
    795    { 6, 71, 67 }
    796 };
    797 
    798 static const unsigned
    799 zero_2d_properties[120][3] = {
    800    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    801    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    802    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    803    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    804    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    805    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    806    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    807    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    808    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    809    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    810    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    811    { 0, zero_2_UNSPECIFIED_PROPERTY, 5 },
    812    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    813    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    814    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    815    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    816    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    817    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    818    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    819    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    820    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    821    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    822    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    823    { 1, 0, zero_2_UNSPECIFIED_PROPERTY },
    824    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    825    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    826    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    827    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    828    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    829    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    830    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    831    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    832    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    833    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    834    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    835    { 2, 1, zero_2_UNSPECIFIED_PROPERTY },
    836    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    837    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    838    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    839    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    840    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    841    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    842    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    843    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    844    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    845    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    846    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    847    { 3, 2, zero_2_UNSPECIFIED_PROPERTY },
    848    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    849    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    850    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    851    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    852    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    853    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    854    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    855    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    856    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    857    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    858    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    859    { 4, 3, zero_2_UNSPECIFIED_PROPERTY },
    860    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    861    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    862    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    863    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    864    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    865    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    866    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    867    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    868    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    869    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    870    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    871    { zero_2_UNSPECIFIED_PROPERTY, 0, 5 },
    872    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    873    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    874    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    875    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    876    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    877    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    878    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    879    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    880    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    881    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    882    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    883    { 0, 1, zero_2_UNSPECIFIED_PROPERTY },
    884    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    885    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    886    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    887    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    888    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    889    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    890    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    891    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    892    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    893    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    894    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    895    { 1, 2, zero_2_UNSPECIFIED_PROPERTY },
    896    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    897    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    898    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    899    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    900    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    901    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    902    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    903    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    904    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    905    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    906    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    907    { 2, 3, zero_2_UNSPECIFIED_PROPERTY },
    908    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    909    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    910    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    911    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    912    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    913    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    914    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    915    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    916    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    917    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    918    { 3, 4, zero_2_UNSPECIFIED_PROPERTY },
    919    { 3, 4, zero_2_UNSPECIFIED_PROPERTY }
    920 };
    921 
    922 /* zero_2D is similar as zero_2d, with a tiny distance between mirrored
    923  * geometries */
    924 static const double
    925 zero_2D_vertices[72][3] = {
    926    { 0, 10, -11 },
    927    { 0, 0, -11 },
    928    { 0, 10, -1 },
    929    { 0, 0, -1 },
    930    { 10, 0, -1 },
    931    { 10, 0, -11 },
    932    { 9, 9, 0 },
    933    { 10, 10, -11 },
    934    { 1, 9, -10 },
    935    { 1, 1, -10 },
    936    { 1, 9, -2 },
    937    { 1, 1, -2 },
    938    { 9, 1, -2 },
    939    { 9, 1, -10 },
    940    { 9, 9, -10 },
    941    { 2, 8, -9 },
    942    { 2, 2, -9 },
    943    { 2, 8, -3 },
    944    { 2, 2, -3 },
    945    { 8, 2, -3 },
    946    { 8, 2, -9 },
    947    { 8, 8, -9 },
    948    { 3, 7, -8 },
    949    { 3, 3, -8 },
    950    { 3, 7, -4 },
    951    { 3, 3, -4 },
    952    { 7, 3, -4 },
    953    { 7, 3, -8 },
    954    { 7, 7, -8 },
    955    { 4, 6, -7 },
    956    { 4, 4, -7 },
    957    { 4, 6, -5 },
    958    { 4, 4, -5 },
    959    { 6, 4, -5 },
    960    { 6, 4, -7 },
    961    { 6, 6, -7 },
    962    { 0, 10, 11 },
    963    { 0, 0, 11 },
    964    { 0, 10, 1 },
    965    { 0, 0, 1 },
    966    { 10, 0, 1 },
    967    { 10, 0, 11 },
    968    { 9, 9, 1e-30 },
    969    { 10, 10, 11 },
    970    { 1, 9, 10 },
    971    { 1, 1, 10 },
    972    { 1, 9, 2 },
    973    { 1, 1, 2 },
    974    { 9, 1, 2 },
    975    { 9, 1, 10 },
    976    { 9, 9, 10 },
    977    { 2, 8, 9 },
    978    { 2, 2, 9 },
    979    { 2, 8, 3 },
    980    { 2, 2, 3 },
    981    { 8, 2, 3 },
    982    { 8, 2, 9 },
    983    { 8, 8, 9 },
    984    { 3, 7, 8 },
    985    { 3, 3, 8 },
    986    { 3, 7, 4 },
    987    { 3, 3, 4 },
    988    { 7, 3, 4 },
    989    { 7, 3, 8 },
    990    { 7, 7, 8 },
    991    { 4, 6, 7 },
    992    { 4, 4, 7 },
    993    { 4, 6, 5 },
    994    { 4, 4, 5 },
    995    { 6, 4, 5 },
    996    { 6, 4, 7 },
    997    { 6, 6, 7 }
    998 };
    999 
   1000 #define zero_2D_triangles zero_2d_triangles
   1001 
   1002 #define zero_2D_properties zero_2d_properties
   1003 static unsigned zero_2D_triangles_count = zero_2d_triangles_count;
   1004 static unsigned zero_2D_vertices_count = zero_2d_vertices_count;
   1005 
   1006 
   1007 /* Enclosures' order is consistent accross runs as they are sorted by triangle
   1008  * sides, thus allowing to expect a given order */
   1009 struct expected {
   1010   unsigned enclosure_count; /* max 16 */
   1011   double volume[16]; /* the volume of the expected enclosures */
   1012   unsigned medium[16]; /* the single medium of the expected enclosures */
   1013 };
   1014 
   1015 static int
   1016 test
   1017   (const double* positions,
   1018    const unsigned* indices,
   1019    const unsigned* properties,
   1020    const unsigned triangles_count,
   1021    const unsigned vertices_count,
   1022    const struct expected* expected)
   1023 {
   1024   struct mem_allocator allocator;
   1025   struct senc3d_device* dev = NULL;
   1026   struct senc3d_scene* scn = NULL;
   1027   struct context ctx = CONTEXT_NULL__;
   1028   unsigned count, e, n;
   1029 
   1030   OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator));
   1031   OK(senc3d_device_create(NULL, &allocator, SENC3D_NTHREADS_DEFAULT, 1, &dev));
   1032 
   1033   FOR_EACH(n, 0, 2) {
   1034     /* Create a scene with 4 enclosures joining at a single vertex. */
   1035     ctx.positions = positions;
   1036     ctx.indices = indices;
   1037     ctx.properties = properties;
   1038 
   1039     /* If n==1, same model with symmetry / origin
   1040      * (need to reverse vertices' order to keep same inside/outside) */
   1041     ctx.scale = (n == 1) ? -1 : +1;
   1042     ctx.reverse_vrtx = (n == 1) ? 1 : 0;
   1043 
   1044     OK(senc3d_scene_create(dev,
   1045       SENC3D_CONVENTION_NORMAL_BACK | SENC3D_CONVENTION_NORMAL_OUTSIDE,
   1046       triangles_count, get_indices, get_media_from_properties,
   1047       vertices_count, get_position, &ctx, &scn));
   1048 
   1049     OK(senc3d_scene_get_vertices_count(scn, &count));
   1050     CHK(count == vertices_count);
   1051 
   1052     OK(senc3d_scene_get_triangles_count(scn, &count));
   1053     CHK(count == triangles_count);
   1054 
   1055     OK(senc3d_scene_get_enclosure_count(scn, &count));
   1056     CHK(count == expected->enclosure_count);
   1057 
   1058     FOR_EACH(e, 0, count) {
   1059       struct senc3d_enclosure* enclosure;
   1060       struct senc3d_enclosure_header header;
   1061       unsigned m;
   1062       char name[128]; (void)name;
   1063       OK(senc3d_scene_get_enclosure(scn, e, &enclosure));
   1064       OK(senc3d_enclosure_get_header(enclosure, &header));
   1065       CHK(header.enclosed_media_count == 1);
   1066       OK(senc3d_enclosure_get_medium(enclosure, 0, &m));
   1067       CHK(m == expected->medium[e]);
   1068       CHK(eq_eps(header.volume, expected->volume[e], 0.01));
   1069       OK(senc3d_enclosure_ref_put(enclosure));
   1070 #ifdef DUMP_ENCLOSURES
   1071       snprintf(name, sizeof(name), "test_zero_distance_%u.obj", e);
   1072       dump_enclosure(scn, e, name);
   1073 #endif
   1074     }
   1075 
   1076     OK(senc3d_scene_ref_put(scn));
   1077   }
   1078 
   1079   OK(senc3d_device_ref_put(dev));
   1080 
   1081   check_memory_allocator(&allocator);
   1082   mem_shutdown_proxy_allocator(&allocator);
   1083   CHK(mem_allocated_size() == 0);
   1084   return 0;
   1085 }
   1086 
   1087 int
   1088 main(int argc, char** argv)
   1089 {
   1090   struct expected expected;
   1091   (void)argc, (void)argv;
   1092 
   1093   expected.enclosure_count = 4;
   1094   expected.medium[0] = SENC3D_UNSPECIFIED_MEDIUM;
   1095   expected.volume[0] = -966.67;
   1096   expected.medium[1] = 0;
   1097   expected.volume[1] = 647.33;
   1098   expected.medium[2] = 1;
   1099   expected.volume[2] = 150;
   1100   expected.medium[3] = 1;
   1101   expected.volume[3] = 169.33;
   1102   test((double *)zero_1_vertices, (unsigned*)zero_1_triangles,
   1103     (unsigned *)zero_1_properties, zero_1_triangles_count,
   1104     zero_1_vertices_count, &expected);
   1105 
   1106   expected.enclosure_count = 7;
   1107   expected.medium[0] = SENC3D_UNSPECIFIED_MEDIUM;
   1108   expected.volume[0] = -1933.33;
   1109   expected.medium[1] = 0;
   1110   expected.volume[1] = 647.33;
   1111   expected.medium[2] = 1;
   1112   expected.volume[2] = 150;
   1113   expected.medium[3] = 1;
   1114   expected.volume[3] = 169.33;
   1115   expected.medium[4] = 0;
   1116   expected.volume[4] = 647.33;
   1117   expected.medium[5] = 1;
   1118   expected.volume[5] = 150;
   1119   expected.medium[6] = 1;
   1120   expected.volume[6] = 169.33;
   1121   test((double *)zero_1d_vertices, (unsigned*)zero_1d_triangles,
   1122     (unsigned *)zero_1d_properties, zero_1d_triangles_count,
   1123     zero_1d_vertices_count, &expected);
   1124 
   1125   test((double *)zero_1D_vertices, (unsigned*)zero_1D_triangles,
   1126     (unsigned *)zero_1D_properties, zero_1D_triangles_count,
   1127     zero_1D_vertices_count, &expected);
   1128 
   1129   expected.enclosure_count = 6;
   1130   expected.medium[0] = SENC3D_UNSPECIFIED_MEDIUM;
   1131   expected.volume[0] = -966.67;
   1132   expected.medium[1] = 0;
   1133   expected.volume[1] = 433.33;
   1134   expected.medium[2] = 1;
   1135   expected.volume[2] = 281.33;
   1136   expected.medium[3] = 2;
   1137   expected.volume[3] = 161.33;
   1138   expected.medium[4] = 3;
   1139   expected.volume[4] = 73.33;
   1140   expected.medium[5] = 4;
   1141   expected.volume[5] = 17.33;
   1142   test((double*)zero_2_vertices, (unsigned*)zero_2_triangles,
   1143     (unsigned*)zero_2_properties, zero_2_triangles_count,
   1144     zero_2_vertices_count, &expected);
   1145 
   1146   expected.enclosure_count = 11;
   1147   expected.medium[0] = SENC3D_UNSPECIFIED_MEDIUM;
   1148   expected.volume[0] = -1933.33;
   1149   expected.medium[1] = 0;
   1150   expected.volume[1] = 433.33;
   1151   expected.medium[2] = 1;
   1152   expected.volume[2] = 281.33;
   1153   expected.medium[3] = 2;
   1154   expected.volume[3] = 161.33;
   1155   expected.medium[4] = 3;
   1156   expected.volume[4] = 73.33;
   1157   expected.medium[5] = 4;
   1158   expected.volume[5] = 17.33;
   1159   expected.medium[6] = 0;
   1160   expected.volume[6] = 433.33;
   1161   expected.medium[7] = 1;
   1162   expected.volume[7] = 281.33;
   1163   expected.medium[8] = 2;
   1164   expected.volume[8] = 161.33;
   1165   expected.medium[9] = 3;
   1166   expected.volume[9] = 73.33;
   1167   expected.medium[10] = 4;
   1168   expected.volume[10] = 17.33;
   1169   test((double*)zero_2d_vertices, (unsigned*)zero_2d_triangles,
   1170     (unsigned*)zero_2d_properties, zero_2d_triangles_count,
   1171     zero_2d_vertices_count, &expected);
   1172 
   1173   test((double*)zero_2D_vertices, (unsigned*)zero_2D_triangles,
   1174     (unsigned*)zero_2D_properties, zero_2D_triangles_count,
   1175     zero_2D_vertices_count, &expected);
   1176 
   1177   return 0;
   1178 }