Commit: a6fffa09aa2aeabf7c3e60954bf1778331121dc6
Author: Lukas Tönne
Date:   Tue May 29 07:03:00 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rBa6fffa09aa2aeabf7c3e60954bf1778331121dc6

Basic constraint for keeping the center curve attached to the scalp.

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

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

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

diff --git a/source/blender/blenkernel/BKE_groom.h 
b/source/blender/blenkernel/BKE_groom.h
index 70c6628d7ad..e140c7709f0 100644
--- a/source/blender/blenkernel/BKE_groom.h
+++ b/source/blender/blenkernel/BKE_groom.h
@@ -72,6 +72,12 @@ bool BKE_groom_bundle_bind(struct Groom *groom, struct 
GroomBundle *bundle, bool
 void BKE_groom_bundle_unbind(struct GroomBundle *bundle);
 
 
+/* === Constraints === */
+
+/* Apply constraints on groom geometry */
+void BKE_groom_apply_constraints(struct Groom *groom, struct Mesh *scalp);
+
+
 /* === Hair System === */
 
 /* Create follicles on the scalp surface for hair fiber rendering */
@@ -83,7 +89,7 @@ void BKE_groom_hair_update_guide_curves(struct Groom *groom);
 
 /* === Depsgraph evaluation === */
 
-void BKE_groom_eval_geometry(struct Depsgraph *depsgraph, struct Groom *groom);
+void BKE_groom_eval_geometry(const struct Depsgraph *depsgraph, struct Groom 
*groom);
 
 
 /* === Draw Cache === */
diff --git a/source/blender/blenkernel/intern/groom.c 
b/source/blender/blenkernel/intern/groom.c
index 5ec60332a91..33435238bff 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -63,6 +63,7 @@
 #include "BKE_object_facemap.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #include "bmesh.h"
 
@@ -522,6 +523,28 @@ void BKE_groom_bundle_unbind(GroomBundle *bundle)
 }
 
 
+/* === Constraints === */
+
+/* Apply constraints on groom geometry */
+void BKE_groom_apply_constraints(Groom *groom, Mesh *scalp)
+{
+       ListBase *bundles = (groom->editgroom ? &groom->editgroom->bundles : 
&groom->bundles);
+       for (GroomBundle *bundle = bundles->first; bundle; bundle = 
bundle->next)
+       {
+               /* For bound regions the bundle should be attached to the scalp 
*/
+               if (scalp && bundle->scalp_region && bundle->totsections > 0)
+               {
+                       float co[3], nor[3], tang[3];
+                       /* Last in scalp_region is the center curve root point 
*/
+                       if (BKE_mesh_sample_eval(scalp, 
&bundle->scalp_region[bundle->numshapeverts], co, nor, tang))
+                       {
+                               copy_v3_v3(bundle->sections[0].center, co);
+                       }
+               }
+       }
+}
+
+
 /* === Hair System === */
 
 /* Set loop weights for all faces covered by the bundle region */
@@ -733,9 +756,12 @@ void BKE_groom_hair_update_guide_curves(Groom *groom)
                }
        }
        
-       BLI_assert(groom->scalp_object && groom->scalp_object->type == OB_MESH);
-       Mesh *scalp = groom->scalp_object->data;
-       BKE_hair_bind_follicles(hsys, scalp);
+       if (groom->scalp_object)
+       {
+               BLI_assert(groom->scalp_object->type == OB_MESH);
+               Mesh *scalp = groom->scalp_object->data;
+               BKE_hair_bind_follicles(hsys, scalp);
+       }
 }
 
 
@@ -993,12 +1019,17 @@ void BKE_groom_curve_cache_clear(Groom *groom)
 
 /* === Depsgraph evaluation === */
 
-void BKE_groom_eval_geometry(struct Depsgraph *UNUSED(depsgraph), Groom *groom)
+void BKE_groom_eval_geometry(const struct Depsgraph *depsgraph, Groom *groom)
 {
        if (G.debug & G_DEBUG_DEPSGRAPH) {
                printf("%s on %s\n", __func__, groom->id.name);
        }
        
+       /* Apply constraints from scalp mesh to the groom geometry */
+       Mesh *scalp = groom->scalp_object ? groom->scalp_object->data : NULL;
+       Mesh *scalp_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, &scalp->id);
+       BKE_groom_apply_constraints(groom, scalp_eval);
+       
        /* calculate curves for interpolating shapes */
        BKE_groom_curve_cache_update(groom);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to