[Bf-blender-cvs] [5e9dba822d8] master: Cleanup: Avoid error prone pointer storage in SnapObjectParams
Campbell Barton
noreply at git.blender.org
Wed Dec 8 16:06:05 CET 2021
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. @@
More information about the Bf-blender-cvs
mailing list