[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