Revision: 37602
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37602
Author:   miikah
Date:     2011-06-17 18:04:56 +0000 (Fri, 17 Jun 2011)
Log Message:
-----------
Dynamic Paint:
* Image sequence anti-aliasing works again.
* Vertex color viewport preview now works with GLSL and textured view modes too.
* Added a new "inverse" setting for "volume + proximity" brush. With it brush 
only has effect within volume but effect is lower near the mesh surface.

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/editors/space_view3d/drawmesh.c
    branches/soc-2011-carrot/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2011-carrot/source/blender/editors/space_view3d/view3d_intern.h
    branches/soc-2011-carrot/source/blender/makesdna/DNA_dynamicpaint_types.h
    branches/soc-2011-carrot/source/blender/makesrna/intern/rna_dynamicpaint.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-06-17 18:04:26 UTC (rev 37601)
+++ 
branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
   2011-06-17 18:04:56 UTC (rev 37602)
@@ -310,12 +310,15 @@
             col.prop(brush, "paint_distance", text="Paint Distance")
             split = layout.row().split()
             sub = split.column()
-            sub.prop(brush, "prox_facealigned", text="Face Aligned")
+            sub.prop(brush, "prox_facealigned")
             sub = split.column()
             sub.prop(brush, "prox_falloff", text="Falloff")
+            if brush.paint_source == "VOLDIST":
+                col = layout.row().column()
+                col.prop(brush, "prox_inverse")
             if brush.prox_falloff == "RAMP":
                 col = layout.row().column()
-                col.label(text="Falloff Ramp:")
+                col.separator()
                 col.prop(brush, "prox_ramp_alpha", text="Only Use Alpha")
                 col.template_color_ramp(brush, "paint_ramp", expand=True)
 

Modified: 
branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c    
2011-06-17 18:04:26 UTC (rev 37601)
+++ branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c    
2011-06-17 18:04:56 UTC (rev 37602)
@@ -133,7 +133,6 @@
 
 /* Surface data used while processing a frame  */
 typedef struct PaintBakePoint {
-       float realCoord[3]; /* current pixel center world-space coordinates */
        float invNorm[3];  /* current pixel world-space inverted normal. 
depends on face shading mode */
        float normal_scale; /* normal directional scale for displace mapping */
 
@@ -144,6 +143,11 @@
        float gravity_rate;             /* Gravity strength. (Depends on 
surface angle.) */
 } PaintBakePoint;
 
+typedef struct PaintBakeData {
+       PaintBakePoint *bPoint;
+       float *realCoord;  /* current pixel center world-space coordinates * 
numOfSamples */
+} PaintBakeData;
+
 /* UV Image sequence format point      */
 typedef struct PaintTexturePoint {
 
@@ -234,7 +238,7 @@
        }
 }
 
