Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormano-wii <germano.costa@ig.com.br>2018-10-09 16:23:31 +0300
committermano-wii <germano.costa@ig.com.br>2018-10-09 16:24:15 +0300
commitf81e8903b407e8faa5f6c78a90bd802bb85fb13e (patch)
tree1d577b572351397d5ae007e8c5be9c88b3a722cd /source/blender/editors/transform/transform_snap_object.c
parent18be4d942b3e544d9d608b78362c8aaf10055b61 (diff)
Fix T55202: 3D Cursor Snapping not working correctly in Edit Mode.
Use `mesh_eval_final` in this case.
Diffstat (limited to 'source/blender/editors/transform/transform_snap_object.c')
-rw-r--r--source/blender/editors/transform/transform_snap_object.c83
1 files changed, 53 insertions, 30 deletions
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index a3ce35a223a..7f4f3d888fc 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -100,6 +100,7 @@ typedef struct SnapObjectData {
typedef struct SnapObjectData_Mesh {
SnapObjectData sd;
BVHTreeFromMesh treedata;
+ const struct MPoly *poly;
BVHTree *bvhtree[2]; /* from loose verts and from loose edges */
uint has_looptris : 1;
uint has_loose_edge : 1;
@@ -428,12 +429,19 @@ static bool raycastMesh(
if (treedata->looptri && treedata->looptri_allocated == false) {
treedata->looptri = BKE_mesh_runtime_looptri_ensure(me);
}
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
}
}
if (treedata->tree == NULL) {
BKE_bvhtree_from_mesh_get(treedata, me, BVHTREE_FROM_LOOPTRI, 4);
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
+
if (treedata->tree == NULL) {
return retval;
}
@@ -736,22 +744,31 @@ static bool raycastObj(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = raycastEditMesh(
- sctx,
- ray_start, ray_dir,
- ob, em, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
- }
- else {
- retval = raycastMesh(
- sctx,
- ray_start, ray_dir,
- ob, ob->data, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
+ if (use_obedit) {
+ retval = raycastEditMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, em, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
+ break;
+ }
+ else if (em->mesh_eval_final &&
+ (em->mesh_eval_final->runtime.deformed_only == false))
+ {
+ me = em->mesh_eval_final;
+ }
}
+ retval = raycastMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, me, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
break;
+ }
}
if (retval) {
@@ -1202,12 +1219,11 @@ static short snap_mesh_polygon(
nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get;
nearest2d.copy_vert_no = (Nearest2DCopyVertNoCallback)cb_mvert_no_copy;
- MPoly *mp = &((Mesh *)ob->data)->mpoly[*r_index];
- const MLoop *ml;
+ const MPoly *mp = &((SnapObjectData_Mesh *)sod)->poly[*r_index];
+ const MLoop *ml = &treedata->loop[mp->loopstart];
if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
elem = SCE_SNAP_MODE_EDGE;
- treedata->edge = ((Mesh *)ob->data)->medge;
- ml = &treedata->loop[mp->loopstart];
+ BLI_assert(treedata->edge != NULL);
for (int i = mp->totloop; i--; ml++) {
cb_snap_edge(
&nearest2d, ml->e, &neasrest_precalc,
@@ -1217,7 +1233,6 @@ static short snap_mesh_polygon(
}
else {
elem = SCE_SNAP_MODE_VERTEX;
- ml = &treedata->loop[mp->loopstart];
for (int i = mp->totloop; i--; ml++) {
cb_snap_vert(
&nearest2d, ml->v, &neasrest_precalc,
@@ -2243,21 +2258,29 @@ static short snapObject(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = snapEditMesh(
- sctx, snapdata, ob, em, obmat,
- dist_px,
- r_loc, r_no, r_index);
- }
- else {
- retval = snapMesh(
- sctx, snapdata, ob, ob->data, obmat,
- dist_px,
- r_loc, r_no, r_index);
+ if (use_obedit) {
+ retval = snapEditMesh(
+ sctx, snapdata, ob, em, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
+ break;
+ }
+ else if (em->mesh_eval_final &&
+ (em->mesh_eval_final->runtime.deformed_only == false))
+ {
+ me = em->mesh_eval_final;
+ }
}
+ retval = snapMesh(
+ sctx, snapdata, ob, me, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
break;
-
+ }
case OB_ARMATURE:
retval = snapArmature(
snapdata,