Commit: 3cb9ec18440c3309d9404d9a1cb4e36097c6ccbd Author: Lukas Tönne Date: Wed Feb 18 12:22:59 2015 +0100 Branches: gooseberry https://developer.blender.org/rB3cb9ec18440c3309d9404d9a1cb4e36097c6ccbd
New option "use signed distance" for force fields with "surface" shape. By default a surface-based force will push things away from the surface in both directions, regardless of whether a point is "inside" or "outside" (judging by the surface normal). The new option makes a force field always push things away in the direction of the normal, so that it becomes less likely to get points "trapped" inside a mesh object. =================================================================== M release/scripts/startup/bl_ui/properties_physics_common.py M source/blender/blenkernel/intern/effect.c M source/blender/makesdna/DNA_object_force.h M source/blender/makesrna/intern/rna_object_force.c =================================================================== diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py index bb0f0cf..19533d2 100644 --- a/release/scripts/startup/bl_ui/properties_physics_common.py +++ b/release/scripts/startup/bl_ui/properties_physics_common.py @@ -315,5 +315,8 @@ def basic_force_field_falloff_ui(self, context, field): sub.active = field.use_max_distance sub.prop(field, "distance_max", text="Maximum") + if field.shape == 'SURFACE': + layout.prop(field, "use_signed_distance") + if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 76a39fe..a9bf499 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -831,6 +831,10 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected } copy_v3_v3(force, efd->vec_to_point); + if (pd->shape == PFIELD_SHAPE_SURFACE && (pd->flag & PFIELD_USE_SIGNED_DISTANCE)) { + if (dot_v3v3(efd->vec_to_point, efd->nor) < 0.0f) + mul_v3_fl(force, -1.0f); + } switch (pd->forcefield) { case PFIELD_WIND: diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 5cc56d8..fac8443 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -370,6 +370,7 @@ typedef struct SoftBody { #define PFIELD_DO_ROTATION (1<<15) #define PFIELD_GUIDE_PATH_WEIGHT (1<<16) /* apply curve weights */ #define PFIELD_SMOKE_DENSITY (1<<17) /* multiply smoke force by density */ +#define PFIELD_USE_SIGNED_DISTANCE (1<<18) /* surface shape: use negative distance on the interior */ /* pd->falloff */ #define PFIELD_FALL_SPHERE 0 diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 4cc098f..ac74c7e 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -1337,6 +1337,11 @@ static void rna_def_field(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Use Max", "Use a maximum distance for the field to work"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); + prop = RNA_def_property(srna, "use_signed_distance", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USE_SIGNED_DISTANCE); + RNA_def_property_ui_text(prop, "Use Signed Distance", "Use negative distance on the interior of surface shapes"); + RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); + prop = RNA_def_property(srna, "use_radial_min", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMINR); RNA_def_property_ui_text(prop, "Use Min", "Use a minimum radial distance for the field's fall-off"); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs