[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41753] trunk/blender: Dynamic Paint:

Miika Hamalainen miika.hamalainen at kolumbus.fi
Fri Nov 11 11:46:27 CET 2011


Revision: 41753
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41753
Author:   miikah
Date:     2011-11-11 10:46:26 +0000 (Fri, 11 Nov 2011)
Log Message:
-----------
Dynamic Paint:
* Renamed "Sharp" proximity falloff to "Constant".
* Added a new "Negate Volume" option for "Volume + Proximity" brush.
* Possible fix for random particle clipping errors.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
    trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c
    trunk/blender/source/blender/makesdna/DNA_dynamicpaint_types.h
    trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py	2011-11-11 06:37:29 UTC (rev 41752)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py	2011-11-11 10:46:26 UTC (rev 41753)
@@ -414,6 +414,7 @@
                 sub.prop(brush, "proximity_project")
             elif brush.paint_source == 'VOLUME_DISTANCE':
                 sub.prop(brush, "proximity_inverse")
+                sub.prop(brush, "negate_volume")
 
             sub = split.column()
             if brush.paint_source == 'DISTANCE':

Modified: trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c	2011-11-11 06:37:29 UTC (rev 41752)
+++ trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c	2011-11-11 10:46:26 UTC (rev 41753)
@@ -3175,13 +3175,20 @@
 					{
 
 						float ray_start[3], ray_dir[3];
-						float colorband[4] = {0.0f};
-						float sample_factor;
+						float sample_factor = 0.0f;
 						float sampleStrength = 0.0f;
 						BVHTreeRayHit hit;
 						BVHTreeNearest nearest;
 						short hit_found = 0;
 
+						/* volume sample */
+						float volume_factor = 0.0f;
+						/* proximity sample */
+						float proximity_factor = 0.0f;
+						float prox_colorband[4] = {0.0f};
+						int inner_proximity = (brush->flags & MOD_DPAINT_INVERSE_PROX && 
+												   brush->collision == MOD_DPAINT_COL_VOLDIST);
+
 						/* hit data	*/
 						float hitCoord[3];
 						int hitFace = -1;
@@ -3236,7 +3243,7 @@
 
 								if(hit.index != -1) {
 									/* Add factor on supersample filter	*/
-									sampleStrength += sample_factor;
+									volume_factor = 1.0f;
 									hit_found = HIT_VOLUME;
 
 									/* Mark hit info */
@@ -3256,8 +3263,6 @@
 							float hitCo[3];
 							short hQuad;
 							int face;
-							int inner_proximity = (brush->flags & MOD_DPAINT_INVERSE_PROX && 
-												   brush->collision == MOD_DPAINT_COL_VOLDIST);
 
 							/* if inverse prox and no hit found, skip this sample */
 							if (inner_proximity && !hit_found) continue;
@@ -3299,25 +3304,12 @@
 
 							/* If a hit was found, calculate required values	*/
 							if (proxDist >= 0.0f && proxDist <= brush->paint_distance) {
-								float dist_rate = proxDist / brush->paint_distance;
-								float prox_influence = 0.0f;
+								proximity_factor = proxDist / brush->paint_distance;
+								CLAMP(proximity_factor, 0.0f, 1.0f);
+								if (!inner_proximity)
+									proximity_factor = 1.0f - proximity_factor;
 
-								/* in case of inverse prox also undo volume effect */
-								if (inner_proximity) {
-									sampleStrength -= sample_factor;
-									dist_rate = 1.0f - dist_rate;
-								}
-
-								/* if using proximity color ramp use it's alpha */
-								if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP && do_colorband(brush->paint_ramp, dist_rate, colorband))
-									prox_influence = colorband[3];
-								else if (brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH) {
-									prox_influence = (1.0f - dist_rate) * sample_factor;
-								}
-								else prox_influence = inner_proximity ? 0.0f : 1.0f;
-
 								hit_found = HIT_PROXIMITY;
-								sampleStrength += prox_influence*sample_factor;
 
 								/* if no volume hit, use prox point face info */
 								if (hitFace == -1) {
@@ -3328,8 +3320,33 @@
 							}
 						}
 
-						if (!hit_found) continue;
+						/* mix final sample strength depending on brush settings */
+						if (hit_found) {
+							/* if "negate volume" enabled, negate all factors within volume*/
+							if (brush->collision == MOD_DPAINT_COL_VOLDIST && brush->flags & MOD_DPAINT_NEGATE_VOLUME) {
+								volume_factor = 1.0f - volume_factor;
+								if (inner_proximity)
+									proximity_factor = 1.0f - proximity_factor;
+							}
 
+							/* apply final sample depending on final hit type */
+							if (hit_found == HIT_VOLUME) {
+								sampleStrength = volume_factor;
+							}
+							else if (hit_found == HIT_PROXIMITY) {
+								/* apply falloff curve to the proximity_factor */
+								if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP && do_colorband(brush->paint_ramp, (1.0f-proximity_factor), prox_colorband))
+									proximity_factor = prox_colorband[3];
+								else if (brush->proximity_falloff == MOD_DPAINT_PRFALL_CONSTANT)
+									proximity_factor = (!inner_proximity || brush->flags & MOD_DPAINT_NEGATE_VOLUME) ? 1.0f : 0.0f;
+								/* apply sample */
+								sampleStrength = proximity_factor;
+							}
+
+							sampleStrength *= sample_factor;
+						}
+						else continue;
+
 						/* velocity brush, only do on main sample */
 						if (brush->flags & MOD_DPAINT_USES_VELOCITY && ss==0 && brushVelocity) {
 							int v1,v2,v3;
@@ -3395,9 +3412,9 @@
 							/* Sample proximity colorband if required	*/
 							if ((hit_found == HIT_PROXIMITY) && (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP)) {
 								if (!(brush->flags & MOD_DPAINT_RAMP_ALPHA)) {
-									sampleColor[0] = colorband[0];
-									sampleColor[1] = colorband[1];
-									sampleColor[2] = colorband[2];
+									sampleColor[0] = prox_colorband[0];
+									sampleColor[1] = prox_colorband[1];
+									sampleColor[2] = prox_colorband[2];
 								}
 							}
 
@@ -3478,7 +3495,7 @@
 	float range = solidradius + smooth;
 	float particle_timestep = 0.04f * part->timetweak;
 
-	Bounds3D part_bb;
+	Bounds3D part_bb = {0};
 
 	if (psys->totpart < 1) return 1;
 
@@ -4482,7 +4499,7 @@
 	return ret;
 }
 
