star-3daw

Create star-3d geometries from OBJ files
git clone git://git.meso-star.fr/star-3daw.git
Log | Files | Refs | README | LICENSE

test_s3daw.c (7638B)


      1 /* Copyright (C) 2015, 2016, 2020, 2021, 2023 |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 "s3daw.h"
     17 
     18 #include <rsys/logger.h>
     19 #include <rsys/mem_allocator.h>
     20 #include <star/s3d.h>
     21 
     22 static void
     23 test_cbox(struct s3daw* s3daw)
     24 {
     25   const char* cbox_obj =
     26     "mtllib cbox.mtl cbox2.mtl\n"
     27     "v -1.01 0 0.99\n"
     28     "v 1 0 0.99\n"
     29     "v 1 0 -1.04\n"
     30     "v -0.99  0 -1.04\n"
     31     "g floor\n"
     32     "usemtl floor\n"
     33     "f -4 -3 -2 -1\n"
     34 
     35     "v -1.02 1.99 0.99\n"
     36     "v -1.02 1.99 -1.04\n"
     37     "v 1 1.99 -1.04\n"
     38     "v 1 1.99 0.99\n"
     39     "g ceiling\n"
     40     "usemtl ceiling\n"
     41     "f -4 -3 -2 -1\n"
     42 
     43     "v -0.99 0 -1.04\n"
     44     "v 1 0 -1.04\n"
     45     "v 1 1.99 -1.04\n"
     46     "v -1.02 1.99 -1.04\n"
     47     "g back\n"
     48     "usemtl back\n"
     49     "f -4 -3 -2 -1\n"
     50 
     51     "v 1 0 -1.04\n"
     52     "v 1 0 0.99\n"
     53     "v 1 1.99 0.99\n"
     54     "v 1 1.99 -1.04\n"
     55     "g right\n"
     56     "usemtl right\n"
     57     "f -4 -3 -2 -1\n"
     58 
     59     "v -1.01 0 0.99\n"
     60     "v -0.99 0 -1.04\n"
     61     "v -1.02 1.99 -1.04\n"
     62     "v -1.02 1.99 0.99\n"
     63     "g left\n"
     64     "usemtl left\n"
     65     "f -4 -3 -2 -1\n";
     66 
     67   const char* cbox_mtl =
     68     "newmtl left\n"
     69     "Ns 10\n"
     70     "Ni 1.5\n"
     71     "illum 2\n"
     72     "Ka 0.63 0.065 0.05\n"
     73     "Kd 0.63 0.065 0.05\n"
     74     "Ks 0 0 0\n"
     75     "Ke 0 0 0\n"
     76 
     77     "newmtl right\n"
     78     "Ns 10\n"
     79     "Ni 1.5\n"
     80     "illum 2\n"
     81     "Ka 0.14 0.45 0.091\n"
     82     "Kd 0.14 0.45 0.091\n"
     83     "Ks 0 0 0\n"
     84     "Ke 0 0 0\n"
     85 
     86     "newmtl floor\n"
     87     "Ns 10\n"
     88     "Ni 1\n"
     89     "illum 2\n"
     90     "Ka 0.725 0.71 0.68\n"
     91     "Kd 0.725 0.71 0.68\n"
     92     "Ks 0 0 0\n"
     93     "Ke 0 0 0\n"
     94 
     95     "newmtl ceiling\n"
     96     "Ns 10\n"
     97     "Ni 1\n"
     98     "illum 2\n"
     99     "Ka 0.725 0.71 0.68\n"
    100     "Kd 0.725 0.71 0.68\n"
    101     "Ks 0 0 0\n"
    102     "Ke 0 0 0\n";
    103 
    104   const char* cbox2_mtl =
    105     "newmtl back\n"
    106     "Ns 10\n"
    107     "Ni 1\n"
    108     "illum 2\n"
    109     "Ka 0.725 0.71 0.68\n"
    110     "Kd 0.725 0.71 0.68\n"
    111     "Ks 0 0 0\n"
    112     "Ke 0 0 0\n";
    113 
    114   FILE* file;
    115   struct s3d_device* s3d;
    116   struct s3d_shape* shape;
    117   struct s3d_scene* scene = NULL;
    118   size_t ishape, nshapes;
    119 
    120   ASSERT(s3daw);
    121 
    122   file = fopen("cbox.obj", "w");
    123 
    124   CHK(file != NULL);
    125   fwrite(cbox_obj, sizeof(char), strlen(cbox_obj), file);
    126   fclose(file);
    127 
    128   file = fopen("cbox.mtl", "w");
    129   CHK(file != NULL);
    130   fwrite(cbox_mtl, sizeof(char), strlen(cbox_mtl), file);
    131   fclose(file);
    132 
    133   remove("cbox2.mtl");
    134 
    135   CHK(s3daw_load(NULL, NULL) == RES_BAD_ARG);
    136   CHK(s3daw_load(s3daw, NULL) == RES_BAD_ARG);
    137   CHK(s3daw_load(NULL, "cbox.obj") == RES_BAD_ARG);
    138   CHK(s3daw_load(s3daw, "cbox.obj__") == RES_IO_ERR);
    139   CHK(s3daw_load(s3daw, "cbox.obj") == RES_OK);
    140 
    141   file = fopen("cbox2.mtl", "w");
    142   CHK(file != NULL);
    143   fwrite(cbox2_mtl, sizeof(char), strlen(cbox2_mtl), file);
    144   fclose(file);
    145 
    146   CHK(s3daw_load(s3daw, "cbox.obj") == RES_OK);
    147 
    148   CHK(s3daw_get_shapes_count(NULL, NULL) == RES_BAD_ARG);
    149   CHK(s3daw_get_shapes_count(s3daw, NULL) == RES_BAD_ARG);
    150   CHK(s3daw_get_shapes_count(NULL, &nshapes) == RES_BAD_ARG);
    151   CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK);
    152   CHK(nshapes == 5);
    153 
    154   CHK(s3daw_get_shape(NULL, 0, NULL) == RES_BAD_ARG);
    155   CHK(s3daw_get_shape(s3daw, 0, NULL) == RES_BAD_ARG);
    156   CHK(s3daw_get_shape(NULL, 0, &shape) == RES_BAD_ARG);
    157   FOR_EACH(ishape, 0, nshapes)
    158     CHK(s3daw_get_shape(s3daw, 0, &shape) == RES_OK);
    159   CHK(s3daw_get_shape(s3daw, nshapes, &shape) == RES_BAD_ARG);
    160 
    161   CHK(s3daw_clear(NULL) == RES_BAD_ARG);
    162   CHK(s3daw_clear(s3daw) == RES_OK);
    163   CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK);
    164   CHK(nshapes == 0);
    165   CHK(s3daw_get_shape(s3daw, 0, &shape) == RES_BAD_ARG);
    166 
    167   file = fopen("cbox.obj", "r");
    168   CHK(file != NULL);
    169 
    170   CHK(s3daw_load_stream(s3daw, file) == RES_OK);
    171   CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK);
    172   CHK(nshapes == 5);
    173   FOR_EACH(ishape, 0, nshapes)
    174     CHK(s3daw_get_shape(s3daw, ishape, &shape) == RES_OK);
    175 
    176   CHK(s3daw_get_s3d_device(s3daw, &s3d) == RES_OK);
    177   CHK(s3d_scene_create(s3d, &scene) == RES_OK);
    178 
    179   CHK(s3daw_attach_to_scene(NULL, NULL) == RES_BAD_ARG);
    180   CHK(s3daw_attach_to_scene(s3daw, NULL) == RES_BAD_ARG);
    181   CHK(s3daw_attach_to_scene(NULL, scene) == RES_BAD_ARG);
    182   CHK(s3daw_attach_to_scene(s3daw, scene) == RES_OK);
    183 
    184   CHK(s3daw_detach_from_scene(NULL, NULL) == RES_BAD_ARG);
    185   CHK(s3daw_detach_from_scene(s3daw, NULL) == RES_BAD_ARG);
    186   CHK(s3daw_detach_from_scene(NULL, scene) == RES_BAD_ARG);
    187   CHK(s3daw_detach_from_scene(s3daw, scene) == RES_OK);
    188 
    189   CHK(s3daw_detach_from_scene(s3daw, scene) == RES_BAD_ARG);
    190   CHK(s3d_scene_ref_put(scene) == RES_OK);
    191 
    192   fclose(file);
    193 }
    194 
    195 int
    196 main(int argc, char** argv)
    197 {
    198   struct mem_allocator allocator_proxy;
    199   struct aw_mtl* aw_mtl;
    200   struct aw_obj* aw_obj;
    201   struct s3daw* s3daw;
    202   struct s3d_device* s3d;
    203   struct s3d_device* s3d_tmp;
    204   (void)argc, (void)argv;
    205 
    206   mem_init_proxy_allocator(&allocator_proxy, &mem_default_allocator);
    207 
    208   CHK(s3d_device_create(NULL, &allocator_proxy, 0, &s3d) == RES_OK);
    209 
    210   CHK(s3daw_create(NULL, NULL, NULL, NULL, NULL, 1, NULL) == RES_BAD_ARG);
    211   CHK(s3daw_create(NULL, NULL, NULL, NULL, NULL, 1, &s3daw) == RES_BAD_ARG);
    212   CHK(s3daw_create(NULL, NULL, NULL, NULL, s3d, 1,  NULL) == RES_BAD_ARG);
    213   CHK(s3daw_create(NULL, NULL, NULL, NULL,s3d, 1, &s3daw) == RES_OK);
    214 
    215   CHK(s3daw_ref_get(NULL) == RES_BAD_ARG);
    216   CHK(s3daw_ref_get(s3daw) == RES_OK);
    217   CHK(s3daw_ref_put(NULL) == RES_BAD_ARG);
    218   CHK(s3daw_ref_put(s3daw) == RES_OK);
    219   CHK(s3daw_ref_put(s3daw) == RES_OK);
    220 
    221   CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, NULL, 1, NULL) == RES_BAD_ARG);
    222   CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, NULL, 1, &s3daw) == RES_BAD_ARG);
    223   CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, s3d, 1, NULL) == RES_BAD_ARG);
    224   CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, s3d, 1, &s3daw) == RES_OK);
    225   CHK(s3daw_ref_put(s3daw) == RES_OK);
    226 
    227   CHK(s3daw_create
    228     (LOGGER_DEFAULT, &allocator_proxy, NULL, NULL, s3d, 1, &s3daw) == RES_OK);
    229 
    230   CHK(s3daw_get_loaders(NULL, NULL, NULL) == RES_BAD_ARG);
    231   CHK(s3daw_get_loaders(s3daw, NULL, NULL) == RES_OK); /* Useless */
    232   CHK(s3daw_get_loaders(NULL, &aw_obj, NULL) == RES_BAD_ARG);
    233   CHK(s3daw_get_loaders(s3daw, &aw_obj, NULL) == RES_OK);
    234   CHK(s3daw_get_loaders(NULL, NULL, &aw_mtl) == RES_BAD_ARG);
    235   CHK(s3daw_get_loaders(s3daw, NULL, &aw_mtl) == RES_OK);
    236   CHK(s3daw_get_loaders(NULL, &aw_obj, &aw_mtl) == RES_BAD_ARG);
    237   CHK(s3daw_get_loaders(s3daw, &aw_obj, &aw_mtl) == RES_OK);
    238 
    239   CHK(s3daw_get_s3d_device(NULL, NULL) == RES_BAD_ARG);
    240   CHK(s3daw_get_s3d_device(s3daw, NULL) == RES_BAD_ARG);
    241   CHK(s3daw_get_s3d_device(NULL, &s3d_tmp) == RES_BAD_ARG);
    242   CHK(s3daw_get_s3d_device(s3daw, &s3d_tmp) == RES_OK);
    243   CHK(s3d_tmp == s3d);
    244 
    245   test_cbox(s3daw);
    246 
    247   CHK(s3daw_ref_put(s3daw) == RES_OK);
    248   CHK(s3d_device_ref_put(s3d) == RES_OK);
    249 
    250   if(MEM_ALLOCATED_SIZE(&allocator_proxy)) {
    251     char dump[512];
    252     MEM_DUMP(&allocator_proxy, dump, sizeof(dump)/sizeof(char));
    253     fprintf(stderr, "%s\n", dump);
    254     FATAL("Memory leaks\n");
    255   }
    256   mem_shutdown_proxy_allocator(&allocator_proxy);
    257   CHK(mem_allocated_size() == 0);
    258   return 0;
    259 }
    260