[Bf-blender-cvs] [069234f38d3] hair_guides_grooming: Create a loop weight map for limiting hair to the scalp regions used.

Lukas Tönne noreply at git.blender.org
Sat May 26 14:06:54 CEST 2018


Commit: 069234f38d38e4bc8a0d08cfb6a21f30cc71b605
Author: Lukas Tönne
Date:   Fri May 25 10:44:46 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB069234f38d38e4bc8a0d08cfb6a21f30cc71b605

Create a loop weight map for limiting hair to the scalp regions used.

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

M	source/blender/blenkernel/intern/groom.c

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

diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index 8df79aa9fa1..9babdb59cdf 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -559,6 +559,56 @@ static void groom_generate_guide_curves(
 	MEM_freeN(guide_samples);
 }
 
+static bool groom_add_bundle_loop_weights(const Groom *groom, const GroomBundle *bundle,
+                                          float *loop_weights)
+{
+	BLI_assert(groom->scalp_object && groom->scalp_object->type == OB_MESH);
+	const Mesh *scalp = groom->scalp_object->data;
+	
+	const int fmap_nr = BKE_object_facemap_name_index(groom->scalp_object, bundle->scalp_facemap_name);
+	if (fmap_nr < 0)
+	{
+		return false;
+	}
+	
+	if (!CustomData_has_layer(&scalp->pdata, CD_FACEMAP))
+	{
+		return false;
+	}
+	
+	const int *map = CustomData_get_layer(&scalp->pdata, CD_FACEMAP);
+	if (!map)
+	{
+		return false;
+	}
+	
+	/* Find all polys of this bundle's face map */
+	const MPoly *mp = scalp->mpoly;
+	for (int i = 0; i < scalp->totpoly; ++i, ++mp)
+	{
+		int fmap_value = map[i];
+		if (fmap_value == fmap_nr)
+		{
+			/* Include poly by setting the weight for all its loops */
+			for (int j = 0; j < mp->totloop; ++j)
+			{
+				loop_weights[mp->loopstart + j] = 1.0f;
+			}
+		}
+	}
+	
+	return true;
+}
+
+static void groom_add_all_loop_weights(const Groom *groom,
+                                       float *loop_weights)
+{
+	for (GroomBundle *bundle = groom->bundles.first; bundle; bundle = bundle->next)
+	{
+		groom_add_bundle_loop_weights(groom, bundle, loop_weights);
+	}
+}
+
 void BKE_groom_hair_distribute(Groom *groom, unsigned int seed, int hair_count, int guide_curve_count)
 {
 	struct HairSystem *hsys = groom->hair_system;
@@ -566,11 +616,17 @@ void BKE_groom_hair_distribute(Groom *groom, unsigned int seed, int hair_count,
 	BLI_assert(groom->scalp_object && groom->scalp_object->type == OB_MESH);
 	Mesh *scalp = groom->scalp_object->data;
 	
-	BKE_hair_generate_follicles(hsys, scalp, seed, hair_count);
+	/* Per-loop weights for limiting follicles to covered faces */
+	float *loop_weights = MEM_callocN(sizeof(float) * scalp->totloop, "groom scalp loop weights");
+	groom_add_all_loop_weights(groom, loop_weights);
+	
+	BKE_hair_generate_follicles_ex(hsys, scalp, seed, hair_count, loop_weights);
 	
 	unsigned int guide_seed = BLI_ghashutil_combine_hash(seed, BLI_ghashutil_strhash("groom guide curves"));
 	groom_generate_guide_curves(groom, scalp, guide_seed, guide_curve_count);
 	
+	MEM_freeN(loop_weights);
+	
 	BKE_hair_bind_follicles(hsys, scalp);
 }



More information about the Bf-blender-cvs mailing list