terrain sculpting enhancements, axis locking and brush strength multiply by grid
This commit is contained in:
@@ -496,7 +496,8 @@ typedef struct SculptData
|
||||
|
||||
/* Added to store if the 'Rake' setting has been set */
|
||||
char rake;
|
||||
char pad[3];
|
||||
char axislock;
|
||||
char pad[2];
|
||||
} SculptData;
|
||||
|
||||
typedef struct Scene {
|
||||
@@ -772,6 +773,10 @@ typedef struct Scene {
|
||||
#define SYMM_Y 2
|
||||
#define SYMM_Z 4
|
||||
|
||||
#define AXISLOCK_X 1
|
||||
#define AXISLOCK_Y 2
|
||||
#define AXISLOCK_Z 4
|
||||
|
||||
/* toolsettings->imagepaint_flag */
|
||||
#define IMAGEPAINT_DRAWING 1
|
||||
#define IMAGEPAINT_DRAW_TOOL 2
|
||||
|
||||
@@ -5528,11 +5528,24 @@ void sculptmode_draw_interface_tools(uiBlock *block, unsigned short cx, unsigned
|
||||
uiDefBut( block,LABEL,B_NOP,"Symmetry",cx,cy,90,19,NULL,0,0,0,0,"");
|
||||
cy-= 20;
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitC(block, TOG, SYMM_X, 0, "X", cx,cy,89,19, &sd->symm, 0,0,0,0, "Mirror brush across X axis");
|
||||
uiDefButBitC(block, TOG, SYMM_Y, 0, "Y", cx+89,cy,89,19, &sd->symm, 0,0,0,0, "Mirror brush across Y axis");
|
||||
uiDefButBitC(block, TOG, SYMM_Z, 0, "Z", cx+178,cy,90,19, &sd->symm, 0,0,0,0, "Mirror brush across Z axis");
|
||||
uiDefButBitC(block, TOG, SYMM_X, 0, "X", cx,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across X axis");
|
||||
uiDefButBitC(block, TOG, SYMM_Y, 0, "Y", cx+40,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across Y axis");
|
||||
uiDefButBitC(block, TOG, SYMM_Z, 0, "Z", cx+80,cy,40,19, &sd->symm, 0,0,0,0, "Mirror brush across Z axis");
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
|
||||
cy+= 20;
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefBut( block,LABEL,B_NOP,"LockAxis",cx+140,cy,90,19,NULL,0,0,0,0,"");
|
||||
cy-= 20;
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButBitC(block, TOG, AXISLOCK_X, 0, "X", cx+140,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain X axis");
|
||||
uiDefButBitC(block, TOG, AXISLOCK_Y, 0, "Y", cx+180,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain Y axis");
|
||||
uiDefButBitC(block, TOG, AXISLOCK_Z, 0, "Z", cx+220,cy,40,19, &sd->axislock, 0,0,0,0, "Constrain Z axis");
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
|
||||
|
||||
cx+= 210;
|
||||
}
|
||||
|
||||
|
||||
@@ -390,7 +390,7 @@ float brush_strength(BrushAction *a)
|
||||
switch(G.scene->sculptdata.brush_type){
|
||||
case DRAW_BRUSH:
|
||||
case LAYER_BRUSH:
|
||||
return b->strength / 5000.0f * dir * pressure * flip * anchored;
|
||||
return b->strength / 5000.0f * dir * pressure * flip * anchored * G.vd->grid;
|
||||
case SMOOTH_BRUSH:
|
||||
return b->strength / 50.0f * pressure * anchored;
|
||||
case PINCH_BRUSH:
|
||||
@@ -418,6 +418,15 @@ void sculpt_clip(const BrushAction *a, float *co, const float val[3])
|
||||
}
|
||||
}
|
||||
|
||||
void sculpt_axislock(float *co)
|
||||
{
|
||||
SculptData *sd = sculpt_data();
|
||||
if (sd->axislock == AXISLOCK_X+AXISLOCK_Y+AXISLOCK_Z) return;
|
||||
if (sd->axislock & AXISLOCK_X) co[0] = 0.0;
|
||||
if (sd->axislock & AXISLOCK_Y) co[1] = 0.0;
|
||||
if (sd->axislock & AXISLOCK_Z) co[2] = 0.0;
|
||||
}
|
||||
|
||||
static void add_norm_if(const BrushAction *a, float out[3], float out_flip[3], const short no[3])
|
||||
{
|
||||
float fno[3] = {no[0], no[1], no[2]};
|
||||
@@ -437,7 +446,8 @@ void calc_area_normal(float out[3], const BrushAction *a, const float *outdir, c
|
||||
{
|
||||
Mesh *me = get_mesh(OBACT);
|
||||
ActiveData *node = active_verts->first;
|
||||
const int view = sculpt_data()->brush_type==DRAW_BRUSH ? sculptmode_brush()->view : 0;
|
||||
SculptData *sd = sculpt_data();
|
||||
const int view = sd->brush_type==DRAW_BRUSH ? sculptmode_brush()->view : 0;
|
||||
float out_flip[3];
|
||||
|
||||
out[0]=out[1]=out[2] = out_flip[0]=out_flip[1]=out_flip[2] = 0;
|
||||
@@ -462,7 +472,7 @@ void calc_area_normal(float out[3], const BrushAction *a, const float *outdir, c
|
||||
out[1] = outdir[1] * view + out[1] * (10-view);
|
||||
out[2] = outdir[2] * view + out[2] * (10-view);
|
||||
}
|
||||
|
||||
|
||||
Normalize(out);
|
||||
}
|
||||
|
||||
@@ -473,7 +483,9 @@ void do_draw_brush(const BrushAction *a, const ListBase* active_verts)
|
||||
ActiveData *node= active_verts->first;
|
||||
|
||||
calc_area_normal(area_normal, a, a->symm.out, active_verts);
|
||||
|
||||
|
||||
sculpt_axislock(area_normal);
|
||||
|
||||
while(node){
|
||||
float *co= me->mvert[node->Index].co;
|
||||
|
||||
@@ -573,17 +585,22 @@ void do_grab_brush(BrushAction *a)
|
||||
Mesh *me= get_mesh(OBACT);
|
||||
ActiveData *node= a->grab_active_verts[a->symm.index].first;
|
||||
float add[3];
|
||||
|
||||
float grab_delta[3];
|
||||
|
||||
VecCopyf(grab_delta, a->symm.grab_delta);
|
||||
sculpt_axislock(grab_delta);
|
||||
|
||||
while(node) {
|
||||
float *co= me->mvert[node->Index].co;
|
||||
|
||||
VecCopyf(add, a->symm.grab_delta);
|
||||
VecCopyf(add, grab_delta);
|
||||
VecMulf(add, node->Fade);
|
||||
VecAddf(add, add, co);
|
||||
sculpt_clip(a, co, add);
|
||||
|
||||
node= node->next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void do_layer_brush(BrushAction *a, const ListBase *active_verts)
|
||||
|
||||
Reference in New Issue
Block a user