svn merge ^/trunk/blender -r43482:43524
[blender.git] / source / blender / editors / sculpt_paint / sculpt.c
index ae5316e71c41ae6dec8dd99908da36ba7dcc744a..308534ab35cfc756a469ac3f4eb4c42985096de1 100644 (file)
@@ -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,