Sculpting on shapekeys
authorSergey Sharybin <sergey.vfx@gmail.com>
Sat, 23 Apr 2011 09:07:46 +0000 (09:07 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sat, 23 Apr 2011 09:07:46 +0000 (09:07 +0000)
======================

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.

source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/editors/sculpt_paint/sculpt.c

index cbe7382c3a9be0c764beeacca9128d3421ca7093..0b29b29e60ff99840753aa609b3423e693459b7c 100644 (file)
@@ -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;
 }
index 05e60fe8f9c0b25d8b9127bfbe8eb40a2be6b28b..e4385131db17b7eb883f1c8ac1383b83ce6ad262 100644 (file)
@@ -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);