[Bf-blender-cvs] [5be3403a1d8] hair_guides: Simplified API for generating hair follicles with a fixed max count.

Lukas Tönne noreply at git.blender.org
Sat Nov 25 14:49:50 CET 2017


Commit: 5be3403a1d82b51078a122ea54234a1eaed2001d
Author: Lukas Tönne
Date:   Sat Nov 25 13:46:59 2017 +0000
Branches: hair_guides
https://developer.blender.org/rB5be3403a1d82b51078a122ea54234a1eaed2001d

Simplified API for generating hair follicles with a fixed max count.

The final count is inversely proportional to the min_distance, so using that
as a user variable is difficult to control. Instead we just use the overall
count as the single variable now.

The actual final count will be less than this maximum count, because the
theoretical limit is never reached in practice. The min. distance could also
be stored as a result of the hair generation as feedback for the user.

===================================================================

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenkernel/BKE_hair.h
M	source/blender/blenkernel/intern/hair.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_hair.c
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_fur.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 1fcd69983d0..5b208d495a7 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1548,8 +1548,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col = split.column()
         col.label("Follicles:")
         col.prop(md, "follicle_seed")
-        col.prop(md, "follicle_min_distance")
-        col.prop(md, "follicle_max_count")
+        col.prop(md, "follicle_count")
 
         col = split.column()
         col.label("Guide Curves:")
diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index 4d57f7e5462..42a09dd756a 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -78,8 +78,7 @@ void BKE_hair_generate_follicles(
         struct HairSystem* hsys,
         struct DerivedMesh *scalp,
         unsigned int seed,
-        float min_distance,
-        int max_count);
+        int count);
 
 void BKE_hair_bind_follicles(struct HairSystem *hsys, struct DerivedMesh *scalp);
 
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 3785759eb57..41ec76ab242 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -164,24 +164,23 @@ void BKE_hair_generate_follicles(
         HairSystem* hsys,
         struct DerivedMesh *scalp,
         unsigned int seed,
-        float min_distance,
-        int max_count)
+        int count)
 {
 	HairPattern *pattern = hsys->pattern;
 	
 	// Limit max_count to theoretical limit based on area
 	float scalp_area = BKE_hair_calc_surface_area(scalp);
-	float density = BKE_hair_calc_density_from_min_distance(min_distance);
-	max_count = min_ii(max_count, (int)(density * scalp_area));
+	float density = BKE_hair_calc_density_from_count(scalp_area, count);
+	float min_distance = BKE_hair_calc_min_distance_from_density(density);
 	
 	if (pattern->follicles)
 	{
 		MEM_freeN(pattern->follicles);
 	}
-	pattern->follicles = MEM_callocN(sizeof(HairFollicle) * max_count, "hair follicles");
+	pattern->follicles = MEM_callocN(sizeof(HairFollicle) * count, "hair follicles");
 	
 	{
-		MeshSampleGenerator *gen = BKE_mesh_sample_gen_surface_poissondisk(seed, min_distance, max_count, NULL, NULL);
+		MeshSampleGenerator *gen = BKE_mesh_sample_gen_surface_poissondisk(seed, min_distance, count, NULL, NULL);
 		
 		BKE_mesh_sample_generator_bind(gen, scalp);
 		
@@ -190,7 +189,7 @@ void BKE_hair_generate_follicles(
 		            gen,
 		            &pattern->follicles->mesh_sample,
 		            sizeof(HairFollicle),
-		            max_count,
+		            count,
 		            use_threads);
 		
 		BKE_mesh_sample_free_generator(gen);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index b616bf17a7d..bd88330498a 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2445,9 +2445,8 @@ static int fur_generate_follicles_exec(bContext *C, wmOperator *op)
 	            fmd->hair_system,
 	            dm,
 	            (unsigned int)fmd->follicle_seed,
-	            fmd->follicle_min_distance,
-	            fmd->follicle_max_count);
-
+	            fmd->follicle_count);
+	
 	{
 		unsigned int guides_seed = fmd->follicle_seed ^ 0xFFFF;
 		fur_create_guide_curves(
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index ebb5d5e0351..d53c5a2e1de 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1639,10 +1639,10 @@ typedef struct FurModifierData {
 	
 	/* Follicle distribution parameters */
 	int follicle_seed;
-	float follicle_min_distance;
-	int follicle_max_count;
+	int follicle_count;
 
 	int guides_count;
+	int pad2;
 } FurModifierData;
 
 #endif  /* __DNA_MODIFIER_TYPES_H__ */
diff --git a/source/blender/makesrna/intern/rna_hair.c b/source/blender/makesrna/intern/rna_hair.c
index 67ef4e5b7b4..55b4a1d9c32 100644
--- a/source/blender/makesrna/intern/rna_hair.c
+++ b/source/blender/makesrna/intern/rna_hair.c
@@ -60,8 +60,7 @@ static void rna_HairSystem_generate_follicles(
         struct bContext *C,
         Object *scalp,
         int seed,
-        float min_distance,
-        int max_count)
+        int count)
 {
 	if (!scalp)
 	{
@@ -75,7 +74,7 @@ static void rna_HairSystem_generate_follicles(
 	CustomDataMask datamask = CD_MASK_BAREMESH;
 	DerivedMesh *dm = mesh_get_derived_final(&eval_ctx, scene, scalp, datamask);
 	
-	BKE_hair_generate_follicles(hsys, dm, (unsigned int)seed, min_distance, max_count);
+	BKE_hair_generate_follicles(hsys, dm, (unsigned int)seed, count);
 }
 
 #else
@@ -129,9 +128,8 @@ static void rna_def_hair_system(BlenderRNA *brna)
 	parm = RNA_def_pointer(func, "scalp", "Object", "Scalp", "Scalp object on which to place hair follicles");
 	RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
 	parm = RNA_def_int(func, "seed", 0, 0, INT_MAX, "Seed", "Seed value for random numbers", 0, INT_MAX);
-	parm = RNA_def_float(func, "min_distance", 0.01f, 0.0f, FLT_MAX, "Min Distance", "Minimum distance between follicles", 1.0e-5f, 1.0f);
+	parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Maximum number of follicles to generate", 1, 1e5);
 	RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
-	parm = RNA_def_int(func, "max_count", 0, 0, INT_MAX, "Max Count", "Maximum number of follicles to generate", 1, 1e5);
 }
 
 static void rna_def_hair_draw_settings(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index ae818c56e4b..10955b5ad9b 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -4814,23 +4814,17 @@ static void rna_def_modifier_fur(BlenderRNA *brna)
 	RNA_def_property_range(prop, 0, INT_MAX);
 	RNA_def_property_ui_text(prop, "Seed", "Follicle distribution random seed value");
 	
-	prop = RNA_def_property(srna, "follicle_min_distance", PROP_FLOAT, PROP_NONE);
-	RNA_def_property_float_default(prop, 0.001f);
-	RNA_def_property_range(prop, 0.0f, FLT_MAX);
-	RNA_def_property_ui_range(prop, 1.0e-5f, 1.0f, 1.0e-4f, 5);
-	RNA_def_property_ui_text(prop, "Min Distance", "Minimum follicle distance");
-	
-	prop = RNA_def_property(srna, "follicle_max_count", PROP_INT, PROP_NONE);
-	RNA_def_property_int_default(prop, 1000);
+	prop = RNA_def_property(srna, "follicle_count", PROP_INT, PROP_NONE);
+	RNA_def_property_int_default(prop, 100000);
 	RNA_def_property_range(prop, 0, INT_MAX);
 	RNA_def_property_ui_range(prop, 1, 1e5, 1, 1);
-	RNA_def_property_ui_text(prop, "Max Count", "Maximum follicle number");
+	RNA_def_property_ui_text(prop, "Follicle Count", "Maximum number of follicles");
 	
 	prop = RNA_def_property(srna, "guides_count", PROP_INT, PROP_NONE);
-	RNA_def_property_int_default(prop, 100);
+	RNA_def_property_int_default(prop, 1000);
 	RNA_def_property_range(prop, 0, INT_MAX);
 	RNA_def_property_ui_range(prop, 1, 1e3, 1, 1);
-	RNA_def_property_ui_text(prop, "Guides Count", "Number of guide curves");
+	RNA_def_property_ui_text(prop, "Guides Count", "Maximum number of guide curves");
 	
 	prop = RNA_def_property(srna, "draw_settings", PROP_POINTER, PROP_NONE);
 	RNA_def_property_ui_text(prop, "Draw Settings", "Hair draw settings");
diff --git a/source/blender/modifiers/intern/MOD_fur.c b/source/blender/modifiers/intern/MOD_fur.c
index ca28924aefd..8b5c20b671f 100644
--- a/source/blender/modifiers/intern/MOD_fur.c
+++ b/source/blender/modifiers/intern/MOD_fur.c
@@ -58,8 +58,8 @@ static void initData(ModifierData *md)
 	
 	fmd->flag |= 0;
 	
-	fmd->follicle_min_distance = 0.001f;
-	fmd->follicle_max_count = 1000;
+	fmd->follicle_count = 100000;
+	fmd->guides_count = 1000;
 	
 	fmd->draw_settings = BKE_hair_draw_settings_new();
 }



More information about the Bf-blender-cvs mailing list