solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

test_ssol_material.c (12924B)


      1 /* Copyright (C) 2018-2026 |Meso|Star> (contact@meso-star.com)
      2  * Copyright (C) 2016, 2018 CNRS
      3  *
      4  * This program is free software: you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation, either version 3 of the License, or
      7  * (at your option) any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     12  * GNU General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     16 
     17 #include "ssol.h"
     18 #include "test_ssol_utils.h"
     19 #include "test_ssol_materials.h"
     20 
     21 static void
     22 test_mirror(struct ssol_device* dev)
     23 {
     24   struct ssol_mirror_shader mirror = SSOL_MIRROR_SHADER_NULL;
     25   struct ssol_param_buffer* pbuf = NULL;
     26   struct ssol_material* material;
     27   enum ssol_material_type type;
     28 
     29   CHK(ssol_material_create_mirror(NULL, NULL) == RES_BAD_ARG);
     30   CHK(ssol_material_create_mirror(NULL, &material) == RES_BAD_ARG);
     31   CHK(ssol_material_create_mirror(dev, NULL) == RES_BAD_ARG);
     32   CHK(ssol_material_create_mirror(dev, &material) == RES_OK);
     33 
     34   CHK(ssol_material_get_type(NULL, NULL) == RES_BAD_ARG);
     35   CHK(ssol_material_get_type(material, NULL) == RES_BAD_ARG);
     36   CHK(ssol_material_get_type(NULL, &type) == RES_BAD_ARG);
     37   CHK(ssol_material_get_type(material, &type) == RES_OK);
     38   CHK(type == SSOL_MATERIAL_MIRROR);
     39 
     40   CHK(ssol_material_ref_get(NULL) == RES_BAD_ARG);
     41   CHK(ssol_material_ref_get(material) == RES_OK);
     42 
     43   CHK(ssol_material_ref_put(NULL) == RES_BAD_ARG);
     44   CHK(ssol_material_ref_put(material) == RES_OK);
     45 
     46   CHK(ssol_param_buffer_create(dev, 32, &pbuf) == RES_OK);
     47 
     48   mirror.normal = get_shader_normal;
     49   mirror.reflectivity = get_shader_reflectivity;
     50   mirror.roughness = get_shader_roughness;
     51 
     52   CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__)
     53     == RES_BAD_ARG);
     54   CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__)
     55     == RES_BAD_ARG);
     56   CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__)
     57     == RES_BAD_ARG);
     58   CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__)
     59     == RES_BAD_ARG);
     60   CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG);
     61   CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG);
     62   CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG);
     63   CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) == RES_OK);
     64 
     65   CHK(ssol_material_set_param_buffer(NULL, NULL) == RES_BAD_ARG);
     66   CHK(ssol_material_set_param_buffer(material, NULL) == RES_BAD_ARG);
     67   CHK(ssol_material_set_param_buffer(NULL, pbuf) == RES_BAD_ARG);
     68   CHK(ssol_material_set_param_buffer(material, pbuf) == RES_OK);
     69 
     70   mirror.normal = NULL;
     71   CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN)
     72     == RES_BAD_ARG);
     73   mirror.normal = get_shader_normal;
     74 
     75   mirror.reflectivity = NULL;
     76   CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN)
     77     == RES_BAD_ARG);
     78   mirror.reflectivity = get_shader_reflectivity;
     79 
     80   mirror.roughness = NULL;
     81   CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN)
     82     == RES_BAD_ARG);
     83   mirror.roughness = get_shader_roughness;
     84 
     85   CHK(ssol_material_ref_put(material) == RES_OK);
     86   CHK(ssol_param_buffer_ref_put(pbuf) == RES_OK);
     87 }
     88 
     89 static void
     90 test_matte(struct ssol_device* dev)
     91 {
     92   struct ssol_matte_shader matte = SSOL_MATTE_SHADER_NULL;
     93   struct ssol_material* material;
     94   enum ssol_material_type type;
     95 
     96   CHK(ssol_material_create_matte(NULL, NULL) == RES_BAD_ARG);
     97   CHK(ssol_material_create_matte(dev, NULL) == RES_BAD_ARG);
     98   CHK(ssol_material_create_matte(NULL, &material) == RES_BAD_ARG);
     99   CHK(ssol_material_create_matte(dev, &material) == RES_OK);
    100 
    101   CHK(ssol_material_get_type(material, &type) == RES_OK);
    102   CHK(type == SSOL_MATERIAL_MATTE);
    103 
    104   matte.normal = get_shader_normal;
    105   matte.reflectivity = get_shader_reflectivity;
    106   CHK(ssol_matte_setup(NULL, NULL) == RES_BAD_ARG);
    107   CHK(ssol_matte_setup(material, NULL) == RES_BAD_ARG);
    108   CHK(ssol_matte_setup(NULL, &matte) == RES_BAD_ARG);
    109   CHK(ssol_matte_setup(material, &matte) == RES_OK);
    110 
    111   matte.normal = NULL;
    112   CHK(ssol_matte_setup(material, &matte) == RES_BAD_ARG);
    113   matte.normal = get_shader_normal;
    114   matte.reflectivity = NULL;
    115   CHK(ssol_matte_setup(material, &matte) == RES_BAD_ARG);
    116 
    117   CHK(ssol_material_ref_put(material) == RES_OK);
    118 }
    119 
    120 static void
    121 test_thin_dielectric(struct ssol_device* dev)
    122 {
    123   struct ssol_thin_dielectric_shader shader =
    124     SSOL_THIN_DIELECTRIC_SHADER_NULL;
    125   struct ssol_material* mtl;
    126   struct ssol_medium mdm0 = SSOL_MEDIUM_VACUUM;
    127   struct ssol_medium mdm1 = SSOL_MEDIUM_VACUUM;
    128   enum ssol_material_type type;
    129 
    130   CHK(ssol_material_create_thin_dielectric(NULL, NULL) == RES_BAD_ARG);
    131   CHK(ssol_material_create_thin_dielectric(dev, NULL) == RES_BAD_ARG);
    132   CHK(ssol_material_create_thin_dielectric(NULL, &mtl) == RES_BAD_ARG);
    133   CHK(ssol_material_create_thin_dielectric(dev, &mtl) == RES_OK);
    134 
    135   CHK(ssol_material_get_type(mtl, &type) == RES_OK);
    136   CHK(type == SSOL_MATERIAL_THIN_DIELECTRIC);
    137 
    138   shader.normal = get_shader_normal;
    139 
    140   CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, NULL, -1) == RES_BAD_ARG);
    141   CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, NULL, -1) == RES_BAD_ARG);
    142   CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, NULL, -1) == RES_BAD_ARG);
    143   CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, NULL, -1) == RES_BAD_ARG);
    144   CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, NULL, -1) == RES_BAD_ARG);
    145   CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, NULL, -1) == RES_BAD_ARG);
    146   CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, NULL, -1) == RES_BAD_ARG);
    147   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, NULL, -1) == RES_BAD_ARG);
    148   CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, NULL, 1) == RES_BAD_ARG);
    149   CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, NULL, 1) == RES_BAD_ARG);
    150   CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, NULL, 1) == RES_BAD_ARG);
    151   CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, NULL, 1) == RES_BAD_ARG);
    152   CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, NULL, 1) == RES_BAD_ARG);
    153   CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, NULL, 1) == RES_BAD_ARG);
    154   CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, NULL, 1) == RES_BAD_ARG);
    155   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, NULL, 1) == RES_BAD_ARG);
    156   CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, &mdm1, -1) == RES_BAD_ARG);
    157   CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, &mdm1, -1) == RES_BAD_ARG);
    158   CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, &mdm1, -1) == RES_BAD_ARG);
    159   CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, &mdm1, -1) == RES_BAD_ARG);
    160   CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, &mdm1, -1) == RES_BAD_ARG);
    161   CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, &mdm1, -1) == RES_BAD_ARG);
    162   CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, &mdm1, -1) == RES_BAD_ARG);
    163   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, -1) == RES_BAD_ARG);
    164   CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, &mdm1, 1) == RES_BAD_ARG);
    165   CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, &mdm1, 1) == RES_BAD_ARG);
    166   CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, &mdm1, 1) == RES_BAD_ARG);
    167   CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, &mdm1, 1) == RES_BAD_ARG);
    168   CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    169   CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    170   CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    171   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_OK);
    172 
    173   shader.normal = NULL;
    174   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    175   shader.normal = get_shader_normal;
    176 
    177   ssol_data_set_real(&mdm0.extinction, -1);
    178   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    179   ssol_data_copy(&mdm0.extinction, &SSOL_MEDIUM_VACUUM.extinction);
    180 
    181   ssol_data_set_real(&mdm0.refractive_index, 0);
    182   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    183   ssol_data_copy(&mdm0.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index);
    184 
    185   ssol_data_set_real(&mdm1.extinction, -1);
    186   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    187   ssol_data_copy(&mdm1.extinction, &SSOL_MEDIUM_VACUUM.extinction);
    188 
    189   ssol_data_set_real(&mdm1.refractive_index, 0);
    190   CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG);
    191   ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index);
    192 
    193   CHK(ssol_material_ref_put(mtl) == RES_OK);
    194 }
    195 
    196 static void
    197 test_dielectric(struct ssol_device* dev)
    198 {
    199   struct ssol_dielectric_shader dielectric = SSOL_DIELECTRIC_SHADER_NULL;
    200   struct ssol_material* material;
    201   struct ssol_medium mdm0 = SSOL_MEDIUM_VACUUM;
    202   struct ssol_medium mdm1 = SSOL_MEDIUM_VACUUM;
    203   enum ssol_material_type type;
    204 
    205   CHK(ssol_material_create_dielectric(NULL, NULL) == RES_BAD_ARG);
    206   CHK(ssol_material_create_dielectric(dev, NULL) == RES_BAD_ARG);
    207   CHK(ssol_material_create_dielectric(NULL, &material) == RES_BAD_ARG);
    208   CHK(ssol_material_create_dielectric(dev, &material) == RES_OK);
    209 
    210   CHK(ssol_material_get_type(material, &type) == RES_OK);
    211   CHK(type == SSOL_MATERIAL_DIELECTRIC);
    212 
    213   dielectric.normal = get_shader_normal;
    214 
    215   CHK(ssol_dielectric_setup(NULL, NULL, NULL, NULL) == RES_BAD_ARG);
    216   CHK(ssol_dielectric_setup(material, NULL, NULL, NULL) == RES_BAD_ARG);
    217   CHK(ssol_dielectric_setup(NULL, &dielectric, NULL, NULL) == RES_BAD_ARG);
    218   CHK(ssol_dielectric_setup(material, &dielectric, NULL, NULL) == RES_BAD_ARG);
    219   CHK(ssol_dielectric_setup(NULL, NULL, &mdm0, NULL) == RES_BAD_ARG);
    220   CHK(ssol_dielectric_setup(material, NULL, &mdm0, NULL) == RES_BAD_ARG);
    221   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, NULL) == RES_BAD_ARG);
    222   CHK(ssol_dielectric_setup(material, &dielectric, &mdm0, NULL) == RES_BAD_ARG);
    223   CHK(ssol_dielectric_setup(NULL, NULL, NULL, &mdm1) == RES_BAD_ARG);
    224   CHK(ssol_dielectric_setup(material, NULL, NULL, &mdm1) == RES_BAD_ARG);
    225   CHK(ssol_dielectric_setup(NULL, &dielectric, NULL, &mdm1) == RES_BAD_ARG);
    226   CHK(ssol_dielectric_setup(material, &dielectric, NULL, &mdm1) == RES_BAD_ARG);
    227   CHK(ssol_dielectric_setup(NULL, NULL, &mdm0, &mdm1) == RES_BAD_ARG);
    228   CHK(ssol_dielectric_setup(material, NULL, &mdm0, &mdm1) == RES_BAD_ARG);
    229   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    230   CHK(ssol_dielectric_setup(material, &dielectric, &mdm0, &mdm1) == RES_OK);
    231 
    232   dielectric.normal = NULL;
    233   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    234   dielectric.normal = get_shader_normal;
    235 
    236   ssol_data_set_real(&mdm0.refractive_index, 0);
    237   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    238   ssol_data_copy(&mdm0.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index);
    239 
    240   ssol_data_set_real(&mdm1.refractive_index, 0);
    241   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    242   ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index);
    243 
    244   ssol_data_set_real(&mdm0.extinction, -1);
    245   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    246   ssol_data_copy(&mdm0.extinction, &SSOL_MEDIUM_VACUUM.refractive_index);
    247 
    248   ssol_data_set_real(&mdm1.extinction, -1);
    249   CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG);
    250   ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index);
    251 
    252   CHK(ssol_material_ref_put(material) == RES_OK);
    253 }
    254 
    255 static void
    256 test_virtual(struct ssol_device* dev)
    257 {
    258   struct ssol_material* material;
    259   enum ssol_material_type type;
    260 
    261   CHK(ssol_material_create_virtual(NULL, NULL) == RES_BAD_ARG);
    262   CHK(ssol_material_create_virtual(NULL, &material) == RES_BAD_ARG);
    263   CHK(ssol_material_create_virtual(dev, NULL) == RES_BAD_ARG);
    264   CHK(ssol_material_create_virtual(dev, &material) == RES_OK);
    265 
    266   CHK(ssol_material_get_type(material, &type) == RES_OK);
    267   CHK(type == SSOL_MATERIAL_VIRTUAL);
    268 
    269   CHK(ssol_material_ref_put(material) == RES_OK);
    270 }
    271 
    272 int
    273 main(int argc, char** argv)
    274 {
    275   struct mem_allocator allocator;
    276   struct ssol_device* dev;
    277   (void) argc, (void) argv;
    278 
    279   mem_init_proxy_allocator(&allocator, &mem_default_allocator);
    280 
    281   CHK(ssol_device_create
    282     (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK);
    283 
    284   test_mirror(dev);
    285   test_matte(dev);
    286   test_thin_dielectric(dev);
    287   test_dielectric(dev);
    288   test_virtual(dev);
    289 
    290   CHK(ssol_device_ref_put(dev) == RES_OK);
    291 
    292   check_memory_allocator(&allocator);
    293   mem_shutdown_proxy_allocator(&allocator);
    294   CHK(mem_allocated_size() == 0);
    295 
    296   return 0;
    297 }
    298