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_instance.c (7694B)


      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 <rsys/double33.h>
     20 
     21 #define PLANE_NAME SQUARE
     22 #define HALF_X 1
     23 #define HALF_Y 1
     24 #include "test_ssol_rect_geometry.h"
     25 
     26 int
     27 main(int argc, char** argv)
     28 {
     29   struct mem_allocator allocator;
     30   struct ssol_device* dev;
     31   struct ssol_shape* shape;
     32   struct ssol_material* material;
     33   struct ssol_object* object;
     34   struct ssol_instance* instance;
     35   struct ssol_instance* instance1;
     36   struct ssol_vertex_data attrib = SSOL_VERTEX_DATA_NULL;
     37   struct ssol_instantiated_shaded_shape sshape;
     38   double transform[12] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0};
     39   double val[3], area;
     40   size_t n;
     41   unsigned i, count;
     42   uint32_t id, id1;
     43   int mask, prim;
     44   (void) argc, (void) argv;
     45 
     46   mem_init_proxy_allocator(&allocator, &mem_default_allocator);
     47 
     48   CHK(ssol_device_create
     49     (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK);
     50 
     51   CHK(ssol_material_create_virtual(dev, &material) == RES_OK);
     52 
     53   attrib.usage = SSOL_POSITION;
     54   attrib.get = get_position;
     55   CHK(ssol_shape_create_mesh(dev, &shape) == RES_OK);
     56   CHK(ssol_mesh_setup(shape, SQUARE_NTRIS__, get_ids, SQUARE_NVERTS__,
     57     &attrib, 1, (void*)&SQUARE_DESC__) == RES_OK);
     58 
     59   CHK(ssol_object_create(dev, &object) == RES_OK);
     60   CHK(ssol_object_add_shaded_shape(object, shape, material, material) == RES_OK);
     61 
     62   CHK(ssol_object_instantiate(object, &instance) == RES_OK);
     63   CHK(ssol_object_instantiate(object, &instance1) == RES_OK);
     64 
     65   CHK(ssol_instance_get_id(NULL, NULL) == RES_BAD_ARG);
     66   CHK(ssol_instance_get_id(instance, NULL) == RES_BAD_ARG);
     67   CHK(ssol_instance_get_id(NULL, &id) == RES_BAD_ARG);
     68   CHK(ssol_instance_get_id(instance, &id) == RES_OK);
     69   CHK(ssol_instance_get_id(instance1, &id1) == RES_OK);
     70   CHK(id != id1);
     71 
     72   CHK(ssol_instance_ref_get(NULL) == RES_BAD_ARG);
     73   CHK(ssol_instance_ref_get(instance) == RES_OK);
     74 
     75   CHK(ssol_instance_ref_put(NULL) == RES_BAD_ARG);
     76   CHK(ssol_instance_ref_put(instance) == RES_OK);
     77 
     78   CHK(ssol_instance_set_transform(NULL, transform) == RES_BAD_ARG);
     79   CHK(ssol_instance_set_transform(instance, NULL) == RES_BAD_ARG);
     80   CHK(ssol_instance_set_transform(instance, transform) == RES_OK);
     81   CHK(ssol_instance_set_transform(instance, transform) == RES_OK);
     82 
     83   CHK(ssol_instance_get_area(instance, NULL) == RES_BAD_ARG);
     84   CHK(ssol_instance_get_area(NULL, &area) == RES_BAD_ARG);
     85   CHK(ssol_instance_get_area(instance, &area) == RES_OK);
     86 
     87   CHK(ssol_instance_set_receiver(NULL, 0, 0) == RES_BAD_ARG);
     88   CHK(ssol_instance_set_receiver(instance, 0, 0) == RES_OK);
     89 
     90   CHK(ssol_instance_is_receiver(NULL, NULL, NULL) == RES_BAD_ARG);
     91   CHK(ssol_instance_is_receiver(instance, NULL, NULL) == RES_BAD_ARG);
     92   CHK(ssol_instance_is_receiver(NULL, &mask, NULL) == RES_BAD_ARG);
     93   CHK(ssol_instance_is_receiver(instance, &mask, NULL) == RES_BAD_ARG);
     94   CHK(ssol_instance_is_receiver(NULL, NULL, &prim) == RES_BAD_ARG);
     95   CHK(ssol_instance_is_receiver(instance, NULL, &prim) == RES_BAD_ARG);
     96   CHK(ssol_instance_is_receiver(NULL, &mask, &prim) == RES_BAD_ARG);
     97   CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK);
     98   CHK(mask == 0);
     99   CHK(prim == 0);
    100 
    101   CHK(ssol_instance_set_receiver(instance, SSOL_FRONT, 0) == RES_OK);
    102   CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK);
    103   CHK(mask == SSOL_FRONT);
    104   CHK(prim == 0);
    105   CHK(ssol_instance_set_receiver(instance, SSOL_FRONT|SSOL_BACK, 1) == RES_OK);
    106   CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK);
    107   CHK(mask == (SSOL_FRONT|SSOL_BACK));
    108   CHK(prim == 1);
    109 
    110   CHK(ssol_instance_sample(NULL, 0) == RES_BAD_ARG);
    111   CHK(ssol_instance_sample(instance, 0) == RES_OK);
    112   CHK(ssol_instance_sample(instance, 1) == RES_OK);
    113 
    114   CHK(ssol_instance_get_shaded_shapes_count(NULL, NULL) == RES_BAD_ARG);
    115   CHK(ssol_instance_get_shaded_shapes_count(instance, NULL) == RES_BAD_ARG);
    116   CHK(ssol_instance_get_shaded_shapes_count(NULL, &n) == RES_BAD_ARG);
    117   CHK(ssol_instance_get_shaded_shapes_count(instance, &n) == RES_OK);
    118   CHK(n == 1);
    119 
    120   CHK(ssol_instance_get_shaded_shape(NULL, n, NULL) == RES_BAD_ARG);
    121   CHK(ssol_instance_get_shaded_shape(instance, n, NULL) == RES_BAD_ARG);
    122   CHK(ssol_instance_get_shaded_shape(NULL, 0, NULL) == RES_BAD_ARG);
    123   CHK(ssol_instance_get_shaded_shape(instance, 0, NULL) == RES_BAD_ARG);
    124   CHK(ssol_instance_get_shaded_shape(NULL, n, &sshape) == RES_BAD_ARG);
    125   CHK(ssol_instance_get_shaded_shape(instance, n, &sshape) == RES_BAD_ARG);
    126   CHK(ssol_instance_get_shaded_shape(NULL, 0, &sshape) == RES_BAD_ARG);
    127   CHK(ssol_instance_get_shaded_shape(instance, 0, &sshape) == RES_OK);
    128 
    129   CHK(sshape.shape == shape);
    130   CHK(sshape.mtl_front == material);
    131   CHK(sshape.mtl_back == material);
    132 
    133   CHK(ssol_shape_get_vertices_count(sshape.shape, &count) == RES_OK);
    134 
    135   #define GET_ATTR ssol_instantiated_shaded_shape_get_vertex_attrib
    136   CHK(GET_ATTR(NULL, count, (unsigned)-1, NULL) == RES_BAD_ARG);
    137   CHK(GET_ATTR(&sshape, count, (unsigned)-1, NULL) == RES_BAD_ARG);
    138   CHK(GET_ATTR(NULL, 0, (unsigned)-1, NULL) == RES_BAD_ARG);
    139   CHK(GET_ATTR(&sshape, 0, (unsigned)-1, NULL) == RES_BAD_ARG);
    140   CHK(GET_ATTR(NULL, count, SSOL_POSITION, NULL) == RES_BAD_ARG);
    141   CHK(GET_ATTR(&sshape, count, SSOL_POSITION, NULL) == RES_BAD_ARG);
    142   CHK(GET_ATTR(NULL, 0, SSOL_POSITION, NULL) == RES_BAD_ARG);
    143   CHK(GET_ATTR(&sshape, 0, SSOL_POSITION, NULL) == RES_BAD_ARG);
    144   CHK(GET_ATTR(NULL, count, (unsigned)-1, val) == RES_BAD_ARG);
    145   CHK(GET_ATTR(&sshape, count, (unsigned)-1, val) == RES_BAD_ARG);
    146   CHK(GET_ATTR(NULL, 0, (unsigned)-1, val) == RES_BAD_ARG);
    147   CHK(GET_ATTR(&sshape, 0, (unsigned)-1, val) == RES_BAD_ARG);
    148   CHK(GET_ATTR(NULL, count, SSOL_POSITION, val) == RES_BAD_ARG);
    149   CHK(GET_ATTR(&sshape, count, SSOL_POSITION, val) == RES_BAD_ARG);
    150   CHK(GET_ATTR(NULL, 0, SSOL_POSITION, val) == RES_BAD_ARG);
    151   FOR_EACH(i, 0, count) {
    152     float valf[3];
    153     double val2[3];
    154 
    155     CHK(GET_ATTR(&sshape, i, SSOL_POSITION, val) == RES_OK);
    156     get_position(i, valf, (void*)&SQUARE_DESC__);
    157     d3_set_f3(val2, valf);
    158     d33_muld3(val2, transform, val2);
    159     d3_add(val2, transform+9, val2);
    160     CHK(eq_eps(val[0], val2[0], 1.e-6) == 1);
    161     CHK(eq_eps(val[1], val2[1], 1.e-6) == 1);
    162     CHK(eq_eps(val[2], val2[2], 1.e-6) == 1);
    163   }
    164   CHK(ssol_instance_get_shaded_shape(instance1, 0, &sshape) == RES_OK);
    165   FOR_EACH(i, 0, count) {
    166     float valf[3];
    167 
    168     CHK(GET_ATTR(&sshape, i, SSOL_POSITION, val) == RES_OK);
    169     get_position(i, valf, (void*)&SQUARE_DESC__);
    170     CHK((float)val[0] == valf[0]);
    171     CHK((float)val[1] == valf[1]);
    172     CHK((float)val[2] == valf[2]);
    173   }
    174   #undef GET_ATTR
    175 
    176 
    177   CHK(ssol_instance_ref_put(instance) == RES_OK);
    178   CHK(ssol_instance_ref_put(instance1) == RES_OK);
    179   CHK(ssol_object_ref_put(object) == RES_OK);
    180   CHK(ssol_shape_ref_put(shape) == RES_OK);
    181   CHK(ssol_material_ref_put(material) == RES_OK);
    182 
    183   CHK(ssol_device_ref_put(dev) == RES_OK);
    184 
    185   check_memory_allocator(&allocator);
    186   mem_shutdown_proxy_allocator(&allocator);
    187   CHK(mem_allocated_size() == 0);
    188 
    189   return 0;
    190 }