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 }