Fix T94564: Mirror clipping is not properly placed in sculpt mode

If a mirror object is used in a mirror modifier, sculptmode did not take
this into account (and instead always clipped on the sculpt objects
local axis).

Now take this into account by storing a matrix in the preparation
function `sculpt_init_mirror_clipping` and use that later in
`SCULPT_clip`.

Maniphest Tasks: T94564

Differential Revision: https://developer.blender.org/D13711
This commit is contained in:
Philipp Oeser 2022-01-03 13:25:45 +01:00
parent 22ce804c7d
commit b61a912128
Notes: blender-bot 2023-02-14 06:42:53 +01:00
Referenced by issue #94564, Mirror clipping is not properly placed in sculpt mode
Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
2 changed files with 27 additions and 2 deletions

View File

@ -2372,8 +2372,23 @@ void SCULPT_clip(Sculpt *sd, SculptSession *ss, float co[3], const float val[3])
continue;
}
if ((ss->cache->flag & (CLIP_X << i)) && (fabsf(co[i]) <= ss->cache->clip_tolerance[i])) {
co[i] = 0.0f;
bool do_clip = false;
float co_clip[3];
if (ss->cache && (ss->cache->flag & (CLIP_X << i))) {
/* Take possible mirror object into account. */
mul_v3_m4v3(co_clip, ss->cache->clip_mirror_mtx, co);
if (fabsf(co_clip[i]) <= ss->cache->clip_tolerance[i]) {
co_clip[i] = 0.0f;
float imtx[4][4];
invert_m4_m4(imtx, ss->cache->clip_mirror_mtx);
mul_m4_v3(imtx, co_clip);
do_clip = true;
}
}
if (do_clip) {
co[i] = co_clip[i];
}
else {
co[i] = val[i];
@ -6005,6 +6020,8 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
{
ModifierData *md;
unit_m4(ss->cache->clip_mirror_mtx);
for (md = ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData *)md;
@ -6023,6 +6040,13 @@ static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
}
}
}
/* Store matrix for mirror object clipping. */
if (mmd->mirror_ob) {
float imtx_mirror_ob[4][4];
invert_m4_m4(imtx_mirror_ob, mmd->mirror_ob->obmat);
mul_m4_m4m4(ss->cache->clip_mirror_mtx, imtx_mirror_ob, ob->obmat);
}
}
}
}

View File

@ -691,6 +691,7 @@ typedef struct StrokeCache {
float scale[3];
int flag;
float clip_tolerance[3];
float clip_mirror_mtx[4][4];
float initial_mouse[2];
/* Variants */