Revision: 41412
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41412
Author:   miikah
Date:     2011-10-31 13:01:06 +0000 (Mon, 31 Oct 2011)
Log Message:
-----------
Dynamic Paint:
* Redesigned alpha blending and paint drying algorithms. Now it gives much 
better results when using low brush alpha or when surface has initial color set.
* Fix: "Slow" dissolve/dry was scaled incorrect when using substeps. Also 
adjusted time to better match non-"slow" setting.
* Fixed possible issues when using image textured brush.
* Fix: particle brush panel was no longer visible since last commit.
* Adjusted default surface values.
* Some more code cleanup.

Modified Paths:
--------------
    
branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
    branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c
    branches/soc-2011-carrot/source/blender/makesrna/intern/rna_dynamicpaint.c
    branches/soc-2011-carrot/source/blender/modifiers/intern/MOD_dynamicpaint.c
    branches/soc-2011-carrot/source/blender/render/intern/include/texture.h
    
branches/soc-2011-carrot/source/blender/render/intern/source/convertblender.c
    
branches/soc-2011-carrot/source/blender/render/intern/source/render_texture.c
    branches/soc-2011-carrot/source/blender/render/intern/source/shadeoutput.c

Modified: 
branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
===================================================================
--- 
branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
   2011-10-31 12:31:48 UTC (rev 41411)
+++ 
branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
   2011-10-31 13:01:06 UTC (rev 41412)
@@ -402,7 +402,7 @@
             if brush.particle_system:
                 col.label(text="Particle effect:")
                 sub = col.column()
-                sub.active = not brush.use_part_radius
+                sub.active = not brush.use_particle_radius
                 sub.prop(brush, "solid_radius", text="Solid Radius")
                 col.prop(brush, "use_particle_radius", text="Use Particle's 
Radius")
                 col.prop(brush, "smooth_radius", text="Smooth radius")
@@ -462,7 +462,7 @@
         col.prop(brush, "smudge_strength")
         
 class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, bpy.types.Panel):
-    bl_label = "Dynamic Paint Wave"
+    bl_label = "Dynamic Paint Waves"
     bl_options = {'DEFAULT_CLOSED'}
 
     @classmethod

Modified: 
branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c    
2011-10-31 12:31:48 UTC (rev 41411)
+++ branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c    
2011-10-31 13:01:06 UTC (rev 41412)
@@ -99,11 +99,11 @@
 #define EFF_MOVEMENT_PER_FRAME 0.05f
 /* initial wave time factor */
 #define WAVE_TIME_FAC 0.1
+/* drying limits */
+#define MIN_WETNESS 0.001f
 /* dissolve macro */
-#define VALUE_DISSOLVE(VALUE, SPEED, SCALE, LOG) (VALUE) = (LOG) ? (VALUE) * 
1.0f - 1.0f/((SPEED)/(SCALE)) : (VALUE) - 1.0f/(SPEED)*(SCALE)
+#define VALUE_DISSOLVE(VALUE, TIME, SCALE, LOG) (VALUE) = (LOG) ? (VALUE) * 
(pow(MIN_WETNESS,1.0f/(1.2f*((float)(TIME))/(SCALE)))) : (VALUE) - 
1.0f/(TIME)*(SCALE)
 
-static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface 
*surface, float timescale, float subframe);
-
 /***************************** Internal Structs ***************************/
 
 typedef struct Bounds2D {
@@ -399,6 +399,25 @@
        return surface->data->total_points;
 }
 
