[#30373] Which part to snap in volume snapping is removed

By Bug reported by Pep Ribal

Also fixed an object mode bug with volume snapping and made it compatible with the edit mode "Snap on self" option
This commit is contained in:
Martin Poirier 2012-03-10 21:40:35 +00:00
parent e09ab8883c
commit 67f1e83508
5 changed files with 30 additions and 22 deletions

@ -88,10 +88,10 @@ class VIEW3D_HT_header(Header):
row = layout.row(align=True)
row.prop(toolsettings, "use_snap", text="")
row.prop(toolsettings, "snap_element", text="", icon_only=True)
if snap_element not in {'INCREMENT', 'VOLUME'}:
if snap_element != 'INCREMENT':
row.prop(toolsettings, "snap_target", text="")
if obj:
if obj.mode == 'OBJECT':
if obj.mode == 'OBJECT' and snap_element != 'VOLUME':
row.prop(toolsettings, "use_snap_align_rotation", text="")
elif obj.mode == 'EDIT':
row.prop(toolsettings, "use_snap_self", text="")

@ -1079,7 +1079,7 @@ static int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, S
mvalf[0]= dd->mval[0];
mvalf[1]= dd->mval[1];
peelObjectsContext(C, &sketch->depth_peels, mvalf);
peelObjectsContext(C, &sketch->depth_peels, mvalf, SNAP_ALL);
if (stk->nb_points > 0 && stk->points[stk->nb_points - 1].type == PT_CONTINUOUS)
{

@ -28,6 +28,15 @@
#define __ED_NUMINPUT_H__
/*
The ctrl value has different meaning:
0 : No value has been typed
otherwise, |value| - 1 is where the cursor is located after the period
Positive : number is positive
Negative : number is negative
*/
typedef struct NumInput {
short idx;
short idx_max;

@ -175,8 +175,8 @@ typedef enum SnapMode
#define SNAP_MIN_DISTANCE 30
int peelObjectsTransForm(struct TransInfo *t, struct ListBase *depth_peels, const float mval[2]);
int peelObjectsContext(struct bContext *C, struct ListBase *depth_peels, const float mval[2]);
int peelObjectsTransForm(struct TransInfo *t, struct ListBase *depth_peels, const float mval[2], SnapMode mode);
int peelObjectsContext(struct bContext *C, struct ListBase *depth_peels, const float mval[2], SnapMode mode);
int snapObjectsTransform(struct TransInfo *t, const float mval[2], int *r_dist, float r_loc[3], float r_no[3], SnapMode mode);
int snapObjectsContext(struct bContext *C, const float mval[2], int *r_dist, float r_loc[3], float r_no[3], SnapMode mode);

@ -785,7 +785,7 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
depth_peels.first = depth_peels.last = NULL;
peelObjectsTransForm(t, &depth_peels, mval);
peelObjectsTransForm(t, &depth_peels, mval, t->tsnap.modeSelect);
// if (LAST_SNAP_POINT_VALID)
// {
@ -1862,7 +1862,7 @@ static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4],
return retval;
}
static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, const float mval[2])
static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, const float mval[2], SnapMode mode)
{
Base *base;
int retval = 0;
@ -1874,6 +1874,7 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
if ( BASE_SELECTABLE(v3d, base) ) {
Object *ob = base->object;
#if 0 //BMESH_TODO
if (ob->transflag & OB_DUPLI) {
DupliObject *dupli_ob;
ListBase *lb = object_duplilist(scene, ob);
@ -1883,7 +1884,6 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
Object *dob = dupli_ob->ob;
if (dob->type == OB_MESH) {
#if 0 //BMESH_TODO
EditMesh *em;
DerivedMesh *dm = NULL;
int val;
@ -1903,33 +1903,32 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
retval = retval || val;
dm->release(dm);
#endif
}
}
free_object_duplilist(lb);
}
#endif
if (ob->type == OB_MESH) {
BMEditMesh *em;
DerivedMesh *dm = NULL;
int val;
int val = 0;
if (ob != obedit) {
dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
if (ob != obedit && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT))) {
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
dm->release(dm);
}
else {
em = BMEdit_FromObject(ob);
dm = editbmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
else if (ob == obedit && mode != SNAP_NOT_OBEDIT) {
BMEditMesh *em = BMEdit_FromObject(ob);
DerivedMesh *dm = editbmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
dm->release(dm);
}
retval = retval || val;
dm->release(dm);
}
}
}
@ -1940,17 +1939,17 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
return retval;
}
int peelObjectsTransForm(TransInfo *t, ListBase *depth_peels, const float mval[2])
int peelObjectsTransForm(TransInfo *t, ListBase *depth_peels, const float mval[2], SnapMode mode)
{
return peelObjects(t->scene, t->view, t->ar, t->obedit, depth_peels, mval);
return peelObjects(t->scene, t->view, t->ar, t->obedit, depth_peels, mval, mode);
}
int peelObjectsContext(bContext *C, ListBase *depth_peels, const float mval[2])
int peelObjectsContext(bContext *C, ListBase *depth_peels, const float mval[2], SnapMode mode)
{
ScrArea *sa = CTX_wm_area(C);
View3D *v3d = sa->spacedata.first;
return peelObjects(CTX_data_scene(C), v3d, CTX_wm_region(C), CTX_data_edit_object(C), depth_peels, mval);
return peelObjects(CTX_data_scene(C), v3d, CTX_wm_region(C), CTX_data_edit_object(C), depth_peels, mval, mode);
}
/*================================================================*/