-static int surface_needsVelocityData(DynamicPaintSurface *surface, Scene *scene, Object *UNUSED(ob))
+static int surface_needsVelocityData(DynamicPaintSurface *surface, Scene *scene)
 {
 	if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP)
 		return 1;
@@ -4509,7 +4526,7 @@
 	PaintBakeData *bData = sData->bData;
 	DerivedMesh *dm = surface->canvas->dm;
 	int index, new_bdata = 0;
-	int do_velocity_data = surface_needsVelocityData(surface, scene, ob);
+	int do_velocity_data = surface_needsVelocityData(surface, scene);
 	int do_accel_data = surface_needsAccelerationData(surface);
 
 	int canvasNumOfVerts = dm->getNumVerts(dm);

Modified: trunk/blender/source/blender/makesdna/DNA_dynamicpaint_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_dynamicpaint_types.h	2011-11-11 06:37:29 UTC (rev 41752)
+++ trunk/blender/source/blender/makesdna/DNA_dynamicpaint_types.h	2011-11-11 10:46:26 UTC (rev 41753)
@@ -144,6 +144,7 @@
 #define MOD_DPAINT_RAMP_ALPHA (1<<4) /* only read falloff ramp alpha */
 #define MOD_DPAINT_PROX_PROJECT (1<<5) /* do proximity check only in defined dir */
 #define MOD_DPAINT_INVERSE_PROX (1<<6) /* inverse proximity painting */
+#define MOD_DPAINT_NEGATE_VOLUME (1<<7) /* negates volume influence on "volume + prox" mode */
 
 #define MOD_DPAINT_DO_SMUDGE (1<<8) /* brush smudges existing paint */
 #define MOD_DPAINT_VELOCITY_ALPHA (1<<9) /* multiply brush influence by velocity */
@@ -160,7 +161,7 @@
 #define MOD_DPAINT_COL_POINT 4 /* use distance to object center point */
 
 /* proximity_falloff */
-#define MOD_DPAINT_PRFALL_SHARP 0 /* no-falloff */
+#define MOD_DPAINT_PRFALL_CONSTANT 0 /* no-falloff */
 #define MOD_DPAINT_PRFALL_SMOOTH 1 /* smooth, linear falloff */
 #define MOD_DPAINT_PRFALL_RAMP 2 /* use color ramp */
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c	2011-11-11 06:37:29 UTC (rev 41752)
+++ trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c	2011-11-11 10:46:26 UTC (rev 41753)
@@ -695,7 +695,7 @@
 
 	static EnumPropertyItem prop_dynamicpaint_prox_falloff[] = {
 			{MOD_DPAINT_PRFALL_SMOOTH, "SMOOTH", ICON_SPHERECURVE, "Smooth", ""},
-			{MOD_DPAINT_PRFALL_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+			{MOD_DPAINT_PRFALL_CONSTANT, "CONSTANT", ICON_NOCURVE, "Constant", ""},
 			{MOD_DPAINT_PRFALL_RAMP, "RAMP", ICON_COLOR, "Color Ramp", ""},
 			{0, NULL, 0, NULL, NULL}};
 
@@ -847,6 +847,11 @@
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_INVERSE_PROX);
 	RNA_def_property_ui_text(prop, "Inner Proximity", "Proximity falloff is applied inside the volume");
 	RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+	prop= RNA_def_property(srna, "negate_volume", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_NEGATE_VOLUME);
+	RNA_def_property_ui_text(prop, "Negate Volume", "Negate influence inside the volume");
+	RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 	
 
 	/*




More information about the Bf-blender-cvs mailing list