star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

senc3d_enclosure.c (5016B)


      1 /* Copyright (C) 2018-2020, 2023, 2024 |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 "senc3d_enclosure_c.h"
     17 #include "senc3d_enclosure_data.h"
     18 #include "senc3d_scene_c.h"
     19 #include "senc3d_device_c.h"
     20 #include "senc3d.h"
     21 
     22 #include <rsys/rsys.h>
     23 #include <rsys/double3.h>
     24 #include <rsys/mem_allocator.h>
     25 
     26 
     27 /******************************************************************************
     28  * Helper function
     29  *****************************************************************************/
     30 static void
     31 enclosure_release(ref_T * ref)
     32 {
     33   struct senc3d_enclosure* enclosure = NULL;
     34   struct senc3d_scene* scn = NULL;
     35   ASSERT(ref);
     36   enclosure = CONTAINER_OF(ref, struct senc3d_enclosure, ref);
     37   scn = enclosure->scene;
     38   MEM_RM(scn->dev->allocator, enclosure);
     39   SENC3D(scene_ref_put(scn));
     40 }
     41 
     42 /******************************************************************************
     43  * Local functions
     44  *****************************************************************************/
     45 struct senc3d_enclosure*
     46 enclosure_create
     47   (struct senc3d_scene* scn,
     48    const enclosure_id_t idx)
     49 {
     50   struct senc3d_enclosure* enc;
     51   ASSERT(scn && idx < darray_enclosure_size_get(&scn->analyze.enclosures));
     52   enc = MEM_CALLOC(scn->dev->allocator, 1, sizeof(struct senc3d_enclosure));
     53   if(enc) {
     54     const struct enclosure_data* data
     55       = darray_enclosure_data_get(&scn->analyze.enclosures) + idx;
     56     enc->scene = scn;
     57     enc->data = data;
     58     ref_init(&enc->ref);
     59     SENC3D(scene_ref_get(scn));
     60   }
     61   return enc;
     62 }
     63 
     64 /******************************************************************************
     65  * Exported functions
     66  *****************************************************************************/
     67 res_T
     68 senc3d_enclosure_get_header
     69   (const struct senc3d_enclosure* enclosure,
     70    struct senc3d_enclosure_header* header)
     71 {
     72   if(!enclosure || !header) return RES_BAD_ARG;
     73   *header = enclosure->data->header;
     74   return RES_OK;
     75 }
     76 
     77 res_T
     78 senc3d_enclosure_get_triangle
     79   (const struct senc3d_enclosure* enclosure,
     80    const trg_id_t itri,
     81    vrtx_id_t indices[3])
     82 {
     83   const struct side_enc* side;
     84   int i;
     85   if(!enclosure || !indices
     86     || itri >= enclosure->data->header.primitives_count)
     87     return RES_BAD_ARG;
     88   ASSERT(darray_sides_enc_size_get(&enclosure->data->sides)
     89     == enclosure->data->header.primitives_count);
     90   side = darray_sides_enc_cdata_get(&enclosure->data->sides) + itri;
     91   FOR_EACH(i, 0, 3) indices[i] = side->vertice_id[i];
     92   return RES_OK;
     93 }
     94 
     95 res_T
     96 senc3d_enclosure_get_vertex
     97   (const struct senc3d_enclosure* enclosure,
     98    const vrtx_id_t ivert,
     99    double coord[3])
    100 {
    101   if(!enclosure || !coord
    102     || ivert >= enclosure->data->header.vertices_count) {
    103     return RES_BAD_ARG;
    104   } else {
    105     const vrtx_id_t idx
    106       = darray_vrtx_id_cdata_get(&enclosure->data->vertices)[ivert];
    107     const union double3* positions
    108       = darray_position_cdata_get(&enclosure->scene->vertices);
    109     ASSERT(darray_vrtx_id_size_get(&enclosure->data->vertices)
    110       == enclosure->data->header.vertices_count);
    111     d3_set(coord, positions[idx].vec);
    112     return RES_OK;
    113   }
    114 }
    115 
    116 res_T
    117 senc3d_enclosure_get_triangle_id
    118   (const struct senc3d_enclosure* enclosure,
    119    const trg_id_t itri,
    120    trg_id_t* gid,
    121    enum senc3d_side* sde)
    122 {
    123   const struct side_enc* side;
    124   if(!enclosure || !gid || !sde
    125     || itri >= enclosure->data->header.primitives_count)
    126     return RES_BAD_ARG;
    127   ASSERT(darray_sides_enc_size_get(&enclosure->data->sides)
    128     == enclosure->data->header.primitives_count);
    129   side = darray_sides_enc_cdata_get(&enclosure->data->sides) + itri;
    130   *gid = TRGSIDE_2_TRG(side->side_id);
    131   *sde = TRGSIDE_2_SIDE(side->side_id);
    132   return RES_OK;
    133 }
    134 
    135 res_T
    136 senc3d_enclosure_get_medium
    137   (const struct senc3d_enclosure* enclosure,
    138    const medium_id_t imed,
    139    medium_id_t* medium)
    140 {
    141   if(!enclosure || !medium
    142     || imed >= enclosure->data->header.enclosed_media_count)
    143     return RES_BAD_ARG;
    144   ASSERT(enclosure->data->header.enclosed_media_count
    145     == darray_media_size_get(&enclosure->data->enclosed_media));
    146   *medium = darray_media_cdata_get(&enclosure->data->enclosed_media)[imed];
    147   return RES_OK;
    148 }
    149 
    150 res_T
    151 senc3d_enclosure_ref_get(struct senc3d_enclosure* enc)
    152 {
    153   if(!enc) return RES_BAD_ARG;
    154   ref_get(&enc->ref);
    155   return RES_OK;
    156 }
    157 
    158 res_T
    159 senc3d_enclosure_ref_put(struct senc3d_enclosure* enc)
    160 {
    161   if(!enc) return RES_BAD_ARG;
    162   ref_put(&enc->ref, enclosure_release);
    163   return RES_OK;
    164 }