Revision: 18526
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18526
Author:   nicholasbishop
Date:     2009-01-15 17:57:17 +0100 (Thu, 15 Jan 2009)

Log Message:
-----------
Brought back grab brush in sculpt mode, also removed old BrushAction struct.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c

Modified: branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c  
2009-01-15 16:18:32 UTC (rev 18525)
+++ branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c  
2009-01-15 16:57:17 UTC (rev 18526)
@@ -115,15 +115,6 @@
        float dist;
 } ActiveData;
 
-typedef struct BrushActionSymm {
-       char index;
-
-       float up[3], right[3], out[3];
-
-       /* Grab brush */
-       float grab_delta[3];
-} BrushActionSymm;
-
 typedef enum StrokeFlags {
        CLIP_X = 1,
        CLIP_Y = 2,
@@ -151,6 +142,7 @@
        int mouse[2];
 
        /* Truly temporary storage that isn't saved as a property */
+       int first_time; /* Beginning of stroke may do some things special */
        MVert *mvert; /* Can be either Mesh mverts or MultiresDM mverts */
        int totvert; /* Number of mverts */
        float *layer_disps; /* Displacements for each vertex */
@@ -158,17 +150,13 @@
        short (*orig_norms)[3]; /* Copy of the mesh vertices' normals */
        int anchored_rotation; /* Texture rotation in anchored mode */
        int pixel_radius, previous_pixel_radius;
+       ListBase grab_active_verts[8]; /* The same list of verts is used 
throught grab stroke */
+       float grab_delta[3], grab_delta_symmetry[3];
+       float old_grab_location[3];
+       int symmetry; /* Symmetry index between 0 and 7 */
+       float view_normal[3], view_normal_symmetry[3];
 } StrokeCache;
 
