svn merge ^/trunk/blender -r43482:43524
[blender.git] / source / blender / editors / sculpt_paint / sculpt.c
index 27a0bc8f502ac131a1b390f7ab0c1507d2f7e3de..308534ab35cfc756a469ac3f4eb4c42985096de1 100644 (file)
@@ -107,7 +107,7 @@ struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
        Mesh *me= (Mesh*)ob->data;
        ModifierData *md;
 
-       if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
+       if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
                /* multires can't work without displacement layer */
                return NULL;
        }
@@ -2301,7 +2301,7 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
                for (a= 0; a < me->totvert; a++, mvert++)
                        copy_v3_v3(mvert->co, vertCos[a]);
 
-               mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+               mesh_calc_normals_mapping(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
        }
 
        /* apply new coords on active key block */
@@ -2534,7 +2534,7 @@ static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob)
                /* 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);
+               mesh_calc_normals_mapping(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
        } else if (ss->kb)
                sculpt_update_keyblock(ob);
 }
@@ -2692,7 +2692,7 @@ void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, int need_
        if(mmd) {
                ss->multires = mmd;
                ss->totvert = dm->getNumVerts(dm);
-               ss->totface = dm->getNumFaces(dm);
+               ss->totface = dm->getNumTessFaces(dm);
                ss->mvert= NULL;
                ss->mface= NULL;
                ss->face_normals= NULL;
@@ -3105,7 +3105,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob,
                        halfway[0] = (float)dx * 0.5f + cache->initial_mouse[0];
                        halfway[1] = (float)dy * 0.5f + cache->initial_mouse[1];
 
-                       if (sculpt_stroke_get_location(C, stroke, out, halfway)) {
+                       if (sculpt_stroke_get_location(C, out, halfway)) {
                                copy_v3_v3(sd->anchored_location, out);
                                copy_v2_v2(sd->anchored_initial_mouse, halfway);
                                copy_v2_v2(cache->tex_mouse, halfway);
@@ -3207,23 +3207,29 @@ static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin)
    (This allows us to ignore the GL depth buffer)
    Returns 0 if the ray doesn't hit the mesh, non-zero otherwise
  */
-int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float out[3], float mouse[2])
+int sculpt_stroke_get_location(bContext *C, float out[3], float mouse[2])
 {
-       ViewContext *vc = paint_stroke_view_context(stroke);
-       Object *ob = vc->obact;
-       SculptSession *ss= ob->sculpt;
-       StrokeCache *cache= ss->cache;
+       ViewContext vc;
+       Object *ob;
+       SculptSession *ss;
+       StrokeCache *cache;
        float ray_start[3], ray_end[3], ray_normal[3], dist;
        float obimat[4][4];
        float mval[2];
        SculptRaycastData srd;
 
-       mval[0] = mouse[0] - vc->ar->winrct.xmin;
-       mval[1] = mouse[1] - vc->ar->winrct.ymin;
+       view3d_set_viewcontext(C, &vc);
+       
+       ob = vc.obact;
+       ss = ob->sculpt;
+       cache = ss->cache;
 
        sculpt_stroke_modifiers_check(C, ob);
 
-       ED_view3d_win_to_segment_clip(vc->ar, vc->v3d, mval, ray_start, ray_end);
+       mval[0] = mouse[0] - vc.ar->winrct.xmin;
+       mval[1] = mouse[1] - vc.ar->winrct.ymin;
+
+       ED_view3d_win_to_segment_clip(vc.ar, vc.v3d, mval, ray_start, ray_end);
 
        invert_m4_m4(obimat, ob->obmat);
        mul_m4_v3(obimat, ray_start);
@@ -3232,7 +3238,7 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou
        sub_v3_v3v3(ray_normal, ray_end, ray_start);
        dist= normalize_v3(ray_normal);
 
-       srd.ss = vc->obact->sculpt;
+       srd.ss = vc.obact->sculpt;
        srd.ray_start = ray_start;
        srd.ray_normal = ray_normal;
        srd.dist = dist;
@@ -3371,14 +3377,14 @@ static void sculpt_flush_update(bContext *C)
 
 /* Returns whether the mouse/stylus is over the mesh (1)
    or over the background (0) */
-static int over_mesh(bContext *C, struct wmOperator *op, float x, float y)
+static int over_mesh(bContext *C, struct wmOperator *UNUSED(op), float x, float y)
 {
        float mouse[2], co[3];
 
        mouse[0] = x;
        mouse[1] = y;
 
-       return sculpt_stroke_get_location(C, op->customdata, co, mouse);
+       return sculpt_stroke_get_location(C, co, mouse);
 }
 
 static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op,