star-2d

Contour structuring for efficient 2D geometric queries
git clone git://git.meso-star.fr/star-2d.git
Log | Files | Refs | README | LICENSE

test_s2d_primitive.c (5963B)


      1 /* Copyright (C) 2016-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 "s2d.h"
     17 #include "test_s2d_utils.h"
     18 
     19 #include <rsys/float2.h>
     20 
     21 #define NSAMPS 4096
     22 
     23 int
     24 main(int argc, char** argv)
     25 {
     26   struct mem_allocator allocator;
     27   struct s2d_attrib attr;
     28   struct s2d_primitive prim;
     29   struct s2d_vertex_data vdata;
     30   struct s2d_device* dev;
     31   struct s2d_scene* scn;
     32   struct s2d_scene_view* scnview;
     33   struct s2d_shape* shape;
     34   size_t nprims;
     35   unsigned square_id;
     36   float tmp[2];
     37   float length;
     38   float s;
     39   int i;
     40   (void)argc, (void)argv;
     41 
     42   mem_init_proxy_allocator(&allocator, &mem_default_allocator);
     43 
     44   CHK(s2d_device_create(NULL, &allocator, 1, &dev) == RES_OK);
     45   CHK(s2d_scene_create(dev, &scn) == RES_OK);
     46   CHK(s2d_shape_create_line_segments(dev, &shape) == RES_OK);
     47   CHK(s2d_shape_get_id(shape, &square_id) == RES_OK);
     48   CHK(s2d_scene_attach_shape(scn, shape) == RES_OK);
     49 
     50   vdata.usage = S2D_POSITION;
     51   vdata.type = S2D_FLOAT2;
     52   vdata.get = line_segments_get_position;
     53   CHK(s2d_line_segments_setup_indexed_vertices
     54     (shape, square_nsegs, line_segments_get_ids, square_nverts, &vdata, 1,
     55      (void*)&square_desc) == RES_OK);
     56 
     57   CHK(s2d_scene_view_create(scn, S2D_SAMPLE, &scnview) == RES_OK);
     58   CHK(s2d_scene_view_sample(scnview, 0, 0, &prim, &s) == RES_OK);
     59   CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
     60 
     61   #define GET_ATTRIB s2d_primitive_get_attrib
     62   CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, 2, NULL) == RES_BAD_ARG);
     63   CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, 2, NULL) == RES_BAD_ARG);
     64   CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, s, NULL) == RES_BAD_ARG);
     65   CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, s, NULL) == RES_BAD_ARG);
     66   CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, 2, &attr) == RES_BAD_ARG);
     67   CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, 2, &attr) == RES_BAD_ARG);
     68   CHK(GET_ATTRIB(NULL, S2D_ATTRIBS_COUNT__, s, &attr) == RES_BAD_ARG);
     69   CHK(GET_ATTRIB(&prim, S2D_ATTRIBS_COUNT__, s, &attr) == RES_BAD_ARG);
     70   CHK(GET_ATTRIB(NULL, S2D_POSITION, 2, NULL) == RES_BAD_ARG);
     71   CHK(GET_ATTRIB(&prim, S2D_POSITION, 2, NULL) == RES_BAD_ARG);
     72   CHK(GET_ATTRIB(NULL, S2D_POSITION, s, NULL) == RES_BAD_ARG);
     73   CHK(GET_ATTRIB(&prim, S2D_POSITION, s, NULL) == RES_BAD_ARG);
     74   CHK(GET_ATTRIB(NULL, S2D_POSITION, 2, &attr) == RES_BAD_ARG);
     75   CHK(GET_ATTRIB(&prim, S2D_POSITION, 2, &attr) == RES_BAD_ARG);
     76   CHK(GET_ATTRIB(NULL, S2D_POSITION, s, &attr) == RES_BAD_ARG);
     77   CHK(GET_ATTRIB(&prim, S2D_POSITION, s, &attr) == RES_OK);
     78   CHK(attr.type == S2D_FLOAT2);
     79   CHK(attr.usage == S2D_POSITION);
     80 
     81   CHK(GET_ATTRIB(&prim, S2D_GEOMETRY_NORMAL, s, &attr) == RES_OK);
     82   f2_normalize(attr.value, attr.value);
     83   switch(prim.prim_id) {
     84     case 0: CHK(f2_eq_eps(attr.value, f2(tmp, 0.f, 1.f), 1.e-6f) == 1); break;
     85     case 1: CHK(f2_eq_eps(attr.value, f2(tmp, 1.f, 0.f), 1.e-6f) == 1); break;
     86     case 2: CHK(f2_eq_eps(attr.value, f2(tmp, 0.f,-1.f), 1.e-6f) == 1); break;
     87     case 3: CHK(f2_eq_eps(attr.value, f2(tmp,-1.f, 0.f), 1.e-6f) == 1); break;
     88     default: CHK(0 == 1); /* Invalid primitive id */
     89   }
     90 
     91   CHK(GET_ATTRIB(&S2D_PRIMITIVE_NULL, S2D_GEOMETRY_NORMAL, s, &attr) 
     92     == RES_BAD_ARG);
     93   #undef GET_ATTRIB
     94 
     95   CHK(s2d_scene_view_create(scn, S2D_GET_PRIMITIVE, &scnview) == RES_OK);
     96   CHK(s2d_scene_view_primitives_count(scnview, &nprims) == RES_OK);
     97   CHK(nprims == 4);
     98 
     99   CHK(s2d_primitive_compute_length(NULL, NULL) == RES_BAD_ARG);
    100   CHK(s2d_primitive_compute_length(&prim, NULL) == RES_BAD_ARG);
    101   CHK(s2d_primitive_compute_length(NULL, &length) == RES_BAD_ARG);
    102   CHK(s2d_primitive_compute_length(&prim, &length) == RES_OK);
    103   CHK(eq_epsf(length, 2, 1.e-6f) == 1);
    104 
    105   CHK(s2d_primitive_sample(NULL, 2.f, NULL) == RES_BAD_ARG);
    106   CHK(s2d_primitive_sample(&prim, 2.f, NULL) == RES_BAD_ARG);
    107   CHK(s2d_primitive_sample(NULL, 0.5f, NULL) == RES_BAD_ARG);
    108   CHK(s2d_primitive_sample(&prim, 0.5f, NULL) == RES_BAD_ARG);
    109   CHK(s2d_primitive_sample(NULL, 2.f, &s) == RES_BAD_ARG);
    110   CHK(s2d_primitive_sample(&prim, 2.f, &s) == RES_BAD_ARG);
    111   CHK(s2d_primitive_sample(NULL, 0.5f, &s) == RES_BAD_ARG);
    112   CHK(s2d_primitive_sample(&prim, 0.5f, &s) == RES_OK);
    113   CHK(eq_epsf(s, 0.5f, 1.e-6f));
    114 
    115   FOR_EACH(i, 0, NSAMPS) {
    116     CHK(s2d_primitive_sample(&prim, rand_canonic(), &s) == RES_OK);
    117     CHK(s >= 0.f);
    118     CHK(s <= 1.f);
    119   }
    120 
    121   CHK(s2d_scene_view_get_primitive(scnview, 0, &prim) == RES_OK);
    122 
    123   #define GET_VERTEX_ATTR s2d_segment_get_vertex_attrib
    124   CHK(GET_VERTEX_ATTR(NULL, 0, S2D_POSITION, &attr) == RES_BAD_ARG);
    125   CHK(GET_VERTEX_ATTR(&prim, 2, S2D_POSITION, &attr) == RES_BAD_ARG);
    126   CHK(GET_VERTEX_ATTR(&prim, 0, S2D_GEOMETRY_NORMAL, &attr) == RES_BAD_ARG);
    127   CHK(GET_VERTEX_ATTR(&prim, 0, S2D_POSITION, NULL) == RES_BAD_ARG);
    128   CHK(GET_VERTEX_ATTR(&prim, 0, S2D_POSITION, &attr) == RES_OK);
    129   CHK(attr.type == S2D_FLOAT2);
    130   CHK(f2_eq_eps(attr.value, square_verts + square_ids[0]*2, 1.e-6f));
    131   CHK(GET_VERTEX_ATTR(&prim, 1, S2D_POSITION, &attr) == RES_OK);
    132   CHK(attr.type == S2D_FLOAT2);
    133   CHK(f2_eq_eps(attr.value, square_verts + square_ids[1]*2, 1.e-6f));
    134 
    135   CHK(s2d_device_ref_put(dev) == RES_OK);
    136   CHK(s2d_scene_ref_put(scn) == RES_OK);
    137   CHK(s2d_scene_view_ref_put(scnview) == RES_OK);
    138   CHK(s2d_shape_ref_put(shape) == RES_OK);
    139 
    140   check_memory_allocator(&allocator);
    141   mem_shutdown_proxy_allocator(&allocator);
    142   CHK(mem_allocated_size() == 0);
    143   return 0;
    144 }
    145