Dynamic Paint:

* Smudge now works properly with substeps.
* Velocity brush speed clamping now works for all brush types.
* Small tweaking on velocity brush ui.
This commit is contained in:
Miika Hamalainen 2011-08-04 07:09:21 +00:00
parent daea8a28ae
commit f4c93eb580
2 changed files with 28 additions and 23 deletions

@ -121,15 +121,19 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
split.prop(brush, "wave_factor")
elif (brush.brush_settings_context == "VELOCITY"):
col = layout.row().column()
col.label(text="Velocity Settings:")
split = layout.split()
col = split.column()
col.prop(brush, "velocity_alpha")
col.prop(brush, "velocity_color")
col = split.column()
col.prop(brush, "velocity_depth")
col = layout.row().column()
sub = col.column()
sub.active = (brush.velocity_alpha or brush.velocity_color)
sub = layout.row().column()
sub.active = (brush.velocity_alpha or brush.velocity_color or brush.velocity_depth)
sub.prop(brush, "max_velocity")
sub.template_color_ramp(brush, "velocity_ramp", expand=True)
layout.separator()
layout.label(text="Smudge:")
layout.prop(brush, "do_smudge")
layout.prop(brush, "smudge_strength")
else:

@ -170,9 +170,9 @@ typedef struct PaintBakeData {
VolumeGrid *grid; /* space partitioning grid to optimize brush checks */
/* velocity and movement */
Vec3f *velocity; /* speed vector in global space, if required */
Vec3f *velocity; /* speed vector in global space movement per frame, if required */
Vec3f *prev_velocity;
float *brush_velocity; /* special temp data for post-p velocity based brushes like smear
float *brush_velocity; /* special temp data for post-p velocity based brushes like smudge
* 3 float dir vec + 1 float str */
MVert *prev_verts; /* copy of previous frame vertices. used to observe surface movement */
float prev_obmat[4][4]; /* previous frame object matrix */
@ -3085,6 +3085,9 @@ static void dynamicPaint_updatePointData(DynamicPaintSurface *surface, unsigned
/* Sample velocity colorband if required */
if (brush->flags & (MOD_DPAINT_VELOCITY_ALPHA|MOD_DPAINT_VELOCITY_COLOR|MOD_DPAINT_VELOCITY_DEPTH)) {
float coba_res[4];
vel_factor /= brush->max_velocity;
CLAMP(vel_factor, 0.0f, 1.0f);
if (do_colorband(brush->vel_ramp, vel_factor, coba_res)) {
if (brush->flags & MOD_DPAINT_VELOCITY_COLOR) {
paint[0] = coba_res[0];
@ -3538,7 +3541,6 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
/* substract canvas point velocity */
VECSUB(velocity, brushPointVelocity, bData->velocity[index].v);
velocity_val = len_v3(velocity);
/* */
@ -3547,9 +3549,6 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
bData->brush_velocity[index*4+3] = velocity_val;
}
velocity_val /= brush->max_velocity;
CLAMP(velocity_val, 0.0f, 1.0f);
}
/*
@ -3839,8 +3838,10 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSys
{
float velocity[3];
ParticleData *pa = psys->particles + part_index;
mul_v3_v3fl(velocity, pa->state.vel, particle_timestep);
/* substract canvas point velocity */
VECSUB(velocity, velocity, bData->velocity[index].v);
velocity_val = len_v3(velocity);
if (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
@ -3848,9 +3849,6 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSys
mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
bData->brush_velocity[index*4+3] = velocity_val;
}
velocity_val /= brush->max_velocity;
CLAMP(velocity_val, 0.0f, 1.0f);
}
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
@ -3890,12 +3888,9 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
PaintSurfaceData *sData = surface->data;
PaintBakeData *bData = sData->bData;
Vec3f brushVel;
float velocity_val = 0.0f;
if (brush->flags & MOD_DPAINT_USES_VELOCITY) {
if (brush->flags & MOD_DPAINT_USES_VELOCITY)
dynamicPaint_brushObjectCalculateVelocity(scene, brushOb, brush, &brushVel, timescale);
velocity_val = len_v3(brushVel.v);
}
/*
* Loop through every surface point
@ -3921,6 +3916,7 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
if (strength >= 0.001f) {
float paintColor[3] = {0.0f};
float depth = 0.0f;
float velocity_val = 0.0f;
/* material */
if (brush->flags & MOD_DPAINT_USE_MATERIAL) {
@ -3938,8 +3934,14 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
strength = colorband[3];
if (brush->flags & MOD_DPAINT_USES_VELOCITY) {
float velocity[3];
/* substract canvas point velocity */
VECSUB(velocity, brushVel.v, bData->velocity[index].v);
velocity_val = len_v3(velocity);
if (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
VECCOPY(&bData->brush_velocity[index*4], brushVel.v);
VECCOPY(&bData->brush_velocity[index*4], velocity);
mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
bData->brush_velocity[index*4+3] = velocity_val;
}
@ -4031,7 +4033,7 @@ static void dynamicPaint_prepareNeighbourData(DynamicPaintSurface *surface, int
bData->average_dist /= adj_data->total_targets;
}
static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrushSettings *brush)
static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrushSettings *brush, float timescale)
{
PaintSurfaceData *sData = surface->data;
PaintBakeData *bData = sData->bData;
@ -4047,13 +4049,12 @@ static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrus
if (vel > max_velocity) max_velocity = vel;
}
steps = (int)ceil(max_velocity / bData->average_dist);
steps = (int)ceil(max_velocity / bData->average_dist * timescale);
CLAMP(steps, 0, 12);
eff_scale = brush->smudge_strength/(float)steps*timescale;
for (step=0; step<steps; step++) {
eff_scale = brush->smudge_strength/(float)steps;
for (index = 0; index < sData->total_points; index++) {
int i;
int numOfNeighs = sData->adj_data->n_num[index];
@ -5018,7 +5019,7 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su
/* process special brush effects, like smudge */
if (bData->brush_velocity) {
if (brush->flags & MOD_DPAINT_DO_SMUDGE)
dynamicPaint_doSmudge(surface, brush);
dynamicPaint_doSmudge(surface, brush, timescale);
MEM_freeN(bData->brush_velocity);
bData->brush_velocity = NULL;
}