solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit ac65303b7d7c82121f4eae4ac5e025107608fb68
parent d9d32daba4f04bfc6e89b72c340b5f61c2f80e3a
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 13 Jul 2016 14:35:20 +0200

Fix memory management issues

Diffstat:
Msrc/ssol_solver.c | 33++++++++++++++++++++-------------
Msrc/ssol_solver_c.h | 2--
2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -294,43 +294,50 @@ process_instances struct solver_data* data) { struct list_node* node; - const double* transform; int i; float tr[12]; + res_T res = RES_OK; if (!scene || !data) return RES_BAD_ARG; - data->quadrics_count = 0; - data->shapes_count = scene->instances_count; - darray_3dshape_reserve(&data->shapes, data->shapes_count); + darray_3dshape_reserve(&data->shapes, scene->instances_count); /* create the main scene */ - s3d_scene_create(0, &data->scene); + res = s3d_scene_create(0, &data->scene); + if (res != RES_OK) goto error; LIST_FOR_EACH(node, &scene->instances) { struct ssol_object_instance* instance = CONTAINER_OF (node, struct ssol_object_instance, scene_attachment); struct s3d_scene* scene3D; struct s3d_shape* shape3D; - - transform = get_transform(instance); + const double* transform = get_transform(instance); if (is_instance_punched(instance)) { const struct ssol_quadric* quadric = get_quadric(instance); struct ssol_quadric transformed; quadric_transform(quadric, transform, &transformed); darray_quadric_push_back(&data->quadrics, &transformed); - ++data->quadrics_count; } /* instantiate each s3d_scene as a s3d_shape */ scene3D = get_3dscene(instance); - s3d_scene_instantiate(scene3D, &shape3D); - /* apply transform: TODO */ + res = s3d_scene_instantiate(scene3D, &shape3D); + if (res != RES_OK) goto error; + /* apply transform */ FOR_EACH(i, 0, 12) tr[i] = (float)transform[i]; - s3d_instance_set_transform(shape3D, tr); + res = s3d_instance_set_transform(shape3D, tr); + if (res != RES_OK) goto error; darray_3dshape_push_back(&data->shapes, &shape3D); /* and attach it to the main scene */ - s3d_scene_attach_shape(data->scene, shape3D); + res = s3d_scene_attach_shape(data->scene, shape3D); + if (res != RES_OK) goto error; } - return RES_OK; +exit: + return res; +error: + darray_quadric_release(&data->quadrics); + darray_3dshape_release(&data->shapes); + S3D(scene_clear(data->scene)); + S3D(scene_ref_put(data->scene)); + goto exit; } diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h @@ -35,8 +35,6 @@ struct solver_data { struct ssol_device* dev; /* data comming from instances of the scene */ - size_t shapes_count; - size_t quadrics_count; struct darray_quadric quadrics; struct darray_3dshape shapes; /* the 3D scene used for raytracing */