-typedef struct BrushAction {
-       BrushActionSymm symm;
-
-       char firsttime;
-
-       /* Grab brush */
-       ListBase grab_active_verts[8];
-} BrushAction;
-
 typedef struct RectNode {
        struct RectNode *next, *prev;
        rcti r;
@@ -408,21 +396,23 @@
 
 /* Currently only for the draw brush; finds average normal for all active
    vertices */
-static void calc_area_normal(SculptData *sd, float out[3], BrushAction *a, 
const float *outdir, const ListBase* active_verts)
+static void calc_area_normal(SculptData *sd, float out[3], const ListBase* 
active_verts)
 {
+       StrokeCache *cache = sd->session->cache;
        ActiveData *node = active_verts->first;
        const int view = 0; /* XXX: should probably be a flag, not number: 
sd->brush_type==SCULPT_TOOL_DRAW ? sculptmode_brush()->view : 0; */
        float out_flip[3];
+       float *out_dir = cache->view_normal_symmetry;
        
        out[0]=out[1]=out[2] = out_flip[0]=out_flip[1]=out_flip[2] = 0;
 
        if(sd->brush->flag & BRUSH_ANCHORED) {
                for(; node; node = node->next)
-                       add_norm_if(a->symm.out, out, out_flip, 
sd->session->cache->orig_norms[node->Index]);
+                       add_norm_if(out_dir, out, out_flip, 
cache->orig_norms[node->Index]);
        }
        else {
                for(; node; node = node->next)
-                       add_norm_if(a->symm.out, out, out_flip, 
sd->session->mvert[node->Index].no);
+                       add_norm_if(out_dir, out, out_flip, 
cache->mvert[node->Index].no);
        }
 
        if (out[0]==0.0 && out[1]==0.0 && out[2]==0.0) {
@@ -431,21 +421,21 @@
        
        Normalize(out);
 
-       if(outdir) {
-               out[0] = outdir[0] * view + out[0] * (10-view);
-               out[1] = outdir[1] * view + out[1] * (10-view);
-               out[2] = outdir[2] * view + out[2] * (10-view);
+       if(out_dir) {
+               out[0] = out_dir[0] * view + out[0] * (10-view);
+               out[1] = out_dir[1] * view + out[1] * (10-view);
+               out[2] = out_dir[2] * view + out[2] * (10-view);
        }
        
        Normalize(out);
 }
 
-static void do_draw_brush(SculptData *sd, SculptSession *ss, BrushAction *a, 
const ListBase* active_verts)
+static void do_draw_brush(SculptData *sd, SculptSession *ss, const ListBase* 
active_verts)
 {
        float area_normal[3];
        ActiveData *node= active_verts->first;
 
-       calc_area_normal(sd, area_normal, a, a->symm.out, active_verts);
+       calc_area_normal(sd, area_normal, active_verts);
        
        sculpt_axislock(sd, area_normal);
        
@@ -524,7 +514,7 @@
        }
 }
 
-static void do_pinch_brush(SculptSession *ss, const BrushAction *a, const 
ListBase* active_verts)
+static void do_pinch_brush(SculptSession *ss, const ListBase* active_verts)
 {
        ActiveData *node= active_verts->first;
 
@@ -538,13 +528,13 @@
        }
 }
 
-static void do_grab_brush(SculptData *sd, SculptSession *ss, BrushAction *a)
+static void do_grab_brush(SculptData *sd, SculptSession *ss)
 {
-       ActiveData *node= a->grab_active_verts[a->symm.index].first;
+       ActiveData *node= 
ss->cache->grab_active_verts[ss->cache->symmetry].first;
        float add[3];
        float grab_delta[3];
        
-       VecCopyf(grab_delta, a->symm.grab_delta);
+       VecCopyf(grab_delta, ss->cache->grab_delta_symmetry);
        sculpt_axislock(sd, grab_delta);
        
        while(node) {
@@ -560,13 +550,13 @@
        
 }
 
-static void do_layer_brush(SculptData *sd, SculptSession *ss, BrushAction *a, 
const ListBase *active_verts)
+static void do_layer_brush(SculptData *sd, SculptSession *ss, const ListBase 
*active_verts)
 {
        float area_normal[3];
        ActiveData *node= active_verts->first;
        const float bstr= brush_strength(sd, ss->cache);
 
-       calc_area_normal(sd, area_normal, a, NULL, active_verts);
+       calc_area_normal(sd, area_normal, active_verts);
 
        while(node){
                float *disp= &ss->cache->layer_disps[node->Index];
@@ -644,14 +634,14 @@
        VecMulf(co, 1.0f / FLATTEN_SAMPLE_SIZE);
 }
 
-static void do_flatten_brush(SculptData *sd, SculptSession *ss, BrushAction 
*a, const ListBase *active_verts)
+static void do_flatten_brush(SculptData *sd, SculptSession *ss, const ListBase 
*active_verts)
 {
        ActiveData *node= active_verts->first;
        /* area_normal and cntr define the plane towards which vertices are 
squashed */
        float area_normal[3];
        float cntr[3];
 
-       calc_area_normal(sd, area_normal, a, a->symm.out, active_verts);
+       calc_area_normal(sd, area_normal, active_verts);
        calc_flatten_center(ss, node, cntr);
 
        while(node){
@@ -762,7 +752,7 @@
 }
 
 /* Return a multiplier for brush strength on a particular vertex. */
-static float tex_strength(SculptData *sd, BrushAction *a, float *point, const 
float len)
+static float tex_strength(SculptData *sd, float *point, const float len)
 {
        SculptSession *ss= sd->session;
        float avg= 1;
@@ -797,7 +787,7 @@
                   across the symmetry axis in order to project it. This insures
                   that the brush texture will be oriented correctly. */
                VecCopyf(flip, point);
-               flip_coord(flip, flip, a->symm.index);
+               flip_coord(flip, flip, ss->cache->symmetry);
                projectf(ss, flip, point_2d);
 
                /* For Tile and Drag modes, get the 2D screen coordinates of the
@@ -846,7 +836,7 @@
 /* Mark area around the brush as damaged. projverts are marked if they are
    inside the area and the damaged rectangle in 2D screen coordinates is 
    added to damaged_rects. */
-static void sculpt_add_damaged_rect(SculptSession *ss, BrushAction *a)
+static void sculpt_add_damaged_rect(SculptSession *ss)
 {
        short p[2];
        RectNode *rn= MEM_mallocN(sizeof(RectNode),"RectNode");
@@ -906,24 +896,25 @@
        }
 }
 
-static void do_brush_action(SculptData *sd, StrokeCache *cache, BrushAction *a)
+static void do_brush_action(SculptData *sd, StrokeCache *cache)
 {
-       int i;
+       SculptSession *ss = sd->session;
        float av_dist;
        ListBase active_verts={0,0};
+       ListBase *grab_active_verts = 
&ss->cache->grab_active_verts[ss->cache->symmetry];
        ActiveData *adata= 0;
        float *vert;
        Mesh *me= NULL; /*XXX: get_mesh(OBACT); */
        const float bstrength= brush_strength(sd, cache);
        KeyBlock *keyblock= NULL; /*XXX: ob_get_keyblock(OBACT); */
-       SculptSession *ss = sd->session;
        Brush *b = sd->brush;
+       int i;
 
-       sculpt_add_damaged_rect(ss, a);
+       sculpt_add_damaged_rect(ss);
 
        /* Build a list of all vertices that are potentially within the brush's
           area of influence. Only do this once for the grab brush. */
-       if((b->sculpt_tool != SCULPT_TOOL_GRAB) || a->firsttime) {
+       if((b->sculpt_tool != SCULPT_TOOL_GRAB) || cache->first_time) {
                for(i=0; i<ss->totvert; ++i) {
                        /* Projverts.inside provides a rough bounding box */
                        if(ss->multires || ss->projverts[i].inside) {
@@ -936,11 +927,11 @@
                                        adata->Index = i;
                                        /* Fade is used to store the final 
strength at which the brush
                                           should modify a particular vertex. */
-                                       adata->Fade= tex_strength(sd, a, vert, 
av_dist) * bstrength;
+                                       adata->Fade= tex_strength(sd, vert, 
av_dist) * bstrength;
                                        adata->dist = av_dist;
 
-                                       if(b->sculpt_tool == SCULPT_TOOL_GRAB 
&& a->firsttime)
-                                               
BLI_addtail(&a->grab_active_verts[a->symm.index], adata);
+                                       if(b->sculpt_tool == SCULPT_TOOL_GRAB 
&& cache->first_time)
+                                               BLI_addtail(grab_active_verts, 
adata);
                                        else
                                                BLI_addtail(&active_verts, 
adata);
                                }
@@ -949,29 +940,29 @@
        }
 
        /* Only act if some verts are inside the brush area */
-       if(active_verts.first || (b->sculpt_tool == SCULPT_TOOL_GRAB && 
a->grab_active_verts[a->symm.index].first)) {
+       if(active_verts.first || (b->sculpt_tool == SCULPT_TOOL_GRAB && 
grab_active_verts->first)) {
                /* Apply one type of brush action */
                switch(b->sculpt_tool){
                case SCULPT_TOOL_DRAW:
-                       do_draw_brush(sd, ss, a, &active_verts);
+                       do_draw_brush(sd, ss, &active_verts);
                        break;
                case SCULPT_TOOL_SMOOTH:
                        do_smooth_brush(ss, &active_verts);
                        break;
                case SCULPT_TOOL_PINCH:
-                       do_pinch_brush(ss, a, &active_verts);
+                       do_pinch_brush(ss, &active_verts);
                        break;
                case SCULPT_TOOL_INFLATE:
                        do_inflate_brush(ss, &active_verts);
                        break;
                case SCULPT_TOOL_GRAB:
-                       do_grab_brush(sd, ss, a);
+                       do_grab_brush(sd, ss);
                        break;
                case SCULPT_TOOL_LAYER:
-                       do_layer_brush(sd, ss, a, &active_verts);
+                       do_layer_brush(sd, ss, &active_verts);
                        break;
                case SCULPT_TOOL_FLATTEN:
-                       do_flatten_brush(sd, ss, a, &active_verts);
+                       do_flatten_brush(sd, ss, &active_verts);
                        break;
                }
        
@@ -980,7 +971,7 @@
                        float *co= keyblock->data;
                        if(co) {
                                if(b->sculpt_tool == SCULPT_TOOL_GRAB)
-                                       adata = 
a->grab_active_verts[a->symm.index].first;
+                                       adata = grab_active_verts->first;
                                else
                                        adata = active_verts.first;
 
@@ -1001,40 +992,32 @@
 
 /* Flip all the editdata across the axis/axes specified by symm. Used to
    calculate multiple modifications to the mesh when symmetry is enabled. */
-static void calc_brushdata_symm(StrokeCache *cache, BrushAction *a, const char 
symm)
+static void calc_brushdata_symm(StrokeCache *cache, const char symm)
 {
        flip_coord(cache->location, cache->true_location, symm);
-       /*flip_coord(a->symm.up, symm);
-       flip_coord(a->symm.right, symm);
-       flip_coord(a->symm.out, symm);*/
-       
-       a->symm.index= symm;
-
-       //flip_coord(a->symm.grab_delta, symm);
+       flip_coord(cache->view_normal_symmetry, cache->view_normal, symm);
+       flip_coord(cache->grab_delta_symmetry, cache->grab_delta, symm);
+       cache->symmetry= symm;
 }
 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to