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