commit e01516581c09017e47c570d2202af1a36daae6fe
parent b1370883d1c7ee17419589d20de45c36e8bf3de0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Mon, 9 Jan 2023 17:50:16 +0100
Change scad_geometry_get_centerofmass signature
Memory allocation/desalocation is now up to the caller to end a memleaks-prone situation
Diffstat:
2 files changed, 13 insertions(+), 28 deletions(-)
diff --git a/src/scad.h b/src/scad.h
@@ -188,8 +188,7 @@ scad_geometry_get_mass
SCAD_API res_T
scad_geometry_get_centerofmass
(struct scad_geometry* geom,
- double** center,
- size_t* center_n);
+ double* center); /* should have room for 3*scad_geometry_get_count(geom) doubles */
/* Add a rectangle to the scene, defined by a point `xyz' and
* `dxdy' the extents along the x-, y-axes. */
@@ -323,7 +322,6 @@ scad_fragment_geometries
const size_t tools_count,
struct scad_geometry** out_geometry);
-
/* Get the boundary of the geometry `geom'. */
SCAD_API res_T
scad_geometry_boundary
diff --git a/src/scad_geometry.c b/src/scad_geometry.c
@@ -460,47 +460,34 @@ error:
res_T
scad_geometry_get_centerofmass
(struct scad_geometry* geom,
- double** center,
- size_t* center_n)
+ double* center)
{
res_T res = RES_OK;
size_t i = 0;
- int* data = NULL;
- size_t sz = 0;
- struct scad_device* dev = get_device();
- struct mem_allocator* allocator = NULL;
- double* c = NULL;
-
- if(!geom || !center || !center_n) goto error;
-
- ERR(check_device(FUNC_NAME));
- allocator = dev->allocator;
- ASSERT(geom->gmsh_dimTags_n % 2 == 0);
- *center_n = geom->gmsh_dimTags_n / 2;
-
- c = (double*)MEM_ALLOC(allocator, *center_n * 3 * sizeof(*center));
- if(!c) {
- res = RES_MEM_ERR;
+ if(!geom || !center) {
+ res = RES_BAD_ARG;
goto error;
}
- ERR(gather_tags(&geom, 1, &data, &sz));
+ ERR(check_device(FUNC_NAME));
- for(i=0; i<*center_n; ++i) {
+ for(i = 0; i < geom->gmsh_dimTags_n; i += 2) {
+ double x, y, z;
int ierr = 0;
- gmshModelOccGetCenterOfMass(data[2*i], data[2*i+1], c+3*i, c+3*i+1, c+3*i+2, &ierr);
+ int dim = geom->gmsh_dimTags[i];
+ int tag = geom->gmsh_dimTags[i + 1];
+ gmshModelOccGetCenterOfMass(dim, tag, &x, &y, &z, &ierr);
ERR(gmsh_err_to_res_T(ierr));
+ center[3*i] = x;
+ center[3*i + 1] = y;
+ center[3*i + 2] = z;
}
exit:
- *center = c;
- if(allocator) MEM_RM(allocator, data);
return res;
error:
res = RES_BAD_ARG;
- if(allocator) MEM_RM(allocator, c);
- c = NULL;
goto exit;
}