forked from bartvdbraak/blender
Sculpting on shapekeys
====================== All this work with sculpting on armatured/deformed mesh allowed to implement sculpting on non-locked keys very easy -- just use the same approach of propagating offsets from deformed PBVH to "sculpting layer". - If key is locked, then old logic would be used. - If there's multires modifier enabled, sculpting would happen on multires.
This commit is contained in:
parent
8ca9dc3cfe
commit
ef14d310a0
@ -197,8 +197,20 @@ static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
|
||||
{
|
||||
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
|
||||
Mesh *me= ob->data;
|
||||
int deformed= 0;
|
||||
|
||||
if(ob->sculpt->modifiers_active) return 0;
|
||||
/* active modifiers means extra deformation, which can't be handled correct
|
||||
on bith of PBVH and sculpt "layer" levels, so use PBVH only for internal brush
|
||||
stuff and show final DerivedMesh so user would see actual object shape */
|
||||
deformed|= ob->sculpt->modifiers_active;
|
||||
|
||||
/* as in case with modifiers, we can't synchronize deformation made against
|
||||
PBVH and non-locked keyblock, so also use PBVH only for brushes and
|
||||
final DM to give final result to user */
|
||||
deformed|= ob->sculpt->kb && (ob->shapeflag&OB_SHAPE_LOCK) == 0;
|
||||
|
||||
if(deformed)
|
||||
return 0;
|
||||
|
||||
return (cddm->mvert == me->mvert) || ob->sculpt->kb;
|
||||
}
|
||||
|
@ -175,10 +175,15 @@ static int sculpt_has_active_modifiers(Scene *scene, Object *ob)
|
||||
int sculpt_modifiers_active(Scene *scene, Object *ob)
|
||||
{
|
||||
ModifierData *md;
|
||||
Mesh *me= (Mesh*)ob->data;
|
||||
MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
|
||||
|
||||
if(mmd) return 0;
|
||||
|
||||
/* non-locked shaoe keys could be handled in the same way as deformed mesh */
|
||||
if((ob->shapeflag&OB_SHAPE_LOCK)==0 && me->key && ob->shapenr)
|
||||
return 1;
|
||||
|
||||
md= modifiers_getVirtualModifierList(ob);
|
||||
|
||||
/* exception for shape keys because we can edit those */
|
||||
@ -2708,7 +2713,7 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
|
||||
|
||||
ss->modifiers_active= sculpt_modifiers_active(scene, ob);
|
||||
|
||||
if((ob->shapeflag & OB_SHAPE_LOCK) && !mmd) ss->kb= ob_get_keyblock(ob);
|
||||
if(!mmd) ss->kb= ob_get_keyblock(ob);
|
||||
else ss->kb= NULL;
|
||||
|
||||
if(mmd) {
|
||||
@ -3342,7 +3347,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss)
|
||||
sculpt_update_tex(sd, ss);
|
||||
}
|
||||
|
||||
static int sculpt_brush_stroke_init(bContext *C, ReportList *reports)
|
||||
static int sculpt_brush_stroke_init(bContext *C, ReportList *UNUSED(reports))
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
@ -3350,11 +3355,6 @@ static int sculpt_brush_stroke_init(bContext *C, ReportList *reports)
|
||||
SculptSession *ss = CTX_data_active_object(C)->sculpt;
|
||||
Brush *brush = paint_brush(&sd->paint);
|
||||
|
||||
if(ob_get_key(ob) && !(ob->shapeflag & OB_SHAPE_LOCK)) {
|
||||
BKE_report(reports, RPT_ERROR, "Shape key sculpting requires a locked shape.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
view3d_operator_needs_opengl(C);
|
||||
sculpt_brush_init_tex(sd, ss);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user