Revision: 36109 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36109 Author: nazgul Date: 2011-04-12 10:16:00 +0000 (Tue, 12 Apr 2011) Log Message: ----------- Fix #26879: Some sculpt brushes does not work when sculpting corrective shapekeys
It was simply missed crazyspace correction for shape keys when mesh is deformed by modifiers and current tool is smooth/layer (they need special approach due to they don't use proxies) Modified Paths: -------------- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2011-04-12 10:13:09 UTC (rev 36108) +++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2011-04-12 10:16:00 UTC (rev 36109) @@ -2492,38 +2492,50 @@ static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob) { SculptSession *ss = ob->sculpt; - - if(!ss->kb) { + Brush *brush= paint_brush(&sd->paint); + + if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) { + /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't + propagate needed deformation to original base */ + + int n, totnode; Mesh *me= (Mesh*)ob->data; - Brush *brush= paint_brush(&sd->paint); + PBVHNode** nodes; + float (*vertCos)[3]= NULL; - if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) { - /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't - propagate needed deformation to original base */ + if(ss->kb) + vertCos= MEM_callocN(sizeof(*vertCos)*me->totvert, "flushStrokeDeofrm keyVerts"); - int n, totnode; - PBVHNode** nodes; + BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode); - BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode); + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n= 0; n < totnode; n++) { + PBVHVertexIter vd; - #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) - for (n= 0; n < totnode; n++) { - PBVHVertexIter vd; + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + sculpt_flush_pbvhvert_deform(ob, &vd); - BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - sculpt_flush_pbvhvert_deform(ob, &vd); + if(vertCos) { + int index= vd.vert_indices[vd.i]; + copy_v3_v3(vertCos[index], ss->orig_cos[index]); } - BLI_pbvh_vertex_iter_end; } + BLI_pbvh_vertex_iter_end; + } - MEM_freeN(nodes); + if(vertCos) { + sculpt_vertcos_to_key(ob, ss->kb, vertCos); + MEM_freeN(vertCos); } + MEM_freeN(nodes); + /* Modifiers could depend on mesh normals, so we should update them/ Note, then if sculpting happens on locked key, normals should be re-calculated after applying coords from keyblock on base mesh */ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); - } else sculpt_update_keyblock(ob); + } else if (ss->kb) + sculpt_update_keyblock(ob); } //static int max_overlap_count(Sculpt *sd) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs