star-phor-input

File format for describing photoreactor configurations
git clone https://www.edstar.cnrs.fr/git/star-phor-input.git
Log | Files | Refs | README | LICENSE

test_sphin_load_brdf_btdf.c (11705B)


      1 /* Copyright (C) 2024-2026 Centre National de la Recherche Scientifique
      2  * Copyright (C) 2024-2026 Clermont Auvergne INP
      3  * Copyright (C) 2024-2026 INSA Lyon
      4  * Copyright (C) 2024-2026 Institut Mines Télécom Albi-Carmaux
      5  * Copyright (C) 2024-2026 Institut National Polytechnique de Toulouse
      6  * Copyright (C) 2024-2026 |Méso|Star> (contact@meso-star.com)
      7  * Copyright (C) 2024-2026 PhotonLyX (info@photonlyx.com)
      8  * Copyright (C) 2024-2026 Université de Lorraine
      9  * Copyright (C) 2024-2026 Université Paul Sabatier
     10  * Copyright (C) 2024-2026 Université Toulouse - Jean Jaurès
     11  *
     12  * This program is free software: you can redistribute it and/or modify
     13  * it under the terms of the GNU General Public License as published by
     14  * the Free Software Foundation, either version 3 of the License, or
     15  * (at your option) any later version.
     16  *
     17  * This program is distributed in the hope that it will be useful,
     18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     20  * GNU General Public License for more details.
     21  *
     22  * You should have received a copy of the GNU General Public License
     23  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     24 
     25 #include "sphin.h"
     26 
     27 #include <rsys/math.h>
     28 #include <rsys/mem_allocator.h>
     29 #include <rsys/rsys.h>
     30 
     31 #include <stdio.h>
     32 #include <string.h>
     33 
     34 struct sphin;
     35 
     36 static void
     37 write_stl_test_files
     38   (void)
     39 {
     40   FILE* file;
     41   static const char* test0 =
     42     "solid\n"
     43     "  facet normal 0.0 -1.0 0.0\n"
     44     "    outer loop\n"
     45     "      vertex 0.0 0.0 0.0\n"
     46     "      vertex 1.0 0.0 0.0\n"
     47     "      vertex 0.0 0.0 1.0\n"
     48     "    endloop\n"
     49     "  endfacet\n"
     50     "endsolid";
     51   static const char* test1 =
     52     "solid my_solid\n"
     53     "endsolid my_solid\n";
     54   static const char* test2 = /* Bad geometry => sstl should return
     55                                 RES_BAD_ARG */
     56     "solid\n"
     57     "  facet normal 0.0 -1.0 0.0\n"
     58     "    outer loop\n"
     59     "      vertex 0.0 0.0 0.0\n"
     60     "      vertex 1.0 0.0\n"
     61     "      vertex 0.0 0.0 1.0\n"
     62     "    endloop\n"
     63     "  endfacet\n"
     64     "endsolid";
     65   static const char* test3 = /* Noisy geometry => sstl should accept it */
     66     "solid my_solid\n"
     67     "\n"
     68     "  facet normal 0.0 -1.0 0.0\n"
     69     "    outer loop     hophophophophop\n"
     70     "      vertex\t  0.0      0.0 0.0\n"
     71     "      vertex 1.0   0.0 0.0     \taaa\n"
     72     "      vertex 0.0   0.0\t 1.0\n"
     73     "    endloop   \n"
     74     "  endfacet   \t\t\t noise\n"
     75     "endsolid pouet\n";
     76   file = fopen("test_0.stl", "w");
     77   CHK(file != NULL);
     78   fwrite(test0, sizeof(char), strlen(test0), file);
     79   fclose(file);
     80   file = fopen("test_1.stl", "w");
     81   CHK(file != NULL);
     82   fwrite(test1, sizeof(char), strlen(test1), file);
     83   fclose(file);
     84   file = fopen("test_2.stl", "w");
     85   CHK(file != NULL);
     86   fwrite(test2, sizeof(char), strlen(test2), file);
     87   fclose(file);
     88   file = fopen("test_3.stl", "w");
     89   CHK(file != NULL);
     90   fwrite(test3, sizeof(char), strlen(test3), file);
     91   fclose(file);
     92 }
     93 
     94 static void
     95 write_spec_rad_test_files
     96   (void)
     97 {
     98   FILE* file;
     99   static const char* test0 =
    100     "100 1\n"
    101     "200 2\n"
    102     "300 3\n"
    103     "400 4\n";
    104   file = fopen("spectral_property.txt", "w");
    105   CHK(file != NULL);
    106   fwrite(test0, sizeof(char), strlen(test0), file);
    107   fclose(file);
    108 }
    109 
    110 static void
    111 test_brdf_btdf_api
    112   (struct sphin* sphin)
    113 {
    114   const char* path = "file.txt";
    115   enum sphin_brdf_direction_distribution brdf_dir_dist
    116     = SPHIN_BRDF_DIRECTION_NONE__;
    117   enum sphin_brdf_reflectivity_type reflectivity_type
    118     = SPHIN_BRDF_REFLECTIVITY_NONE__;
    119   enum sphin_btdf_direction_distribution btdf_dir_dist
    120     = SPHIN_BTDF_DIRECTION_NONE__;
    121   enum sphin_btdf_transmissivity_type transmissivity_type
    122     = SPHIN_BTDF_TRANSMISSIVITY_NONE__;
    123   struct sphin_brdf* brdf = NULL;
    124   struct sphin_btdf* btdf = NULL;
    125   struct sphin_config* config = NULL;
    126   struct sphin_surface* surface = NULL;
    127   struct sphin_spectral_property* spec_prop;
    128   FILE* fp = NULL;
    129 
    130   CHK(fp = fopen(path, "w+"));
    131   fprintf(fp, "\t\t surface : \"surface\"\n");
    132   fprintf(fp, "\tbrdf: LAMBERT spectral_property.txt # my comment\n");
    133   fprintf(fp, "\tbtdf: LAMBERT spectral_property.txt # my comment\n");
    134   fprintf(fp, "\tgeometry: FRONT test_0.stl\n");
    135 
    136   fprintf(fp, "surface: \"other surface\"\n");
    137   fprintf(fp, "\tgeometry: FRONT test_0.stl\n");
    138   fprintf(fp, "\tbrdf\t : SPECULAR FRESNEL_DIELECTRIC_CONDUCTOR \n");
    139   fprintf(fp, "\tbtdf\t : KEEP_CURRENT_DIR FRESNEL_DIELECTRIC_CONDUCTOR\n");
    140 
    141   fprintf(fp, "surface: \"yet another surface\"\n");
    142   fprintf(fp, "\tgeometry: FRONT test_0.stl\n");
    143   fprintf(fp, "\tbrdf\t : SPECULAR FRESNEL_DIELECTRIC \n");
    144   fprintf(fp, "\tbtdf\t : SNELL_DIELECTRIC FRESNEL_DIELECTRIC  \t \n");
    145   fclose(fp);
    146 
    147   CHK(sphin_load(sphin, path, &config) == RES_OK);
    148   /* Test surface 0 */
    149   CHK(sphin_config_get_surface(config, 0, &surface) == RES_OK);
    150   /* Test brdf */
    151   CHK(sphin_surface_get_brdf(NULL, NULL) == RES_BAD_ARG);
    152   CHK(sphin_surface_get_brdf(surface, NULL) == RES_BAD_ARG);
    153   CHK(sphin_surface_get_brdf(NULL, &brdf) == RES_BAD_ARG);
    154   CHK(sphin_surface_get_brdf(surface, &brdf) == RES_OK);
    155   CHK(sphin_brdf_get_direction_distribution(NULL, NULL) == RES_BAD_ARG);
    156   CHK(sphin_brdf_get_direction_distribution(NULL, &brdf_dir_dist) == RES_BAD_ARG);
    157   CHK(sphin_brdf_get_direction_distribution(brdf, NULL) == RES_BAD_ARG);
    158   CHK(sphin_brdf_get_direction_distribution(brdf, &brdf_dir_dist) == RES_OK);
    159   CHK(brdf_dir_dist == SPHIN_BRDF_DIRECTION_LAMBERT);
    160   CHK(sphin_brdf_get_reflectivity_type(NULL, NULL) == RES_BAD_ARG);
    161   CHK(sphin_brdf_get_reflectivity_type(NULL, &reflectivity_type) == RES_BAD_ARG);
    162   CHK(sphin_brdf_get_reflectivity_type(brdf, NULL) == RES_BAD_ARG);
    163   CHK(sphin_brdf_get_reflectivity_type(brdf, &reflectivity_type) == RES_OK);
    164   CHK(reflectivity_type == SPHIN_BRDF_REFLECTIVITY_TABULATED);
    165   CHK(sphin_brdf_get_reflectivity_value(NULL, NULL) == RES_BAD_ARG);
    166   CHK(sphin_brdf_get_reflectivity_value(brdf, NULL) == RES_BAD_ARG);
    167   CHK(sphin_brdf_get_reflectivity_value(NULL, &spec_prop) == RES_BAD_ARG);
    168   CHK(sphin_brdf_get_reflectivity_value(brdf, &spec_prop) == RES_OK);
    169   /* Test btdf */
    170   CHK(sphin_surface_get_btdf(NULL, NULL) == RES_BAD_ARG);
    171   CHK(sphin_surface_get_btdf(surface, NULL) == RES_BAD_ARG);
    172   CHK(sphin_surface_get_btdf(NULL, &btdf) == RES_BAD_ARG);
    173   CHK(sphin_surface_get_btdf(surface, &btdf) == RES_OK);
    174   CHK(sphin_btdf_get_direction_distribution(NULL, NULL) == RES_BAD_ARG);
    175   CHK(sphin_btdf_get_direction_distribution(NULL, &btdf_dir_dist) == RES_BAD_ARG);
    176   CHK(sphin_btdf_get_direction_distribution(btdf, NULL) == RES_BAD_ARG);
    177   CHK(sphin_btdf_get_direction_distribution(btdf, &btdf_dir_dist) == RES_OK);
    178   CHK(btdf_dir_dist == SPHIN_BTDF_DIRECTION_LAMBERT);
    179   CHK(sphin_btdf_get_transmissivity_type(NULL, NULL) == RES_BAD_ARG);
    180   CHK(sphin_btdf_get_transmissivity_type(NULL, &transmissivity_type) == RES_BAD_ARG);
    181   CHK(sphin_btdf_get_transmissivity_type(btdf, NULL) == RES_BAD_ARG);
    182   CHK(sphin_btdf_get_transmissivity_type(btdf, &transmissivity_type) == RES_OK);
    183   CHK(transmissivity_type == SPHIN_BTDF_TRANSMISSIVITY_TABULATED);
    184   CHK(sphin_btdf_get_transmissivity_value(NULL, NULL) == RES_BAD_ARG);
    185   CHK(sphin_btdf_get_transmissivity_value(btdf, NULL) == RES_BAD_ARG);
    186   CHK(sphin_btdf_get_transmissivity_value(NULL, &spec_prop) == RES_BAD_ARG);
    187   CHK(sphin_btdf_get_transmissivity_value(btdf, &spec_prop) == RES_OK);
    188 
    189   /* Test surface 1 */
    190   CHK(sphin_config_get_surface(config, 1, &surface) == RES_OK);
    191   /* Test brdf */
    192   CHK(sphin_surface_get_brdf(surface, &brdf) == RES_OK);
    193   CHK(sphin_brdf_get_direction_distribution(brdf, &brdf_dir_dist) == RES_OK);
    194   CHK(brdf_dir_dist == SPHIN_BRDF_DIRECTION_SPECULAR);
    195   CHK(sphin_brdf_get_reflectivity_type(brdf, &reflectivity_type) == RES_OK);
    196   CHK(reflectivity_type 
    197       == SPHIN_BRDF_REFLECTIVITY_FRESNEL_DIELECTRIC_CONDUCTOR);
    198   CHK(sphin_brdf_get_reflectivity_value(brdf, &spec_prop) == RES_BAD_ARG);
    199   CHK(sphin_brdf_ref_get(brdf) == RES_OK);
    200   CHK(sphin_brdf_ref_put(brdf) == RES_OK);
    201   /* Test btdf */
    202   CHK(sphin_surface_get_btdf(surface, &btdf) == RES_OK);
    203   CHK(sphin_btdf_get_direction_distribution(btdf, &btdf_dir_dist) == RES_OK);
    204   CHK(btdf_dir_dist == SPHIN_BTDF_DIRECTION_KEEP_CURRENT_DIR);
    205   CHK(sphin_btdf_get_transmissivity_type(btdf, &transmissivity_type) == RES_OK);
    206   CHK(transmissivity_type 
    207       == SPHIN_BTDF_TRANSMISSIVITY_FRESNEL_DIELECTRIC_CONDUCTOR);
    208   CHK(sphin_btdf_get_transmissivity_value(btdf, &spec_prop) == RES_BAD_ARG);
    209   CHK(sphin_btdf_ref_get(btdf) == RES_OK);
    210   CHK(sphin_btdf_ref_put(btdf) == RES_OK);
    211 
    212   /* Test surface 2 */
    213   CHK(sphin_config_get_surface(config, 2, &surface) == RES_OK);
    214   /* Test brdf */
    215   CHK(sphin_surface_get_brdf(surface, &brdf) == RES_OK);
    216   CHK(sphin_brdf_get_direction_distribution(brdf, &brdf_dir_dist) == RES_OK);
    217   CHK(brdf_dir_dist == SPHIN_BRDF_DIRECTION_SPECULAR);
    218   CHK(sphin_brdf_get_reflectivity_type(brdf, &reflectivity_type) == RES_OK);
    219   CHK(reflectivity_type == SPHIN_BRDF_REFLECTIVITY_FRESNEL_DIELECTRIC);
    220   CHK(sphin_brdf_get_reflectivity_value(brdf, &spec_prop) == RES_BAD_ARG);
    221   /* Test btdf */
    222   CHK(sphin_surface_get_btdf(surface, &btdf) == RES_OK);
    223   CHK(sphin_btdf_get_direction_distribution(btdf, &btdf_dir_dist) == RES_OK);
    224   CHK(btdf_dir_dist == SPHIN_BTDF_DIRECTION_SNELL_DIELECTRIC);
    225   CHK(sphin_btdf_get_transmissivity_type(btdf, &transmissivity_type) == RES_OK);
    226   CHK(transmissivity_type == SPHIN_BTDF_TRANSMISSIVITY_FRESNEL_DIELECTRIC);
    227   CHK(sphin_btdf_get_transmissivity_value(btdf, &spec_prop) == RES_BAD_ARG);
    228 
    229   CHK(sphin_config_ref_put(config) == RES_OK);
    230 }
    231 
    232 static void
    233 test_load_brdf_bad_type
    234   (struct sphin* sphin)
    235 {
    236   struct sphin_config* config = NULL;
    237   const char* path = "file.txt";
    238   FILE* fp = NULL;
    239 
    240   CHK(fp = fopen(path, "w+"));
    241   fprintf(fp, "#Mot Clé   Nom\n");
    242   fprintf(fp, " surface\t: \"tube_walls\" blabla\n");
    243   fprintf(fp, "\tbrdf\t : SPETACULAR 0.5\n");
    244   fclose(fp);
    245 
    246   CHK(sphin_load(sphin, path, &config) == RES_BAD_ARG);
    247 }
    248 
    249 static void
    250 test_load_brdf_bad_value
    251   (struct sphin* sphin)
    252 {
    253   struct sphin_config* config = NULL;
    254   const char* path = "file.txt";
    255   FILE* fp = NULL;
    256 
    257   CHK(fp = fopen(path, "w+"));
    258   fprintf(fp, "#Mot Clé   Nom\n");
    259   fprintf(fp, " surface\t: \"tube_walls\" blabla\n");
    260   fprintf(fp, "\tbrdf\t : SPECULAR x\n");
    261   fclose(fp);
    262 
    263   CHK(sphin_load(sphin, path, &config) == RES_BAD_ARG);
    264 }
    265 
    266 static void
    267 test_load_btdf_bad_type
    268   (struct sphin* sphin)
    269 {
    270   struct sphin_config* config = NULL;
    271   const char* path = "file.txt";
    272   FILE* fp = NULL;
    273 
    274   CHK(fp = fopen(path, "w+"));
    275   fprintf(fp, "#Mot Clé   Nom\n");
    276   fprintf(fp, " surface\t: \"tube_walls\" blabla\n");
    277   fprintf(fp, "\tbtdf\t : CHANGE_DIR spec_file.txt\n");
    278   fclose(fp);
    279 
    280   CHK(sphin_load(sphin, path, &config) == RES_BAD_ARG);
    281 }
    282 
    283 static void
    284 test_load_btdf_bad_value
    285   (struct sphin* sphin)
    286 {
    287   struct sphin_config* config = NULL;
    288   const char* path = "file.txt";
    289   FILE* fp = NULL;
    290 
    291   CHK(fp = fopen(path, "w+"));
    292   fprintf(fp, "#Mot Clé   Nom\n");
    293   fprintf(fp, " surface\t: \"tube_walls\" blabla\n");
    294   fprintf(fp, "\tbtdf\t : SNELL_DIELECTRIC x\n");
    295   fclose(fp);
    296 
    297   CHK(sphin_load(sphin, path, &config) == RES_BAD_ARG);
    298 }
    299 
    300 int
    301 main(int argc, char** argv)
    302 {
    303   struct sphin* sphin = NULL;
    304   struct sphin_create_args args = SPHIN_CREATE_ARGS_DEFAULT;
    305 
    306   (void)argc;
    307   (void)argv;
    308 
    309   args.verbose = 1;
    310   sphin_create(&args, &sphin);
    311 
    312   write_stl_test_files();
    313   write_spec_rad_test_files();
    314   test_brdf_btdf_api(sphin);
    315   test_load_brdf_bad_type(sphin);
    316   test_load_brdf_bad_value(sphin);
    317   test_load_btdf_bad_type(sphin);
    318   test_load_btdf_bad_value(sphin);
    319 
    320   CHK(sphin_ref_put(sphin) == RES_OK);
    321 
    322   CHK(mem_allocated_size() == 0);
    323   return 0;
    324 }