diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-19 05:57:15 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-19 05:57:15 +0400 |
commit | 8b0179a965180c325910e1c4127bdc2c53dfbb40 (patch) | |
tree | 530bfe7356efe6859e32981ca687f9055918a03c /source | |
parent | e01c00d19437c9aef1fc27568d7becbabdef9ba2 (diff) |
== Sculpt ==
Fixed bug #24111, "Mirror clipping not working while sculpting a mirrored mesh"
* Mirror modifiers can handle multiple-axis mirroring, updated sculpt to work with that
* Marked the "axis" field of MirrorModifierData deprecated, since it looks like bitflags are supposed to be used now
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 46 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 3 |
2 files changed, 33 insertions, 16 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 505e37d95f6..fccee048525 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -2815,6 +2815,36 @@ static void sculpt_cache_free(StrokeCache *cache) MEM_freeN(cache); } +/* Initialize mirror modifier clipping */ +static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss) +{ + ModifierData *md; + int i; + + for(md= ob->modifiers.first; md; md= md->next) { + if(md->type==eModifierType_Mirror && + (md->mode & eModifierMode_Realtime)) { + MirrorModifierData *mmd = (MirrorModifierData*)md; + + if(mmd->flag & MOD_MIR_CLIPPING) { + /* check each axis for mirroring */ + for(i = 0; i < 3; ++i) { + if(mmd->flag & (MOD_MIR_AXIS_X << i)) { + /* enable sculpt clipping */ + ss->cache->flag |= CLIP_X << i; + + /* update the clip tolerance */ + if(mmd->tolerance > + ss->cache->clip_tolerance[i]) + ss->cache->clip_tolerance[i] = + mmd->tolerance; + } + } + } + } + } +} + /* Initialize the stroke cache invariants from operator properties */ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSession *ss, wmOperator *op, wmEvent *event) { @@ -2822,7 +2852,6 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio Brush *brush = paint_brush(&sd->paint); ViewContext *vc = paint_stroke_view_context(op->customdata); Object *ob= CTX_data_active_object(C); - ModifierData *md; int i; int mode; @@ -2835,22 +2864,9 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio ss->cache->plane_trim_squared = brush->plane_trim * brush->plane_trim; - /* Initialize mirror modifier clipping */ - ss->cache->flag = 0; - for(md= ob->modifiers.first; md; md= md->next) { - if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) { - const MirrorModifierData *mmd = (MirrorModifierData*) md; - - /* Mark each axis that needs clipping along with its tolerance */ - if(mmd->flag & MOD_MIR_CLIPPING) { - ss->cache->flag |= CLIP_X << mmd->axis; - if(mmd->tolerance > ss->cache->clip_tolerance[mmd->axis]) - ss->cache->clip_tolerance[mmd->axis] = mmd->tolerance; - } - } - } + sculpt_init_mirror_clipping(ob, ss); /* Initial mouse location */ if (event) { diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 27f9c9cd5f3..0708698c40c 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -220,7 +220,8 @@ typedef struct ArrayModifierData { typedef struct MirrorModifierData { ModifierData modifier; - short axis, flag; + short axis; /* deprecated, use flag instead */ + short flag; float tolerance; struct Object *mirror_ob; } MirrorModifierData; |