test_sdis_source.c (4275B)
1 /* Copyright (C) 2016-2025 |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 "sdis.h" 17 #include "test_sdis_utils.h" 18 19 /******************************************************************************* 20 * Helper functions 21 ******************************************************************************/ 22 static void 23 spherical_source_get_position 24 (const double time, 25 double pos[3], 26 struct sdis_data* data) 27 { 28 (void)time, (void)data; 29 pos[0] = pos[1] = pos[2] = 1.234; /* [m] */ 30 } 31 32 static double 33 spherical_source_get_power 34 (const double time, 35 struct sdis_data* data) 36 { 37 (void)time, (void)data; 38 return 10; /* [W] */ 39 } 40 41 static double 42 spherical_source_get_diffuse_radiance 43 (const double time, 44 const double dir[3], 45 struct sdis_data* data) 46 { 47 (void)time, (void)dir, (void)data; 48 return 50; /* [W/m^2/sr] */ 49 } 50 51 static void 52 check_spherical_source(struct sdis_device* dev) 53 { 54 struct sdis_spherical_source_shader shader = SDIS_SPHERICAL_SOURCE_SHADER_NULL; 55 struct sdis_spherical_source_shader shader2= SDIS_SPHERICAL_SOURCE_SHADER_NULL; 56 struct sdis_source* src = NULL; 57 struct sdis_source* src2 = NULL; 58 struct sdis_data* data = NULL; 59 const double dir[3] = {1,0,0}; 60 61 /* Create a data to check its memory management */ 62 OK(sdis_data_create(dev, sizeof(double[3]), ALIGNOF(double[3]), NULL, &data)); 63 64 shader.position = spherical_source_get_position; 65 shader.power = spherical_source_get_power; 66 shader.radius = 1; 67 BA(sdis_spherical_source_create(NULL, &shader, data, &src)); 68 BA(sdis_spherical_source_create(dev, NULL, data, &src)); 69 BA(sdis_spherical_source_create(dev, &shader, data, NULL)); 70 OK(sdis_spherical_source_create(dev, &shader, data, &src)); 71 72 BA(sdis_spherical_source_get_shader(NULL, &shader2)); 73 BA(sdis_spherical_source_get_shader(src, NULL)); 74 OK(sdis_spherical_source_get_shader(src, &shader2)); 75 76 CHK(sdis_source_get_data(src) == data); 77 78 CHK(shader2.position == shader.position); 79 CHK(shader2.power == shader.power); 80 CHK(shader2.diffuse_radiance == shader.diffuse_radiance); 81 CHK(shader2.power(INF, data) == 10); 82 83 BA(sdis_source_ref_get(NULL)); 84 OK(sdis_source_ref_get(src)); 85 BA(sdis_source_ref_put(NULL)); 86 OK(sdis_source_ref_put(src)); 87 OK(sdis_source_ref_put(src)); 88 89 OK(sdis_data_ref_put(data)); 90 91 OK(sdis_spherical_source_create(dev, &shader, NULL, &src)); 92 OK(sdis_spherical_source_create(dev, &shader, NULL, &src2)); 93 CHK(sdis_source_get_id(src) != sdis_source_get_id(src2)); 94 CHK(sdis_source_get_data(src) == NULL); 95 OK(sdis_source_ref_put(src)); 96 OK(sdis_source_ref_put(src2)); 97 98 shader.position = NULL; 99 BA(sdis_spherical_source_create(dev, &shader, NULL, &src)); 100 shader.position = spherical_source_get_position; 101 shader.power = NULL; 102 BA(sdis_spherical_source_create(dev, &shader, NULL, &src)); 103 shader.power = spherical_source_get_power; 104 shader.diffuse_radiance = spherical_source_get_diffuse_radiance; 105 OK(sdis_spherical_source_create(dev, &shader, NULL, &src)); 106 107 OK(sdis_spherical_source_get_shader(src, &shader2)); 108 CHK(shader2.diffuse_radiance = spherical_source_get_diffuse_radiance); 109 CHK(shader2.diffuse_radiance(INF, dir, NULL) == 50); 110 111 OK(sdis_source_ref_put(src)); 112 } 113 114 /******************************************************************************* 115 * The test 116 ******************************************************************************/ 117 int 118 main(int argc, char** argv) 119 { 120 struct sdis_device* dev = NULL; 121 (void)argc, (void)argv; 122 123 OK(sdis_device_create(&SDIS_DEVICE_CREATE_ARGS_DEFAULT, &dev)); 124 125 check_spherical_source(dev); 126 127 OK(sdis_device_ref_put(dev)); 128 CHK(mem_allocated_size() == 0); 129 return 0; 130 }