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 }