diff options
author | Hans Goudey <h.goudey@me.com> | 2022-03-28 22:59:42 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-03-28 22:59:42 +0300 |
commit | 037f7891115318e60a63ffcb1bf877b0bbc35d0f (patch) | |
tree | 560a21c91ce874f26482461fd089a0feadd12e89 /source/blender | |
parent | 21e72496a6297a1cee4fcb77f3efa24b7ee3c418 (diff) |
Cleanup: Move transform_snap_object.c to C++
This is meant to allow using C++ data structures in this file
as a performance improvement. Particularly `Vector` instead
of `ListBase` for `duplilist`.
Differential Revision: https://developer.blender.org/D14475
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/ED_transform_snap_object_context.h | 14 | ||||
-rw-r--r-- | source/blender/editors/transform/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_snap_object.cc (renamed from source/blender/editors/transform/transform_snap_object.c) | 434 |
3 files changed, 245 insertions, 205 deletions
diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h index a8a11cd7dda..2919001c5ce 100644 --- a/source/blender/editors/include/ED_transform_snap_object_context.h +++ b/source/blender/editors/include/ED_transform_snap_object_context.h @@ -21,11 +21,11 @@ struct Object; struct Scene; struct View3D; -/* transform_snap_object.c */ +/* transform_snap_object.cc */ /* ED_transform_snap_object_*** API */ -typedef enum { +typedef enum eSnapSelect { SNAP_ALL = 0, SNAP_NOT_SELECTED = 1, SNAP_NOT_ACTIVE = 2, @@ -33,7 +33,7 @@ typedef enum { SNAP_SELECTABLE = 4, } eSnapSelect; -typedef enum { +typedef enum eSnapEditType { SNAP_GEOM_FINAL = 0, SNAP_GEOM_CAGE = 1, SNAP_GEOM_EDIT = 2, /* Bmesh for mesh-type. */ @@ -59,13 +59,13 @@ struct SnapObjectHitDepth { /** parameters that define which objects will be used to snap. */ struct SnapObjectParams { /* Special context sensitive handling for the active or selected object. */ - char snap_select; + eSnapSelect snap_select; /* Geometry for snapping in edit mode. */ - char edit_mode_type; + eSnapEditType edit_mode_type; /* snap to the closest element, use when using more than one snap type */ - unsigned int use_occlusion_test : 1; + bool use_occlusion_test : true; /* exclude back facing geometry from snapping */ - unsigned int use_backface_culling : 1; + bool use_backface_culling : true; }; typedef struct SnapObjectContext SnapObjectContext; diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index c8033d9d767..68c4f4e76ca 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -90,7 +90,7 @@ set(SRC transform_orientations.c transform_snap.c transform_snap_animation.c - transform_snap_object.c + transform_snap_object.cc transform_snap_sequencer.c transform.h diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.cc index 329c5104136..1c50b2fcebb 100644 --- a/source/blender/editors/transform/transform_snap_object.c +++ b/source/blender/editors/transform/transform_snap_object.cc @@ -4,7 +4,7 @@ * \ingroup edtransform */ -#include <stdlib.h> +#include <cstdlib> #include "MEM_guardedalloc.h" @@ -55,11 +55,12 @@ enum eViewProj { VIEW_PROJ_PERSP = -1, }; -typedef struct SnapObjectData { - enum { - SNAP_MESH = 1, - SNAP_EDIT_MESH, - } type; +struct SnapObjectData { + enum class Type { + Mesh, + EditMesh, + }; + Type type; BVHTree *bvhtree[2]; /* MESH: loose edges, loose verts * EDIT_MESH: verts, edges. */ @@ -67,7 +68,7 @@ typedef struct SnapObjectData { union { struct { - /* SNAP_MESH */ + /* Type::Mesh */ BVHTreeFromMesh treedata_mesh; const struct MPoly *poly; uint has_looptris : 1; @@ -75,13 +76,13 @@ typedef struct SnapObjectData { uint has_loose_vert : 1; }; struct { - /* SNAP_EDIT_MESH */ + /* Type::EditMesh */ BVHTreeFromEditMesh treedata_editmesh; float min[3], max[3]; struct Mesh_Runtime *mesh_runtime; }; }; -} SnapObjectData; +}; struct SnapObjectContext { Scene *scene; @@ -129,14 +130,14 @@ struct SnapObjectContext { * \{ */ /* Mesh used for snapping. - * If NULL the BMesh should be used. */ + * If nullptr the BMesh should be used. */ static Mesh *mesh_for_snap(Object *ob_eval, eSnapEditType edit_mode_type, bool *r_use_hide) { Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval); bool use_hide = false; if (BKE_object_is_in_editmode(ob_eval)) { if (edit_mode_type == SNAP_GEOM_EDIT) { - return NULL; + return nullptr; } Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(ob_eval); @@ -144,14 +145,14 @@ static Mesh *mesh_for_snap(Object *ob_eval, eSnapEditType edit_mode_type, bool * if ((edit_mode_type == SNAP_GEOM_FINAL) && editmesh_eval_final) { if (editmesh_eval_final->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) { - return NULL; + return nullptr; } me_eval = editmesh_eval_final; use_hide = true; } else if ((edit_mode_type == SNAP_GEOM_CAGE) && editmesh_eval_cage) { if (editmesh_eval_cage->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) { - return NULL; + return nullptr; } me_eval = editmesh_eval_cage; use_hide = true; @@ -185,24 +186,24 @@ static void bm_mesh_minmax(BMesh *bm, float r_min[3], float r_max[3]) static void snap_object_data_mesh_clear(SnapObjectData *sod) { - BLI_assert(sod->type == SNAP_MESH); + BLI_assert(sod->type == SnapObjectData::Type::Mesh); for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) { if (!sod->cached[i]) { BLI_bvhtree_free(sod->bvhtree[i]); } - sod->bvhtree[i] = NULL; + sod->bvhtree[i] = nullptr; } free_bvhtree_from_mesh(&sod->treedata_mesh); } static void snap_object_data_editmesh_clear(SnapObjectData *sod) { - BLI_assert(sod->type == SNAP_EDIT_MESH); + BLI_assert(sod->type == SnapObjectData::Type::EditMesh); for (int i = 0; i < ARRAY_SIZE(sod->bvhtree); i++) { if (!sod->cached[i]) { BLI_bvhtree_free(sod->bvhtree[i]); } - sod->bvhtree[i] = NULL; + sod->bvhtree[i] = nullptr; } free_bvhtree_from_editmesh(&sod->treedata_editmesh); } @@ -210,11 +211,11 @@ static void snap_object_data_editmesh_clear(SnapObjectData *sod) static void snap_object_data_clear(SnapObjectData *sod) { switch (sod->type) { - case SNAP_MESH: { + case SnapObjectData::Type::Mesh: { snap_object_data_mesh_clear(sod); break; } - case SNAP_EDIT_MESH: { + case SnapObjectData::Type::EditMesh: { snap_object_data_editmesh_clear(sod); break; } @@ -224,13 +225,15 @@ static void snap_object_data_clear(SnapObjectData *sod) static SnapObjectData *snap_object_data_lookup(SnapObjectContext *sctx, Object *ob_eval) { - SnapObjectData *sod = BLI_ghash_lookup(sctx->cache.object_map, ob_eval); - if (sod == NULL) { - if (sctx->cache.data_to_object_map != NULL) { - ob_eval = BLI_ghash_lookup(sctx->cache.data_to_object_map, ob_eval->data); + SnapObjectData *sod = static_cast<SnapObjectData *>( + BLI_ghash_lookup(sctx->cache.object_map, ob_eval)); + if (sod == nullptr) { + if (sctx->cache.data_to_object_map != nullptr) { + ob_eval = static_cast<Object *>( + BLI_ghash_lookup(sctx->cache.data_to_object_map, ob_eval->data)); /* Could be NULl when mixing edit-mode and non edit-mode objects. */ - if (ob_eval != NULL) { - sod = BLI_ghash_lookup(sctx->cache.object_map, ob_eval); + if (ob_eval != nullptr) { + sod = static_cast<SnapObjectData *>(BLI_ghash_lookup(sctx->cache.object_map, ob_eval)); } } } @@ -247,9 +250,9 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx, bool init = false; if (BLI_ghash_ensure_p(sctx->cache.object_map, ob_eval, &sod_p)) { - sod = *sod_p; + sod = static_cast<SnapObjectData *>(*sod_p); bool is_dirty = false; - if (sod->type != SNAP_MESH) { + if (sod->type != SnapObjectData::Type::Mesh) { is_dirty = true; } else if (sod->treedata_mesh.tree && sod->treedata_mesh.cached && @@ -290,21 +293,22 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx, } } else { - sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod)); + *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod)); + sod = static_cast<SnapObjectData *>(*sod_p); init = true; } if (init) { - sod->type = SNAP_MESH; + sod->type = SnapObjectData::Type::Mesh; /* The BVHTree from looptris is always required. */ - BLI_assert(sod->treedata_mesh.tree == NULL); + BLI_assert(sod->treedata_mesh.tree == nullptr); BKE_bvhtree_from_mesh_get(&sod->treedata_mesh, me_eval, use_hide ? BVHTREE_FROM_LOOPTRI_NO_HIDDEN : BVHTREE_FROM_LOOPTRI, 4); - if (sod->treedata_mesh.tree == NULL) { + if (sod->treedata_mesh.tree == nullptr) { sod->treedata_mesh.vert = me_eval->mvert; sod->treedata_mesh.vert_normals = BKE_mesh_vertex_normals_ensure(me_eval); sod->treedata_mesh.loop = me_eval->mloop; @@ -312,10 +316,10 @@ static SnapObjectData *snap_object_data_mesh_get(SnapObjectContext *sctx, BLI_assert(sod->has_looptris == false); } else { - BLI_assert(sod->treedata_mesh.vert != NULL); - BLI_assert(sod->treedata_mesh.vert_normals != NULL); - BLI_assert(sod->treedata_mesh.loop != NULL); - BLI_assert(sod->treedata_mesh.looptri != NULL); + BLI_assert(sod->treedata_mesh.vert != nullptr); + BLI_assert(sod->treedata_mesh.vert_normals != nullptr); + BLI_assert(sod->treedata_mesh.loop != nullptr); + BLI_assert(sod->treedata_mesh.looptri != nullptr); sod->has_looptris = true; } @@ -357,12 +361,12 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx, { /* Use object-data as the key in ghash since the editmesh * is used to create bvhtree and is the same for each linked object. */ - if (sctx->cache.data_to_object_map == NULL) { + if (sctx->cache.data_to_object_map == nullptr) { sctx->cache.data_to_object_map = BLI_ghash_ptr_new(__func__); } void **ob_p; if (BLI_ghash_ensure_p(sctx->cache.data_to_object_map, ob_eval->data, &ob_p)) { - ob_eval = *ob_p; + ob_eval = static_cast<Object *>(*ob_p); } else { *ob_p = ob_eval; @@ -370,10 +374,10 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx, } if (BLI_ghash_ensure_p(sctx->cache.object_map, ob_eval, &sod_p)) { - sod = *sod_p; + sod = static_cast<SnapObjectData *>(*sod_p); bool is_dirty = false; /* Check if the geometry has changed. */ - if (sod->type != SNAP_EDIT_MESH) { + if (sod->type != SnapObjectData::Type::EditMesh) { is_dirty = true; } else if (sod->treedata_editmesh.em != em) { @@ -413,12 +417,13 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx, } } else { - sod = *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod)); + *sod_p = BLI_memarena_calloc(sctx->cache.mem_arena, sizeof(*sod)); + sod = static_cast<SnapObjectData *>(*sod_p); init = true; } if (init) { - sod->type = SNAP_EDIT_MESH; + sod->type = SnapObjectData::Type::EditMesh; sod->treedata_editmesh.em = em; sod->mesh_runtime = snap_object_data_editmesh_runtime_get(ob_eval); bm_mesh_minmax(em->bm, sod->min, sod->max); @@ -433,12 +438,12 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx, /** \name Iterator * \{ */ -typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx, - const struct SnapObjectParams *params, - Object *ob_eval, - float obmat[4][4], - bool is_object_active, - void *data); +using IterSnapObjsCallback = void (*)(SnapObjectContext *sctx, + const struct SnapObjectParams *params, + Object *ob_eval, + float obmat[4][4], + bool is_object_active, + void *data); static bool snap_object_is_snappable(const SnapObjectContext *sctx, const eSnapSelect snap_select, @@ -495,7 +500,7 @@ static void iter_snap_objects(SnapObjectContext *sctx, Base *base_act = view_layer->basact; const bool is_in_object_mode = !base_act || base_act->object->mode == OB_MODE_OBJECT; - for (Base *base = view_layer->object_bases.first; base != NULL; base = base->next) { + LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { if (!snap_object_is_snappable(sctx, snap_select, base_act, base, is_in_object_mode)) { continue; } @@ -504,7 +509,7 @@ static void iter_snap_objects(SnapObjectContext *sctx, Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base->object); if (obj_eval->transflag & OB_DUPLI || BKE_object_has_geometry_set_instances(obj_eval)) { ListBase *lb = object_duplilist(sctx->runtime.depsgraph, sctx->scene, obj_eval); - for (DupliObject *dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) { + LISTBASE_FOREACH (DupliObject *, dupli_ob, lb) { BLI_assert(DEG_is_evaluated_object(dupli_ob->ob)); sob_callback(sctx, params, dupli_ob->ob, dupli_ob->mat, is_object_active, data); } @@ -552,7 +557,7 @@ static struct SnapObjectHitDepth *hit_depth_create(const float depth, const float obmat[4][4], uint ob_uuid) { - struct SnapObjectHitDepth *hit = MEM_mallocN(sizeof(*hit), __func__); + struct SnapObjectHitDepth *hit = MEM_new<SnapObjectHitDepth>(__func__); hit->depth = depth; copy_v3_v3(hit->co, co); @@ -568,8 +573,8 @@ static struct SnapObjectHitDepth *hit_depth_create(const float depth, static int hit_depth_cmp(const void *arg1, const void *arg2) { - const struct SnapObjectHitDepth *h1 = arg1; - const struct SnapObjectHitDepth *h2 = arg2; + const struct SnapObjectHitDepth *h1 = static_cast<const struct SnapObjectHitDepth *>(arg1); + const struct SnapObjectHitDepth *h2 = static_cast<const struct SnapObjectHitDepth *>(arg2); int val = 0; if (h1->depth < h2->depth) { @@ -584,7 +589,7 @@ static int hit_depth_cmp(const void *arg1, const void *arg2) static void raycast_all_cb(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit) { - struct RayCastAll_Data *data = userdata; + struct RayCastAll_Data *data = static_cast<struct RayCastAll_Data *>(userdata); data->raycast_callback(data->bvhdata, index, ray, hit); if (hit->index != -1) { /* Get all values in world-space. */ @@ -717,7 +722,7 @@ static bool raycastMesh(SnapObjectContext *sctx, if (bb) { /* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ if (!isect_ray_aabb_v3_simple( - ray_start_local, ray_normal_local, bb->vec[0], bb->vec[6], &len_diff, NULL)) { + ray_start_local, ray_normal_local, bb->vec[0], bb->vec[6], &len_diff, nullptr)) { return retval; } } @@ -737,14 +742,14 @@ static bool raycastMesh(SnapObjectContext *sctx, BVHTreeFromMesh *treedata = &sod->treedata_mesh; - if (treedata->tree == NULL) { + if (treedata->tree == nullptr) { return retval; } float timat[3][3]; /* transpose inverse matrix for normals */ transpose_m3_m4(timat, imat); - BLI_assert(treedata->raycast_callback != NULL); + BLI_assert(treedata->raycast_callback != nullptr); if (r_hit_list) { struct RayCastAll_Data data; @@ -770,10 +775,9 @@ static bool raycastMesh(SnapObjectContext *sctx, retval = data.retval; } else { - BVHTreeRayHit hit = { - .index = -1, - .dist = local_depth, - }; + BVHTreeRayHit hit{}; + hit.index = -1; + hit.dist = local_depth; if (BLI_bvhtree_ray_cast(treedata->tree, ray_start_local, @@ -857,7 +861,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx, /* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */ if (!isect_ray_aabb_v3_simple( - ray_start_local, ray_normal_local, sod->min, sod->max, &len_diff, NULL)) { + ray_start_local, ray_normal_local, sod->min, sod->max, &len_diff, nullptr)) { return retval; } @@ -875,7 +879,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx, BVHTreeFromEditMesh *treedata = &sod->treedata_editmesh; - if (treedata->tree == NULL) { + if (treedata->tree == nullptr) { /* Operators only update the editmesh looptris of the original mesh. */ BLI_assert(sod->treedata_editmesh.em == BKE_editmesh_from_object(DEG_get_original_object(ob_eval))); @@ -892,8 +896,16 @@ static bool raycastEditMesh(SnapObjectContext *sctx, sctx->callbacks.edit_mesh.test_face_fn, sctx->callbacks.edit_mesh.user_data); - bvhtree_from_editmesh_looptri_ex( - treedata, em, elem_mask, looptri_num_active, 0.0f, 4, 6, 0, NULL, NULL); + bvhtree_from_editmesh_looptri_ex(treedata, + em, + elem_mask, + looptri_num_active, + 0.0f, + 4, + 6, + BVHTREE_FROM_VERTS, + nullptr, + nullptr); MEM_freeN(elem_mask); } @@ -905,10 +917,10 @@ static bool raycastEditMesh(SnapObjectContext *sctx, 4, BVHTREE_FROM_EM_LOOPTRI, &sod->mesh_runtime->bvh_cache, - sod->mesh_runtime->eval_mutex); + static_cast<ThreadMutex *>(sod->mesh_runtime->eval_mutex)); } - if (treedata->tree == NULL) { + if (treedata->tree == nullptr) { return retval; } } @@ -941,10 +953,9 @@ static bool raycastEditMesh(SnapObjectContext *sctx, retval = data.retval; } else { - BVHTreeRayHit hit = { - .index = -1, - .dist = local_depth, - }; + BVHTreeRayHit hit{}; + hit.index = -1; + hit.dist = local_depth; if (BLI_bvhtree_ray_cast(treedata->tree, ray_start_local, @@ -1011,7 +1022,7 @@ static void raycast_obj_fn(SnapObjectContext *sctx, bool is_object_active, void *data) { - struct RaycastObjUserData *dt = data; + RaycastObjUserData *dt = static_cast<RaycastObjUserData *>(data); const uint ob_index = dt->ob_index++; bool use_occlusion_test = dt->use_occlusion_test; /* read/write args */ @@ -1031,7 +1042,7 @@ static void raycast_obj_fn(SnapObjectContext *sctx, 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) { + if (me_eval == nullptr) { /* 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, @@ -1152,20 +1163,19 @@ static bool raycastObjects(SnapObjectContext *sctx, } } - struct RaycastObjUserData data = { - .ray_start = ray_start, - .ray_dir = ray_dir, - .ob_index = 0, - .ray_depth = ray_depth, - .r_loc = r_loc, - .r_no = r_no, - .r_index = r_index, - .r_ob = r_ob, - .r_obmat = r_obmat, - .r_hit_list = r_hit_list, - .use_occlusion_test = params->use_occlusion_test, - .ret = false, - }; + RaycastObjUserData data = {}; + data.ray_start = ray_start; + data.ray_dir = ray_dir; + data.ob_index = 0; + data.ray_depth = ray_depth; + data.r_loc = r_loc; + data.r_no = r_no; + data.r_index = r_index; + data.r_ob = r_ob; + data.r_obmat = r_obmat; + data.r_hit_list = r_hit_list; + data.use_occlusion_test = params->use_occlusion_test; + data.ret = false; iter_snap_objects(sctx, params, raycast_obj_fn, &data); @@ -1209,24 +1219,24 @@ static bool snap_bound_box_check_dist(const float min[3], struct Nearest2dUserData; -typedef void (*Nearest2DGetVertCoCallback)(const int index, - const struct Nearest2dUserData *data, - const float **r_co); -typedef void (*Nearest2DGetEdgeVertsCallback)(const int index, +using Nearest2DGetVertCoCallback = void (*)(const int index, + const struct Nearest2dUserData *data, + const float **r_co); +using Nearest2DGetEdgeVertsCallback = void (*)(const int index, + const struct Nearest2dUserData *data, + int r_v_index[2]); +using Nearest2DGetTriVertsCallback = void (*)(const int index, const struct Nearest2dUserData *data, - int r_v_index[2]); -typedef void (*Nearest2DGetTriVertsCallback)(const int index, - const struct Nearest2dUserData *data, - int r_v_index[3]); + int r_v_index[3]); /* Equal the previous one */ -typedef void (*Nearest2DGetTriEdgesCallback)(const int index, +using Nearest2DGetTriEdgesCallback = void (*)(const int index, + const struct Nearest2dUserData *data, + int r_e_index[3]); +using Nearest2DCopyVertNoCallback = void (*)(const int index, const struct Nearest2dUserData *data, - int r_e_index[3]); -typedef void (*Nearest2DCopyVertNoCallback)(const int index, - const struct Nearest2dUserData *data, - float r_no[3]); + float r_no[3]); -typedef struct Nearest2dUserData { +struct Nearest2dUserData { Nearest2DGetVertCoCallback get_vert_co; Nearest2DGetEdgeVertsCallback get_edge_verts_index; Nearest2DGetTriVertsCallback get_tri_verts_index; @@ -1248,7 +1258,7 @@ typedef struct Nearest2dUserData { bool is_persp; bool use_backface_culling; -} Nearest2dUserData; +}; static void cb_mvert_co_get(const int index, const Nearest2dUserData *data, const float **r_co) { @@ -1384,7 +1394,7 @@ static void cb_snap_vert(void *userdata, const int clip_plane_len, BVHTreeNearest *nearest) { - Nearest2dUserData *data = userdata; + Nearest2dUserData *data = static_cast<Nearest2dUserData *>(userdata); const float *co; data->get_vert_co(index, data, &co); @@ -1408,7 +1418,7 @@ static void cb_snap_edge(void *userdata, const int clip_plane_len, BVHTreeNearest *nearest) { - struct Nearest2dUserData *data = userdata; + Nearest2dUserData *data = static_cast<Nearest2dUserData *>(userdata); int vindex[2]; data->get_edge_verts_index(index, data, vindex); @@ -1437,7 +1447,7 @@ static void cb_snap_edge_verts(void *userdata, const int clip_plane_len, BVHTreeNearest *nearest) { - struct Nearest2dUserData *data = userdata; + Nearest2dUserData *data = static_cast<Nearest2dUserData *>(userdata); int vindex[2]; data->get_edge_verts_index(index, data, vindex); @@ -1457,7 +1467,7 @@ static void cb_snap_tri_edges(void *userdata, const int clip_plane_len, BVHTreeNearest *nearest) { - Nearest2dUserData *data = userdata; + Nearest2dUserData *data = static_cast<Nearest2dUserData *>(userdata); if (data->use_backface_culling) { int vindex[3]; @@ -1492,7 +1502,7 @@ static void cb_snap_tri_verts(void *userdata, const int clip_plane_len, BVHTreeNearest *nearest) { - struct Nearest2dUserData *data = userdata; + Nearest2dUserData *data = static_cast<Nearest2dUserData *>(userdata); int vindex[3]; data->get_tri_verts_index(index, data, vindex); @@ -1521,7 +1531,7 @@ static void nearest2d_data_init(SnapObjectData *sod, bool use_backface_culling, Nearest2dUserData *r_nearest2d) { - if (sod->type == SNAP_MESH) { + if (sod->type == SnapObjectData::Type::Mesh) { r_nearest2d->get_vert_co = cb_mvert_co_get; r_nearest2d->get_edge_verts_index = cb_medge_verts_get; r_nearest2d->copy_vert_no = cb_mvert_no_copy; @@ -1535,12 +1545,12 @@ static void nearest2d_data_init(SnapObjectData *sod, r_nearest2d->looptri = sod->treedata_mesh.looptri; } else { - BLI_assert(sod->type == SNAP_EDIT_MESH); + BLI_assert(sod->type == SnapObjectData::Type::EditMesh); r_nearest2d->get_vert_co = cb_bvert_co_get; r_nearest2d->get_edge_verts_index = cb_bedge_verts_get; r_nearest2d->copy_vert_no = cb_bvert_no_copy; - r_nearest2d->get_tri_verts_index = NULL; - r_nearest2d->get_tri_edges_index = NULL; + r_nearest2d->get_tri_verts_index = nullptr; + r_nearest2d->get_tri_edges_index = nullptr; r_nearest2d->bm = sod->treedata_editmesh.em->bm; } @@ -1581,26 +1591,25 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]); } - BVHTreeNearest nearest = { - .index = -1, - .dist_sq = square_f(*dist_px), - }; + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = square_f(*dist_px); SnapObjectData *sod = snap_object_data_lookup(sctx, ob_eval); - BLI_assert(sod != NULL); + BLI_assert(sod != nullptr); Nearest2dUserData nearest2d; nearest2d_data_init( sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d); - if (sod->type == SNAP_MESH) { + if (sod->type == SnapObjectData::Type::Mesh) { BVHTreeFromMesh *treedata = &sod->treedata_mesh; const MPoly *mp = &sod->poly[*r_index]; const MLoop *ml = &treedata->loop[mp->loopstart]; if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { elem = SCE_SNAP_MODE_EDGE; - BLI_assert(treedata->edge != NULL); + BLI_assert(treedata->edge != nullptr); for (int i = mp->totloop; i--; ml++) { cb_snap_edge(&nearest2d, ml->e, @@ -1623,7 +1632,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx, } } else { - BLI_assert(sod->type == SNAP_EDIT_MESH); + BLI_assert(sod->type == SnapObjectData::Type::EditMesh); BMEditMesh *em = sod->treedata_editmesh.em; BM_mesh_elem_table_ensure(em->bm, BM_FACE); @@ -1700,7 +1709,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, } SnapObjectData *sod = snap_object_data_lookup(sctx, ob_eval); - BLI_assert(sod != NULL); + BLI_assert(sod != nullptr); Nearest2dUserData nearest2d; nearest2d_data_init( @@ -1722,10 +1731,9 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); } - BVHTreeNearest nearest = { - .index = -1, - .dist_sq = square_f(original_dist_px), - }; + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = square_f(original_dist_px); float lambda; if (!isect_ray_line_v3(neasrest_precalc.ray_origin, @@ -1747,7 +1755,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, int v_id = lambda < 0.5f ? 0 : 1; if (test_projected_vert_dist(&neasrest_precalc, - NULL, + nullptr, 0, nearest2d.is_persp, v_pair[v_id], @@ -1773,7 +1781,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, mid_v3_v3v3(vmid, v_pair[0], v_pair[1]); if (test_projected_vert_dist(&neasrest_precalc, - NULL, + nullptr, 0, nearest2d.is_persp, vmid, @@ -1800,7 +1808,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx, &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval); if (test_projected_vert_dist(&neasrest_precalc, - NULL, + nullptr, 0, nearest2d.is_persp, v_near, @@ -1853,8 +1861,8 @@ static short snapArmature(SnapObjectContext *sctx, dist_squared_to_projected_aabb_precalc( &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval); - bArmature *arm = ob_eval->data; - const bool is_editmode = arm->edbo != NULL; + bArmature *arm = static_cast<bArmature *>(ob_eval->data); + const bool is_editmode = arm->edbo != nullptr; if (is_editmode == false) { /* Test BoundBox */ @@ -2013,7 +2021,7 @@ static short snapCurve(SnapObjectContext *sctx, return 0; } - Curve *cu = ob_eval->data; + Curve *cu = static_cast<Curve *>(ob_eval->data); float dist_px_sq = square_f(*dist_px); float lpmat[4][4]; @@ -2058,7 +2066,7 @@ static short snapCurve(SnapObjectContext *sctx, bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP; bool skip_selected = params->snap_select == SNAP_NOT_SELECTED; - for (Nurb *nu = (use_obedit ? cu->editnurb->nurbs.first : cu->nurb.first); nu; nu = nu->next) { + LISTBASE_FOREACH (Nurb *, nu, (use_obedit ? &cu->editnurb->nurbs : &cu->nurb)) { for (int u = 0; u < nu->pntsu; u++) { if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { if (use_obedit) { @@ -2241,7 +2249,7 @@ static short snapCamera(const SnapObjectContext *sctx, MovieClip *clip = BKE_object_movieclip_get(scene, object, false); MovieTracking *tracking; - if (clip == NULL) { + if (clip == nullptr) { return snap_object_center(sctx, object, obmat, dist_px, r_loc, r_no, r_index); } if (object->transflag & OB_DUPLI) { @@ -2260,11 +2268,8 @@ static short snapCamera(const SnapObjectContext *sctx, dist_squared_to_projected_aabb_precalc( &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval); - MovieTrackingObject *tracking_object; - for (tracking_object = tracking->objects.first; tracking_object; - tracking_object = tracking_object->next) { + LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &tracking->objects) { ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object); - MovieTrackingTrack *track; float reconstructed_camera_mat[4][4], reconstructed_camera_imat[4][4]; float(*vertex_obmat)[4]; @@ -2275,7 +2280,7 @@ static short snapCamera(const SnapObjectContext *sctx, invert_m4_m4(reconstructed_camera_imat, reconstructed_camera_mat); } - for (track = tracksbase->first; track; track = track->next) { + LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) { float bundle_pos[3]; if ((track->flag & TRACK_HAS_BUNDLE) == 0) { @@ -2356,10 +2361,10 @@ static short snapMesh(SnapObjectContext *sctx, BVHTreeFromMesh *treedata, treedata_tmp; treedata = &sod->treedata_mesh; - if (sod->has_loose_edge && sod->bvhtree[0] == NULL) { + if (sod->has_loose_edge && sod->bvhtree[0] == nullptr) { sod->bvhtree[0] = BKE_bvhtree_from_mesh_get( &treedata_tmp, me_eval, BVHTREE_FROM_LOOSEEDGES, 2); - if (sod->bvhtree[0] == NULL) { + if (sod->bvhtree[0] == nullptr) { sod->has_loose_edge = false; } sod->cached[0] = treedata_tmp.cached; @@ -2372,10 +2377,10 @@ static short snapMesh(SnapObjectContext *sctx, } if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { - if (sod->has_loose_vert && sod->bvhtree[1] == NULL) { + if (sod->has_loose_vert && sod->bvhtree[1] == nullptr) { sod->bvhtree[1] = BKE_bvhtree_from_mesh_get( &treedata_tmp, me_eval, BVHTREE_FROM_LOOSEVERTS, 2); - if (sod->bvhtree[1] == NULL) { + if (sod->bvhtree[1] == nullptr) { sod->has_loose_vert = false; } sod->cached[1] = treedata_tmp.cached; @@ -2396,10 +2401,10 @@ static short snapMesh(SnapObjectContext *sctx, nearest2d_data_init( sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d); - BVHTreeNearest nearest = { - .index = -1, - .dist_sq = dist_px_sq, - }; + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = dist_px_sq; + int last_index = nearest.index; short elem = SCE_SNAP_MODE_VERTEX; @@ -2549,10 +2554,11 @@ static short snapEditMesh(SnapObjectContext *sctx, } if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) { - BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[0]}; + BVHTreeFromEditMesh treedata{}; + treedata.tree = sod->bvhtree[0]; - if (treedata.tree == NULL) { - BLI_bitmap *verts_mask = NULL; + if (treedata.tree == nullptr) { + BLI_bitmap *verts_mask = nullptr; int verts_num_active = -1; if (sctx->callbacks.edit_mesh.test_vert_fn) { verts_mask = BLI_BITMAP_NEW(em->bm->totvert, __func__); @@ -2563,8 +2569,16 @@ static short snapEditMesh(SnapObjectContext *sctx, (bool (*)(BMElem *, void *))sctx->callbacks.edit_mesh.test_vert_fn, sctx->callbacks.edit_mesh.user_data); - bvhtree_from_editmesh_verts_ex( - &treedata, em, verts_mask, verts_num_active, 0.0f, 2, 6, 0, NULL, NULL); + bvhtree_from_editmesh_verts_ex(&treedata, + em, + verts_mask, + verts_num_active, + 0.0f, + 2, + 6, + BVHTREE_FROM_VERTS, + nullptr, + nullptr); MEM_freeN(verts_mask); } else { @@ -2581,10 +2595,11 @@ static short snapEditMesh(SnapObjectContext *sctx, } if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) { - BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[1]}; + BVHTreeFromEditMesh treedata{}; + treedata.tree = sod->bvhtree[1]; - if (treedata.tree == NULL) { - BLI_bitmap *edges_mask = NULL; + if (treedata.tree == nullptr) { + BLI_bitmap *edges_mask = nullptr; int edges_num_active = -1; if (sctx->callbacks.edit_mesh.test_edge_fn) { edges_mask = BLI_BITMAP_NEW(em->bm->totedge, __func__); @@ -2595,8 +2610,16 @@ static short snapEditMesh(SnapObjectContext *sctx, (bool (*)(BMElem *, void *))sctx->callbacks.edit_mesh.test_edge_fn, sctx->callbacks.edit_mesh.user_data); - bvhtree_from_editmesh_edges_ex( - &treedata, em, edges_mask, edges_num_active, 0.0f, 2, 6, 0, NULL, NULL); + bvhtree_from_editmesh_edges_ex(&treedata, + em, + edges_mask, + edges_num_active, + 0.0f, + 2, + 6, + BVHTREE_FROM_VERTS, + nullptr, + nullptr); MEM_freeN(edges_mask); } else { @@ -2605,7 +2628,7 @@ static short snapEditMesh(SnapObjectContext *sctx, 2, BVHTREE_FROM_EM_EDGES, &sod->mesh_runtime->bvh_cache, - sod->mesh_runtime->eval_mutex); + static_cast<ThreadMutex *>(sod->mesh_runtime->eval_mutex)); } sod->bvhtree[1] = treedata.tree; sod->cached[1] = treedata.cached; @@ -2616,10 +2639,10 @@ static short snapEditMesh(SnapObjectContext *sctx, nearest2d_data_init( sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d); - BVHTreeNearest nearest = { - .index = -1, - .dist_sq = dist_px_sq, - }; + BVHTreeNearest nearest{}; + nearest.index = -1; + nearest.dist_sq = dist_px_sq; + short elem = SCE_SNAP_MODE_VERTEX; float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4]; @@ -2711,7 +2734,7 @@ static void snap_obj_fn(SnapObjectContext *sctx, bool is_object_active, void *data) { - struct SnapObjUserData *dt = data; + SnapObjUserData *dt = static_cast<SnapObjUserData *>(data); short retval = 0; switch (ob_eval->type) { @@ -2719,7 +2742,7 @@ static void snap_obj_fn(SnapObjectContext *sctx, const eSnapEditType edit_mode_type = params->edit_mode_type; bool use_hide; Mesh *me_eval = mesh_for_snap(ob_eval, edit_mode_type, &use_hide); - if (me_eval == NULL) { + if (me_eval == nullptr) { /* Operators only update the editmesh looptris of the original mesh. */ BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob_eval)); retval = snapEditMesh( @@ -2833,15 +2856,14 @@ static short snapObjectsRay(SnapObjectContext *sctx, Object **r_ob, float r_obmat[4][4]) { - struct SnapObjUserData data = { - .dist_px = dist_px, - .r_loc = r_loc, - .r_no = r_no, - .r_ob = r_ob, - .r_index = r_index, - .r_obmat = r_obmat, - .ret = 0, - }; + SnapObjUserData data = {}; + data.dist_px = dist_px; + data.r_loc = r_loc; + data.r_no = r_no; + data.r_ob = r_ob; + data.r_index = r_index; + data.r_obmat = r_obmat; + data.ret = 0; iter_snap_objects(sctx, params, snap_obj_fn, &data); @@ -2856,7 +2878,7 @@ static short snapObjectsRay(SnapObjectContext *sctx, SnapObjectContext *ED_transform_snap_object_context_create(Scene *scene, int flag) { - SnapObjectContext *sctx = MEM_callocN(sizeof(*sctx), __func__); + SnapObjectContext *sctx = MEM_cnew<SnapObjectContext>(__func__); sctx->flag = flag; @@ -2864,7 +2886,7 @@ SnapObjectContext *ED_transform_snap_object_context_create(Scene *scene, int fla sctx->cache.object_map = BLI_ghash_ptr_new(__func__); /* Initialize as needed (edit-mode only). */ - sctx->cache.data_to_object_map = NULL; + sctx->cache.data_to_object_map = nullptr; sctx->cache.mem_arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__); return sctx; @@ -2872,15 +2894,15 @@ SnapObjectContext *ED_transform_snap_object_context_create(Scene *scene, int fla static void snap_object_data_free(void *sod_v) { - SnapObjectData *sod = sod_v; + SnapObjectData *sod = static_cast<SnapObjectData *>(sod_v); snap_object_data_clear(sod); } void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx) { - BLI_ghash_free(sctx->cache.object_map, NULL, snap_object_data_free); - if (sctx->cache.data_to_object_map != NULL) { - BLI_ghash_free(sctx->cache.data_to_object_map, NULL, NULL); + BLI_ghash_free(sctx->cache.object_map, nullptr, snap_object_data_free); + if (sctx->cache.data_to_object_map != nullptr) { + BLI_ghash_free(sctx->cache.data_to_object_map, nullptr, nullptr); } BLI_memarena_free(sctx->cache.mem_arena); @@ -2917,8 +2939,17 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx, sctx->runtime.depsgraph = depsgraph; sctx->runtime.v3d = v3d; - return raycastObjects( - sctx, params, ray_start, ray_normal, ray_depth, r_loc, r_no, r_index, r_ob, r_obmat, NULL); + return raycastObjects(sctx, + params, + ray_start, + ray_normal, + ray_depth, + r_loc, + r_no, + r_index, + r_ob, + r_obmat, + nullptr); } bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, @@ -2942,8 +2973,17 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx, float ray_depth_prev = ray_depth; #endif - bool retval = raycastObjects( - sctx, params, ray_start, ray_normal, &ray_depth, NULL, NULL, NULL, NULL, NULL, r_hit_list); + bool retval = raycastObjects(sctx, + params, + ray_start, + ray_normal, + &ray_depth, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + r_hit_list); /* meant to be readonly for 'all' hits, ensure it is */ #ifdef DEBUG @@ -2986,9 +3026,9 @@ static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx, ray_depth, r_co, r_no, - NULL, - NULL, - NULL); + nullptr, + nullptr, + nullptr); return ret; } @@ -3004,7 +3044,7 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, float r_no[3]) { float ray_depth_fallback; - if (ray_depth == NULL) { + if (ray_depth == nullptr) { ray_depth_fallback = BVH_RAYCAST_DIST_MAX; ray_depth = &ray_depth_fallback; } @@ -3041,7 +3081,7 @@ static short transform_snap_context_project_view3d_mixed_impl( short retval = 0; bool has_hit = false; - Object *ob_eval = NULL; + Object *ob_eval = nullptr; float loc[3]; /* Not all snapping callbacks set the normal, * initialize this since any hit copies both the `loc` and `no`. */ @@ -3049,14 +3089,14 @@ static short transform_snap_context_project_view3d_mixed_impl( float obmat[4][4]; int index = -1; - const RegionView3D *rv3d = region->regiondata; + const RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata); bool use_occlusion_test = params->use_occlusion_test && !XRAY_ENABLED(v3d); if (snap_to_flag & SCE_SNAP_MODE_FACE || use_occlusion_test) { float ray_start[3], ray_normal[3]; if (!ED_view3d_win_to_ray_clipped_ex( - depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) { + depsgraph, region, v3d, mval, nullptr, ray_normal, ray_start, true)) { return 0; } @@ -3072,7 +3112,7 @@ static short transform_snap_context_project_view3d_mixed_impl( &index, &ob_eval, obmat, - NULL); + nullptr); if (has_hit) { if (r_face_nor) { @@ -3117,10 +3157,10 @@ static short transform_snap_context_project_view3d_mixed_impl( } planes_from_projmat(sctx->runtime.pmat, - NULL, - NULL, - NULL, - NULL, + nullptr, + nullptr, + nullptr, + nullptr, sctx->runtime.clip_plane[0], sctx->runtime.clip_plane[1]); @@ -3253,10 +3293,10 @@ short ED_transform_snap_object_project_view3d(SnapObjectContext *sctx, dist_px, r_loc, r_no, - NULL, - NULL, - NULL, - NULL); + nullptr, + nullptr, + nullptr, + nullptr); } bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx, @@ -3272,7 +3312,7 @@ bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx, float ray_start[3], ray_normal[3]; if (!ED_view3d_win_to_ray_clipped_ex( - depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) { + depsgraph, region, v3d, mval, nullptr, ray_normal, ray_start, true)) { return false; } |