Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2009-06-21 22:59:26 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2009-06-21 22:59:26 +0400
commit1efffc1f564af0597512699890d7be9f41a6aee2 (patch)
tree8a4fd65cc57d6eccaa8f25a00cea62f60daacf5e /source/blender/editors/sculpt_paint
parent03c46c1e54e762fa81864e4cf2311d8c3f49ea0f (diff)
2.5/Sculpt:
Fixed the Lock X/Y/Z buttons for sculpt, should work for all brushes now.
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c73
1 files changed, 27 insertions, 46 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 36d505d5c7c..ac86e2ed962 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -263,39 +263,22 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache)
}
}
-/* For clipping against a mirror modifier */
-static void sculpt_clip(StrokeCache *cache, float *co, const float val[3])
+/* Handles clipping against a mirror modifier and SCULPT_LOCK axis flags */
+static void sculpt_clip(Sculpt *sd, float *co, const float val[3])
{
int i;
+
for(i=0; i<3; ++i) {
- if((cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= cache->clip_tolerance[i]))
+ if(sd->flags & (SCULPT_LOCK_X << i))
+ continue;
+
+ if((sd->session->cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= sd->session->cache->clip_tolerance[i]))
co[i]= 0.0f;
else
co[i]= val[i];
}
}
-static void sculpt_axislock(Sculpt *sd, float *co)
-{
- if(sd->flags == (SCULPT_LOCK_X|SCULPT_LOCK_Y|SCULPT_LOCK_Z))
- return;
-
- if(sd->session->cache->vc.v3d->twmode == V3D_MANIP_LOCAL) {
- float mat[3][3], imat[3][3];
- Mat3CpyMat4(mat, sd->session->cache->vc.obact->obmat);
- Mat3Inv(imat, mat);
- Mat3MulVecfl(mat, co);
- if (sd->flags & SCULPT_LOCK_X) co[0] = 0.0;
- if (sd->flags & SCULPT_LOCK_Y) co[1] = 0.0;
- if (sd->flags & SCULPT_LOCK_Z) co[2] = 0.0;
- Mat3MulVecfl(imat, co);
- } else {
- if (sd->flags & SCULPT_LOCK_X) co[0] = 0.0;
- if (sd->flags & SCULPT_LOCK_Y) co[1] = 0.0;
- if (sd->flags & SCULPT_LOCK_Z) co[2] = 0.0;
- }
-}
-
static void add_norm_if(float view_vec[3], float out[3], float out_flip[3], const short no[3])
{
float fno[3] = {no[0], no[1], no[2]};
@@ -352,8 +335,6 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_
calc_area_normal(sd, area_normal, active_verts);
- sculpt_axislock(sd, area_normal);
-
while(node){
float *co= ss->mvert[node->Index].co;
@@ -361,7 +342,7 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_
co[1]+area_normal[1]*ss->cache->radius*node->Fade*ss->cache->scale[1],
co[2]+area_normal[2]*ss->cache->radius*node->Fade*ss->cache->scale[2]};
- sculpt_clip(ss->cache, co, val);
+ sculpt_clip(sd, co, val);
node= node->next;
}
@@ -411,37 +392,37 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert)
VecCopyf(avg, ss->mvert[vert].co);
}
-static void do_smooth_brush(SculptSession *ss, const ListBase* active_verts)
+static void do_smooth_brush(Sculpt *s, const ListBase* active_verts)
{
ActiveData *node= active_verts->first;
int i;
for(i = 0; i < 2; ++i) {
while(node){
- float *co= ss->mvert[node->Index].co;
+ float *co= s->session->mvert[node->Index].co;
float avg[3], val[3];
- neighbor_average(ss, avg, node->Index);
+ neighbor_average(s->session, avg, node->Index);
val[0] = co[0]+(avg[0]-co[0])*node->Fade;
val[1] = co[1]+(avg[1]-co[1])*node->Fade;
val[2] = co[2]+(avg[2]-co[2])*node->Fade;
- sculpt_clip(ss->cache, co, val);
+ sculpt_clip(s, co, val);
node= node->next;
}
}
}
-static void do_pinch_brush(SculptSession *ss, const ListBase* active_verts)
+static void do_pinch_brush(Sculpt *s, const ListBase* active_verts)
{
ActiveData *node= active_verts->first;
while(node) {
- float *co= ss->mvert[node->Index].co;
- const float val[3]= {co[0]+(ss->cache->location[0]-co[0])*node->Fade,
- co[1]+(ss->cache->location[1]-co[1])*node->Fade,
- co[2]+(ss->cache->location[2]-co[2])*node->Fade};
- sculpt_clip(ss->cache, co, val);
+ float *co= s->session->mvert[node->Index].co;
+ const float val[3]= {co[0]+(s->session->cache->location[0]-co[0])*node->Fade,
+ co[1]+(s->session->cache->location[1]-co[1])*node->Fade,
+ co[2]+(s->session->cache->location[2]-co[2])*node->Fade};
+ sculpt_clip(s, co, val);
node= node->next;
}
}
@@ -453,7 +434,6 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss)
float grab_delta[3];
VecCopyf(grab_delta, ss->cache->grab_delta_symmetry);
- sculpt_axislock(sd, grab_delta);
while(node) {
float *co= ss->mvert[node->Index].co;
@@ -461,7 +441,7 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss)
VecCopyf(add, grab_delta);
VecMulf(add, node->Fade);
VecAddf(add, add, co);
- sculpt_clip(ss->cache, co, add);
+ sculpt_clip(sd, co, add);
node= node->next;
}
@@ -494,15 +474,16 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, const ListBase *active
val[1] = ss->cache->mesh_store[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1];
val[2] = ss->cache->mesh_store[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2];
- sculpt_clip(ss->cache, co, val);
+ sculpt_clip(sd, co, val);
node= node->next;
}
}
-static void do_inflate_brush(SculptSession *ss, const ListBase *active_verts)
+static void do_inflate_brush(Sculpt *s, const ListBase *active_verts)
{
ActiveData *node= active_verts->first;
+ SculptSession *ss = s->session;
float add[3];
while(node) {
@@ -518,7 +499,7 @@ static void do_inflate_brush(SculptSession *ss, const ListBase *active_verts)
add[2]*= ss->cache->scale[2];
VecAddf(add, add, co);
- sculpt_clip(ss->cache, co, add);
+ sculpt_clip(s, co, add);
node= node->next;
}
@@ -581,7 +562,7 @@ static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, const ListBase
VecAddf(val, val, tmp);
}
- sculpt_clip(ss->cache, co, val);
+ sculpt_clip(sd, co, val);
node= node->next;
}
@@ -839,13 +820,13 @@ static void do_brush_action(Sculpt *sd, StrokeCache *cache)
do_draw_brush(sd, ss, &active_verts);
break;
case SCULPT_TOOL_SMOOTH:
- do_smooth_brush(ss, &active_verts);
+ do_smooth_brush(sd, &active_verts);
break;
case SCULPT_TOOL_PINCH:
- do_pinch_brush(ss, &active_verts);
+ do_pinch_brush(sd, &active_verts);
break;
case SCULPT_TOOL_INFLATE:
- do_inflate_brush(ss, &active_verts);
+ do_inflate_brush(sd, &active_verts);
break;
case SCULPT_TOOL_GRAB:
do_grab_brush(sd, ss);