forked from bartvdbraak/blender
[#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:
parent
e09ab8883c
commit
67f1e83508
@ -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);
|
||||
}
|
||||
|
||||
/*================================================================*/
|
||||
|
Loading…
Reference in New Issue
Block a user