-/* set preview to first previewable surface */
+/* set preview to defined surface */
 static void dynamicPaint_setPreview(DynamicPaintSurface *t_surface)
 {
        DynamicPaintSurface *surface = t_surface->canvas->surfaces.first;
@@ -417,7 +421,6 @@
        sprintf(surface->image_output_path, "%sdynamicpaint/", "/tmp/");
        dynamicPaintSurface_setUniqueName(surface, "Surface");
 
-
        dynamicPaintSurface_updateType(surface);
 
        BLI_addtail(&canvas->surfaces, surface);
@@ -609,6 +612,7 @@
 
        /* allocate data depending on surface type and format */
        surface->data->total_points = numOfPoints;
+       surface->data->samples = 1;
        dynamicPaint_allocateSurfaceType(surface);
        dynamicPaint_surfaceSetInitialValues(surface);
 
@@ -2284,7 +2288,7 @@
 /*
 *      Paint a brush object mesh to the surface
 */
-static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, PaintBakePoint 
*bPoint, DynamicPaintBrushSettings *brush, Object *canvasOb, Object *brushOb, 
float timescale)
+static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, PaintBakeData 
*bData, DynamicPaintBrushSettings *brush, Object *canvasOb, Object *brushOb, 
float timescale)
 {
        DerivedMesh *dm = NULL;
        MVert *mvert = NULL;
@@ -2325,10 +2329,8 @@
                        for (index = 0; index < sData->total_points; index++)
                        {
                                {
-                                       //DynamicPaintSurfacePoint *cPoint = 
(&surface->point[xx+tWidth*yy]);
-
                                        int ss;
-                                       float ssFactor = 0.0f;  /* 
super-sampling factor */
+                                       float brushFactor = 0.0f;       /* 
brush influence factor */
                                        float depth = 0.0f;             /* 
displace depth */
 
                                        float paintColor[3] = {0.0f, 0.0f, 
0.0f};
@@ -2336,7 +2338,7 @@
                                        float paintAlpha = 0.0f;
 
                                        /* Supersampling        */
-                                       for (ss=0; ss<1; ss++)
+                                       for (ss=0; ss<sData->samples; ss++)
                                        {
 
                                                float ray_start[3], ray_dir[3];
@@ -2354,20 +2356,16 @@
                                                short hitQuad;                  
/* mid-sample hit quad status */
 
                                                /* Supersampling factor */
-                                               /*if (surface->pixelSamples > 
1) {
+                                               if (sData->samples > 1) {
                                                        gaus_factor = 
gaussianFactors[ss];
                                                }
-                                               else */{
+                                               else {
                                                        gaus_factor = 1.0f;
                                                }
 
                                                /* Get current sample position 
in world coordinates     */
-                                               /*interp_v3_v3v3v3(realPos,
-                                                                               
canvasVerts[cPoint->v1].v,
-                                                                               
canvasVerts[cPoint->v2].v,
-                                                                               
canvasVerts[cPoint->v3].v, cPoint->barycentricWeights[ss].v);*/
-                                               VECCOPY(ray_start, 
bPoint[index].realCoord);
-                                               VECCOPY(ray_dir, 
bPoint[index].invNorm);
+                                               VECCOPY(ray_start, 
&bData->realCoord[(index*sData->samples+ss)*3]);
+                                               VECCOPY(ray_dir, 
bData->bPoint[index].invNorm);
 
                                                hit.index = -1;
                                                hit.dist = 9999;
@@ -2398,7 +2396,7 @@
                                                        if (dot>=0)
                                                        {
                                                                /* Add factor 
on supersample filter     */
-                                                               ssFactor += 
gaus_factor;
+                                                               brushFactor += 
gaus_factor;
                                                                depth += 
hit.dist;
                                                                hit_found = 1;
 
@@ -2414,7 +2412,7 @@
                                                }       // end of raycast
                                        
                                                /* Check proximity collision    
*/
-                                               if ((brush->collision == 
MOD_DPAINT_COL_DIST || brush->collision == MOD_DPAINT_COL_VOLDIST) && 
(!hit_found))
+                                               if ((brush->collision == 
MOD_DPAINT_COL_DIST || brush->collision == MOD_DPAINT_COL_VOLDIST))
                                                {
                                                        float proxDist = -1.0f;
                                                        float hitCo[3];
@@ -2450,37 +2448,44 @@
                                                        /* If a hit was found, 
calculate required values        */
                                                        if (proxDist >= 0.0f) {
                                                                float dist_rate 
= proxDist / brush->paint_distance;
+                                                               float 
prox_influence = 0.0f;
 
-                                                                       /* 
Smooth range or color ramp   */
-                                                                       if 
(brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH ||
-                                                                               
brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) {
+                                                               /* Smooth range 
or color ramp   */
+                                                               if 
(brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH ||
+                                                                       
brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) {
 
-                                                                               
/* Limit distance to 0.0 - 1.0 */
-                                                                               
if (dist_rate > 1.0f) dist_rate = 1.0f;
-                                                                               
if (dist_rate < 0.0f) dist_rate = 0.0f;
+                                                                       /* 
Limit distance to 0.0 - 1.0 */
+                                                                       if 
(dist_rate > 1.0f) dist_rate = 1.0f;
+                                                                       if 
(dist_rate < 0.0f) dist_rate = 0.0f;
 
-                                                                               
/* if using smooth falloff, multiply gaussian factor */
-                                                                               
if (brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH) {
-                                                                               
        ssFactor += (1.0f - dist_rate) * gaus_factor;
-                                                                               
}
-                                                                               
else ssFactor += gaus_factor;
-
-                                                                               
if (hitFace == -1) {
-                                                                               
        distRate = dist_rate;
-                                                                               
}
+                                                                       /* if 
using smooth falloff, multiply gaussian factor */
+                                                                       if 
(brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH) {
+                                                                               
prox_influence = (1.0f - dist_rate) * gaus_factor;
                                                                        }
-                                                                       else 
ssFactor += gaus_factor;
+                                                                       else 
prox_influence = gaus_factor;
 
-                                                                       
hit_found = 1;
-
                                                                        if 
(hitFace == -1) {
-                                                                               
copy_v3_v3(hitCoord, hitCo);
-                                                                               
hitQuad = hQuad;
-                                                                               
hitFace = face;
+                                                                               
distRate = dist_rate;
                                                                        }
-                                                       }       // proxDist
-                                               }       // end proximity check
+                                                               }
+                                                               else 
prox_influence = gaus_factor;
 
+                                                               hit_found = 1;
+                                                               if 
(brush->flags & MOD_DPAINT_INVERSE_PROX) {
+                                                                       
brushFactor -= prox_influence;
+                                                                       
distRate = -distRate;
+                                                               }
+                                                               else 
+                                                                       
brushFactor += prox_influence;
+
+                                                               if (hitFace == 
-1) {
+                                                                       
copy_v3_v3(hitCoord, hitCo);
+                                                                       hitQuad 
= hQuad;
+                                                                       hitFace 
= face;
+                                                               }
+                                                       }
+                                               }
+
                                                /*
                                                *       Process color and alpha
                                                */
@@ -2495,7 +2500,7 @@
                                                        sampleColor[2] = 
brush->b;
                                                
                                                        /* Get 
material+textures color on hit point if required */
-                                                       if (brush->flags & 
MOD_DPAINT_USE_MATERIAL) dynamicPaint_getMaterialColor(sampleColor, 
&sampleAlpha, brushOb, bPoint[index].realCoord, hitCoord, hitFace, hitQuad, 
brush->dm, brush->mat);
+                                                       if (brush->flags & 
MOD_DPAINT_USE_MATERIAL) dynamicPaint_getMaterialColor(sampleColor, 
&sampleAlpha, brushOb, &bData->realCoord[(index*sData->samples+ss)*3], 
hitCoord, hitFace, hitQuad, brush->dm, brush->mat);
 
                                                        /* Sample colorband if 
required */
                                                        if ((distRate >= 0.0f) 
&& (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) && 
do_colorband(brush->paint_ramp, distRate, bandres)) {
@@ -2519,18 +2524,19 @@
 
 
                                        /* if any sample was inside paint range 
*/
-                                       if (ssFactor > 0.01f) {
+                                       if (brushFactor > 0.01f) {
 
                                                /* apply supersampling results  
*/
-                                               /*if (surface->pixelSamples > 
1) {
-                                                       ssFactor /= 
gaussianTotal;
-                                               }*/
+                                               if (sData->samples > 1) {
+                                                       brushFactor /= 
gaussianTotal;
+                                               }
+                                               CLAMP(brushFactor, 0.0f, 1.0f);
 
                                                //cPoint->state = 2;
 
                                                if (surface->type == 
MOD_DPAINT_SURFACE_T_PAINT) {
 
-                                                       float paintWetness = 
brush->wetness * ssFactor;
+                                                       float paintWetness = 
brush->wetness * brushFactor;
 
                                                        /* Get final pixel 
color and alpha      */
                                                        paintColor[0] /= 
numOfHits;
@@ -2539,7 +2545,7 @@
                                                        paintAlpha /= numOfHits;
 
                                                        /* Multiply alpha value 
by the ui multiplier    */
-                                                       paintAlpha = paintAlpha 
* ssFactor * brush->alpha;
+                                                       paintAlpha = paintAlpha 
* brushFactor * brush->alpha;
                                                        if (paintAlpha > 1.0f) 
paintAlpha = 1.0f;
 
                                                        /*
@@ -2551,11 +2557,11 @@
                                                        float *value = 
(float*)sData->type_data;
 
                                                        if (brush->flags & 
MOD_DPAINT_ERASE) {
-                                                               value[index] *= 
(1.0f - ssFactor);
+                                                               value[index] *= 
(1.0f - brushFactor);
                                                                if 
(value[index] < 0.0f) value[index] = 0.0f;
                                                        }
                                                        else {
-                                                               depth /= 
bPoint[index].normal_scale;
+                                                               depth /= 
bData->bPoint[index].normal_scale;
                                                                /* do displace  
*/
                                                                if 
(value[index] < depth) value[index] = depth;
                                                        }
@@ -2576,7 +2582,7 @@
 /*
 *      Paint a particle system to the surface
 */
-static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, 
PaintBakePoint *bPoint, ParticleSystem *psys, DynamicPaintBrushSettings *brush, 
Object *canvasOb, float timescale)
+static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, 
PaintBakeData *bData, ParticleSystem *psys, DynamicPaintBrushSettings *brush, 
Object *canvasOb, float timescale)
 {
        int index;

@@ 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