Commit: 5e9dba822d8de977909bf170dcae9950535e01af Author: Campbell Barton Date: Wed Dec 8 11:59:58 2021 -0300 Branches: master https://developer.blender.org/rB5e9dba822d8de977909bf170dcae9950535e01af
Cleanup: Avoid error prone pointer storage in SnapObjectParams eed48a73222efb86b53cdd99079f8c26eba30e57 caused the `SnapObjectParams` to be stored in the `SnapObjectContext`. As this pointer is always passing in stack memory, so it seems error prone to keep a reference to this in `SnapObjectContext` since failure to set this will reference undefined stack memory. So avoid this by moving params out of `SnapObjectContext`. Differential Revision: https://developer.blender.org/D13401 =================================================================== M source/blender/editors/transform/transform_snap_object.c =================================================================== diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c index 7caa626fe78..9fd3eada9e9 100644 --- a/source/blender/editors/transform/transform_snap_object.c +++ b/source/blender/editors/transform/transform_snap_object.c @@ -125,8 +125,6 @@ struct SnapObjectContext { const ARegion *region; const View3D *v3d; - const struct SnapObjectParams *params; - float mval[2]; float pmat[4][4]; /* perspective matrix */ float win_size[2]; /* win x and y */ @@ -444,6 +442,7 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx, * \{ */ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx, + const struct SnapObjectParams *params, Object *ob_eval, float obmat[4][4], bool is_object_active, @@ -453,16 +452,17 @@ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx, * Walks through all objects in the scene to create the list of objects to snap. */ static void iter_snap_objects(SnapObjectContext *sctx, + const struct SnapObjectParams *params, IterSnapObjsCallback sob_callback, void *data) { ViewLayer *view_layer = DEG_get_input_view_layer(sctx->runtime.depsgraph); - const eSnapSelect snap_select = sctx->runtime.params->snap_select; + const eSnapSelect snap_select = params->snap_select; Base *base_act = view_layer->basact; if (snap_select == SNAP_ONLY_ACTIVE) { Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base_act->object); - sob_callback(sctx, obj_eval, obj_eval->obmat, true, data); + sob_callback(sctx, params, obj_eval, obj_eval->obmat, true, data); return; } @@ -500,12 +500,12 @@ static void iter_snap_objects(SnapObjectContext *sctx, ListBase *lb = object_duplilist(sctx->runtime.depsgraph, sctx->scene, obj_eval); for (DupliObject *dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) { BLI_assert(DEG_is_evaluated_object(dupli_ob->ob)); - sob_callback(sctx, dupli_ob->ob, dupli_ob->mat, is_object_active, data); + sob_callback(sctx, params, dupli_ob->ob, dupli_ob->mat, is_object_active, data); } free_object_duplilist(lb); } - sob_callback(sctx, obj_eval, obj_eval->obmat, is_object_active, data); + sob_callback(sctx, params, obj_eval, obj_eval->obmat, is_object_active, data); } } @@ -665,6 +665,7 @@ static void editmesh_looptri_raycast_backface_culling_cb(void *userdata, } static bool raycastMesh(SnapObjectContext *sctx, + const struct SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], Object *ob_eval, @@ -773,7 +774,7 @@ static bool raycastMesh(SnapObjectContext *sctx, ray_normal_local, 0.0f, &hit, - sctx->runtime.params->use_backface_culling ? + params->use_backface_culling ? mesh_looptri_raycast_backface_culling_cb : treedata->raycast_callback, treedata) != -1) { @@ -805,6 +806,7 @@ static bool raycastMesh(SnapObjectContext *sctx, } static bool raycastEditMesh(SnapObjectContext *sctx, + const struct SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], Object *ob_eval, @@ -943,7 +945,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx, ray_normal_local, 0.0f, &hit, - sctx->runtime.params->use_backface_culling ? + params->use_backface_culling ? editmesh_looptri_raycast_backface_culling_cb : treedata->raycast_callback, treedata) != -1) { @@ -998,8 +1000,12 @@ struct RaycastObjUserData { * * \note Duplicate args here are documented at #snapObjectsRay */ -static void raycast_obj_fn( - SnapObjectContext *sctx, Object *ob_eval, float obmat[4][4], bool is_object_active, void *data) +static void raycast_obj_fn(SnapObjectContext *sctx, + const struct SnapObjectParams *params, + Object *ob_eval, + float obmat[4][4], + bool is_object_active, + void *data) { struct RaycastObjUserData *dt = data; const uint ob_index = dt->ob_index++; @@ -1018,13 +1024,14 @@ static void raycast_obj_fn( switch (ob_eval->type) { case OB_MESH: { - const eSnapEditType edit_mode_type = sctx->runtime.params->edit_mode_type; + const eSnapEditType edit_mode_type = params->edit_mode_type; bool use_hide = false; Mesh *me_eval = mesh_for_snap(ob_eval, edit_mode_type, &use_hide); if (me_eval == NULL) { /* Operators only update the editmesh looptris of the original mesh. */ BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob_eval)); retval = raycastEditMesh(sctx, + params, dt->ray_start, dt->ray_dir, ob_eval, @@ -1039,6 +1046,7 @@ static void raycast_obj_fn( break; } retval = raycastMesh(sctx, + params, dt->ray_start, dt->ray_dir, ob_eval, @@ -1060,6 +1068,7 @@ static void raycast_obj_fn( const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval); if (mesh_eval) { retval = raycastMesh(sctx, + params, dt->ray_start, dt->ray_dir, ob_eval, @@ -1115,6 +1124,7 @@ static void raycast_obj_fn( * \param r_hit_list: List of #SnapObjectHitDepth (caller must free). */ static bool raycastObjects(SnapObjectContext *sctx, + const struct SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], /* read/write args */ @@ -1129,7 +1139,6 @@ static bool raycastObjects(SnapObjectContext *sctx, float r_obmat[4][4], ListBase *r_hit_list) { - const struct SnapObjectParams *params = sctx->runtime.params; const View3D *v3d = sctx->runtime.v3d; if (params->use_occlusion_test && v3d && XRAY_FLAG_ENABLED(v3d)) { /* General testing of occlusion geometry is disabled if the snap is not intended for the edit @@ -1154,7 +1163,7 @@ static bool raycastObjects(SnapObjectContext *sctx, .ret = false, }; - iter_snap_objects(sctx, raycast_obj_fn, &data); + iter_snap_objects(sctx, params, raycast_obj_fn, &data); return data.ret; } @@ -1531,6 +1540,7 @@ static void cb_snap_tri_verts(void *userdata, * \{ */ static short snap_mesh_polygon(SnapObjectContext *sctx, + const struct SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], /* read/write args */ @@ -1564,10 +1574,8 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, BLI_assert(sod != NULL); Nearest2dUserData nearest2d; - nearest2d_data_init(sod, - sctx->runtime.view_proj == VIEW_PROJ_PERSP, - sctx->runtime.params->use_backface_culling, - &nearest2d); + nearest2d_data_init( + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d); if (sod->type == SNAP_MESH) { BVHTreeFromMesh *treedata = &sod->treedata_mesh; @@ -1657,6 +1665,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, } static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, + const struct SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], float original_dist_px, @@ -1678,10 +1687,8 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, BLI_assert(sod != NULL); Nearest2dUserData nearest2d; - nearest2d_data_init(sod, - sctx->runtime.view_proj == VIEW_PROJ_PERSP, - sctx->runtime.params->use_backface_culling, - &nearest2d); + nearest2d_data_init( + sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d); int vindex[2]; nearest2d.get_edge_verts_index(*r_index, nearest2d.userdata, vindex); @@ -1806,6 +1813,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, } static short snapArmature(SnapObjectContext *sctx, + const struct SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], /* read/write args */ @@ -1849,7 +1857,7 @@ static short snapArmature(SnapObjectContext *sctx, mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - const eSnapSelect snap_select = sctx->runtime.params->snap_select; + const eSnapSelect snap_select = params->snap_select; bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; bArmature *arm = ob_eval->data; @@ -1963,6 +1971,7 @@ static short snapArmature(SnapObjectContext *sctx, } static short snapCur @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
