Dynamic Paint:
authorMiika Hamalainen <blender@miikah.org>
Thu, 4 Aug 2011 07:09:21 +0000 (07:09 +0000)
committerMiika Hamalainen <blender@miikah.org>
Thu, 4 Aug 2011 07:09:21 +0000 (07:09 +0000)
* Smudge now works properly with substeps.
* Velocity brush speed clamping now works for all brush types.
* Small tweaking on velocity brush ui.

release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
source/blender/blenkernel/intern/dynamicpaint.c

index 15326b51172555182f4fe9f3018ceae289ff48be..711c26b9033250780f2271e86d13b76b132b3f1d 100644 (file)
@@ -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:
index d78170fa73e1429804a5bf2513d85596d9975000..290e6320c96fd4c424b0104a8e49616b21802c62 100644 (file)
@@ -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;
                                        }