+static void blendColors(float t_color[3], float t_alpha, float s_color[3], 
float s_alpha, float result[4])
+{
+       int i;
+       float i_alpha = 1.0f - s_alpha;
+       float f_alpha = t_alpha*i_alpha + s_alpha;
+
+       /* blend colors */
+       if (f_alpha) {
+               for (i=0; i<3; i++) {
+                       result[i] = (t_color[i]*t_alpha*i_alpha + 
s_color[i]*s_alpha)/f_alpha;
+               }
+       }
+       else {
+               copy_v3_v3(result, t_color);
+       }
+       /* return final alpha */
+       result[3] = f_alpha;
+}
+
 /* assumes source alpha > 0.0f or results NaN colors */
 static void mixColors(float *t_color, float t_alpha, float *s_color, float 
s_alpha)
 {
@@ -917,8 +936,8 @@
        surface->effect = 0;
        surface->effect_ui = 1;
 
-       surface->diss_speed = 300;
-       surface->dry_speed = 300;
+       surface->diss_speed = 250;
+       surface->dry_speed = 500;
        surface->depth_clamp = 0.0f;
        surface->disp_factor = 1.0f;
        surface->disp_type = MOD_DPAINT_DISP_DISPLACE;
@@ -946,7 +965,7 @@
        surface->shrink_speed = 1.0f;
 
        surface->wave_damping = 0.05f;
-       surface->wave_speed = 0.8f;
+       surface->wave_speed = 1.0f;
        surface->wave_timescale = 1.0f;
        surface->wave_spring = 0.20;
 
@@ -970,62 +989,64 @@
 {
        if(pmd) {
                if(type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
+                       DynamicPaintCanvasSettings *canvas;
                        if(pmd->canvas)
                                dynamicPaint_freeCanvas(pmd);
 
-                       pmd->canvas = 
MEM_callocN(sizeof(DynamicPaintCanvasSettings), "DynamicPaint Canvas");
-                       if (!pmd->canvas)
+                       canvas = pmd->canvas = 
MEM_callocN(sizeof(DynamicPaintCanvasSettings), "DynamicPaint Canvas");
+                       if (!canvas)
                                return 0;
-                       pmd->canvas->pmd = pmd;
-                       pmd->canvas->dm = NULL;
+                       canvas->pmd = pmd;
+                       canvas->dm = NULL;
 
                        /* Create one surface */
-                       if (!dynamicPaint_createNewSurface(pmd->canvas, scene))
+                       if (!dynamicPaint_createNewSurface(canvas, scene))
                                return 0;
 
                }
                else if(type == MOD_DYNAMICPAINT_TYPE_BRUSH) {
+                       DynamicPaintBrushSettings *brush;
                        if(pmd->brush)
                                dynamicPaint_freeBrush(pmd);
 
-                       pmd->brush = 
MEM_callocN(sizeof(DynamicPaintBrushSettings), "DynamicPaint Paint");
-                       if (!pmd->brush)
+                       brush = pmd->brush = 
MEM_callocN(sizeof(DynamicPaintBrushSettings), "DynamicPaint Paint");
+                       if (!brush)
                                return 0;
-                       pmd->brush->pmd = pmd;
+                       brush->pmd = pmd;
 
-                       pmd->brush->psys = NULL;
+                       brush->psys = NULL;
 
-                       pmd->brush->flags = MOD_DPAINT_ABS_ALPHA | 
MOD_DPAINT_RAMP_ALPHA;
-                       pmd->brush->collision = MOD_DPAINT_COL_VOLUME;
+                       brush->flags = MOD_DPAINT_ABS_ALPHA | 
MOD_DPAINT_RAMP_ALPHA;
+                       brush->collision = MOD_DPAINT_COL_VOLUME;
                        
-                       pmd->brush->mat = NULL;
-                       pmd->brush->r = 0.15f;
-                       pmd->brush->g = 0.4f;
-                       pmd->brush->b = 0.8f;
-                       pmd->brush->alpha = 1.0f;
-                       pmd->brush->wetness = 1.0f;
+                       brush->mat = NULL;
+                       brush->r = 0.15f;
+                       brush->g = 0.4f;
+                       brush->b = 0.8f;
+                       brush->alpha = 1.0f;
+                       brush->wetness = 1.0f;
 
-                       pmd->brush->paint_distance = 1.0f;
-                       pmd->brush->proximity_falloff = 
MOD_DPAINT_PRFALL_SMOOTH;
+                       brush->paint_distance = 1.0f;
+                       brush->proximity_falloff = MOD_DPAINT_PRFALL_SMOOTH;
 
-                       pmd->brush->particle_radius = 0.2f;
-                       pmd->brush->particle_smooth = 0.05f;
+                       brush->particle_radius = 0.2f;
+                       brush->particle_smooth = 0.05f;
 
-                       pmd->brush->wave_factor = 1.0f;
-                       pmd->brush->wave_clamp = 0.0f;
-                       pmd->brush->smudge_strength = 0.3f;
-                       pmd->brush->max_velocity = 1.0f;
+                       brush->wave_factor = 1.0f;
+                       brush->wave_clamp = 0.0f;
+                       brush->smudge_strength = 0.3f;
+                       brush->max_velocity = 1.0f;
 
-                       pmd->brush->dm = NULL;
+                       brush->dm = NULL;
 
                        /* Paint proximity falloff colorramp. */
                        {
                                CBData *ramp;
 
-                               pmd->brush->paint_ramp = add_colorband(0);
-                               if (!pmd->brush->paint_ramp)
+                               brush->paint_ramp = add_colorband(0);
+                               if (!brush->paint_ramp)
                                        return 0;
-                               ramp = pmd->brush->paint_ramp->data;
+                               ramp = brush->paint_ramp->data;
                                /* Add default smooth-falloff ramp.     */
                                ramp[0].r = ramp[0].g = ramp[0].b = ramp[0].a = 
1.0f;
                                ramp[0].pos = 0.0f;
@@ -1038,13 +1059,13 @@
                        {
                                CBData *ramp;
 
-                               pmd->brush->vel_ramp = add_colorband(0);
-                               if (!pmd->brush->vel_ramp)
+                               brush->vel_ramp = add_colorband(0);
+                               if (!brush->vel_ramp)
                                        return 0;
-                               ramp = pmd->brush->vel_ramp->data;
+                               ramp = brush->vel_ramp->data;
                                ramp[0].r = ramp[0].g = ramp[0].b = ramp[0].a = 
ramp[0].pos = 0.0f;
                                ramp[1].r = ramp[1].g = ramp[1].b = ramp[1].a = 
ramp[1].pos = 1.0f;
-                               pmd->brush->paint_ramp->tot = 2;
+                               brush->paint_ramp->tot = 2;
                        }
                }
        }
@@ -1068,36 +1089,37 @@
                tpmd->canvas->pmd = tpmd;
 
        } else if (tpmd->brush) {
-               tpmd->brush->pmd = tpmd;
+               DynamicPaintBrushSettings *brush = pmd->brush, *t_brush = 
tpmd->brush;
+               t_brush->pmd = tpmd;
 
-               tpmd->brush->flags = pmd->brush->flags;
-               tpmd->brush->collision = pmd->brush->collision;
+               t_brush->flags = brush->flags;
+               t_brush->collision = brush->collision;
 
-               tpmd->brush->mat = pmd->brush->mat;
-               tpmd->brush->r = pmd->brush->r;
-               tpmd->brush->g = pmd->brush->g;
-               tpmd->brush->b = pmd->brush->b;
-               tpmd->brush->alpha = pmd->brush->alpha;
-               tpmd->brush->wetness = pmd->brush->wetness;
+               t_brush->mat = brush->mat;
+               t_brush->r = brush->r;
+               t_brush->g = brush->g;
+               t_brush->b = brush->b;
+               t_brush->alpha = brush->alpha;
+               t_brush->wetness = brush->wetness;
 
-               tpmd->brush->particle_radius = pmd->brush->particle_radius;
-               tpmd->brush->particle_smooth = pmd->brush->particle_smooth;
-               tpmd->brush->paint_distance = pmd->brush->paint_distance;
-               tpmd->brush->psys = pmd->brush->psys;
+               t_brush->particle_radius = brush->particle_radius;
+               t_brush->particle_smooth = brush->particle_smooth;
+               t_brush->paint_distance = brush->paint_distance;
+               t_brush->psys = brush->psys;
 
-               if (pmd->brush->paint_ramp)
-                       memcpy(tpmd->brush->paint_ramp, pmd->brush->paint_ramp, 
sizeof(ColorBand));
-               if (pmd->brush->vel_ramp)
-                       memcpy(tpmd->brush->vel_ramp, pmd->brush->vel_ramp, 
sizeof(ColorBand));
+               if (brush->paint_ramp)
+                       memcpy(t_brush->paint_ramp, brush->paint_ramp, 
sizeof(ColorBand));
+               if (brush->vel_ramp)
+                       memcpy(t_brush->vel_ramp, brush->vel_ramp, 
sizeof(ColorBand));
 
-               tpmd->brush->proximity_falloff = pmd->brush->proximity_falloff;
-               tpmd->brush->wave_type = pmd->brush->wave_type;
-               tpmd->brush->ray_dir = pmd->brush->ray_dir;
+               t_brush->proximity_falloff = brush->proximity_falloff;
+               t_brush->wave_type = brush->wave_type;
+               t_brush->ray_dir = brush->ray_dir;
 
-               tpmd->brush->wave_factor = pmd->brush->wave_factor;
-               tpmd->brush->wave_clamp = pmd->brush->wave_clamp;
-               tpmd->brush->max_velocity = pmd->brush->max_velocity;
-               tpmd->brush->smudge_strength = pmd->brush->smudge_strength;
+               t_brush->wave_factor = brush->wave_factor;
+               t_brush->wave_clamp = brush->wave_clamp;
+               t_brush->max_velocity = brush->max_velocity;
+               t_brush->smudge_strength = brush->smudge_strength;
        }
 }
 
@@ -1522,16 +1544,8 @@
 
                                                #pragma omp parallel for 
schedule(static)
                                                for (i=0; 
i<sData->total_points; i++) {
-                                                       int j=i*4;
-
-                                                       fcolor[j]   = 
pPoint[i].color[0];
-                                                       fcolor[j+1] = 
pPoint[i].color[1];
-                                                       fcolor[j+2] = 
pPoint[i].color[2];
-                                                       /* mix colors */
-                                                       if (pPoint[i].e_alpha) 
mixColors(&fcolor[j], pPoint[i].alpha, pPoint[i].e_color, pPoint[i].e_alpha);
-
-                                                       /* Use highest alpha    
*/
-                                                       fcolor[j+3] = 
(pPoint[i].e_alpha > pPoint[i].alpha) ? pPoint[i].e_alpha : pPoint[i].alpha;
+                                                       /* blend dry and wet 
layer */
+                                                       
blendColors(pPoint[i].color, pPoint[i].alpha, pPoint[i].e_color, 
pPoint[i].e_alpha, &fcolor[i*4]);
                                                }
 
                                                /* viewport preview */
@@ -2780,23 +2794,24 @@
 
        /* Add paint    */
        if (!(paintFlags & MOD_DPAINT_ERASE)) {
-               float wetness;
+               float wetness, mix[4];
                float temp_alpha = (*paintAlpha) * ((paintFlags & 
MOD_DPAINT_ABS_ALPHA) ? 1.0f : (*timescale));
 
                /* mix brush color with wet layer color */
-               if (temp_alpha) mixColors(pPoint->e_color, pPoint->e_alpha, 
paintColor, temp_alpha);
+               blendColors(pPoint->e_color, pPoint->e_alpha, paintColor, 
temp_alpha, mix);
+               copy_v3_v3(pPoint->e_color, mix);
 
                /* alpha */
                if (paintFlags & MOD_DPAINT_ABS_ALPHA) {
                        if (pPoint->e_alpha < (*paintAlpha)) pPoint->e_alpha = 
(*paintAlpha);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to