Commit: 12f04a805aa261c12e1d4f8bdf47b3c58534551d
Author: Lukas Tönne
Date:   Sun Nov 11 11:45:27 2018 +0000
Branches: hair_object
https://developer.blender.org/rB12f04a805aa261c12e1d4f8bdf47b3c58534551d

Depsgraph eval function for hair on object level that computes follicle space.

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

M       source/blender/blenkernel/BKE_hair.h
M       source/blender/blenkernel/intern/hair.c
M       source/blender/blenkernel/intern/object_update.c

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

diff --git a/source/blender/blenkernel/BKE_hair.h 
b/source/blender/blenkernel/BKE_hair.h
index 065a5f4d151..6a1936ba502 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -47,6 +47,7 @@ struct Mesh;
 struct MeshSample;
 struct MLoop;
 struct Object;
+struct Scene;
 
 /* === HairSystem Datablock === */
 
@@ -167,6 +168,8 @@ void BKE_hair_draw_settings_free(struct HairDrawSettings 
*draw_settings);
 
 void BKE_hair_eval_geometry(const struct Depsgraph *depsgraph, struct 
HairSystem *hsys);
 
+void BKE_hair_modifiers_calc(const struct Depsgraph *depsgraph, struct Scene 
*scene, struct Object *ob);
+
 
 /* === Export === */
 
diff --git a/source/blender/blenkernel/intern/hair.c 
b/source/blender/blenkernel/intern/hair.c
index 553d73e5ccb..4417d4d1f6f 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -46,6 +46,7 @@
 #include "DNA_hair_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 
 #include "BKE_animsys.h"
 #include "BKE_customdata.h"
@@ -466,15 +467,13 @@ void BKE_hair_set_fiber_curves(HairSystem *hsys, 
HairCurveData *curves)
 
 void BKE_hair_clear_fiber_curves(HairSystem *hsys)
 {
-       if (hsys->curve_data.curves)
-       {
+       if (hsys->curve_data.curves) {
                MEM_freeN(hsys->curve_data.curves);
                hsys->curve_data.curves = NULL;
        }
        hsys->curve_data.totcurves = 0;
 
-       if (hsys->curve_data.verts)
-       {
+       if (hsys->curve_data.verts) {
                MEM_freeN(hsys->curve_data.verts);
                hsys->curve_data.verts = NULL;
        }
@@ -491,13 +490,77 @@ void BKE_hair_eval_geometry(const Depsgraph *depsgraph, 
HairSystem *hsys)
                printf("%s on %s\n", __func__, hsys->id.name);
        }
 
-       // TODO
-
        if (hsys->bb == NULL || (hsys->bb->flag & BOUNDBOX_DIRTY)) {
                BKE_hair_boundbox_calc(hsys);
        }
 }
 
+void BKE_hair_ensure_follicle_space(const Mesh *scalp, HairPattern *pattern)
+{
+       const int num_follicles = pattern->num_follicles;
+       float (*orco)[3] = NULL;
+       float (*normals)[3] = NULL;
+       float (*tangents)[3] = NULL;
+       CustomData *fdata = &pattern->fdata;
+       
+       if (CustomData_has_layer(fdata, CD_ORCO)) {
+               orco = CustomData_get_layer(fdata, CD_ORCO);
+       }
+       else {
+               orco = CustomData_add_layer(fdata, CD_ORCO, CD_CALLOC, NULL, 
num_follicles);
+       }
+
+       if (CustomData_has_layer(fdata, CD_NORMAL)) {
+               normals = CustomData_get_layer(fdata, CD_NORMAL);
+       }
+       else {
+               normals = CustomData_add_layer(fdata, CD_NORMAL, CD_CALLOC, 
NULL, num_follicles);
+       }
+       
+       if (CustomData_has_layer(fdata, CD_TANGENT)) {
+               tangents = CustomData_get_layer(fdata, CD_TANGENT);
+       }
+       else {
+               tangents = CustomData_add_layer(fdata, CD_TANGENT, CD_CALLOC, 
NULL, num_follicles);
+       }
+
+       float (*co)[3] = orco;
+       float (*nor)[3] = normals;
+       float (*tang)[3] = tangents;
+       HairFollicle *follicle = pattern->follicles;
+       for (int i = 0; i < num_follicles; ++i) {
+               BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, co, nor, 
tang);
+
+               ++co;
+               ++nor;
+               ++tang;
+               ++follicle;
+       }
+}
+
+static void hair_build_data(const Mesh *scalp, HairPattern *pattern, 
HairCurveData *curve_data, CustomDataMask datamask)
+{
+       if (datamask & (CD_MASK_ORCO | CD_MASK_NORMAL | CD_MASK_TANGENT)) {
+               BKE_hair_ensure_follicle_space(scalp, pattern);
+       }
+}
+
+void BKE_hair_modifiers_calc(const Depsgraph *depsgraph, Scene *scene, Object 
*ob)
+{
+       HairSystem *hsys = ob->data;
+       const Mesh *scalp = BKE_hair_get_scalp(depsgraph, ob, hsys);
+       EditHair *edit = hsys->edithair;
+
+       CustomDataMask datamask = CD_MASK_ORCO | CD_MASK_NORMAL | 
CD_MASK_TANGENT;
+
+       if (edit) {
+               hair_build_data(scalp, edit->pattern, &edit->curve_data, 
datamask);
+       }
+       else {
+               hair_build_data(scalp, hsys->pattern, &hsys->curve_data, 
datamask);
+       }
+}
+
 
 /* === Export === */
 
diff --git a/source/blender/blenkernel/intern/object_update.c 
b/source/blender/blenkernel/intern/object_update.c
index 8be54b92dcc..7836685024d 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -241,6 +241,10 @@ void BKE_object_handle_data_update(
                        BKE_lattice_modifiers_calc(depsgraph, scene, ob);
                        break;
 
+               case OB_HAIR:
+                       BKE_hair_modifiers_calc(depsgraph, scene, ob);
+                       break;
+
                case OB_EMPTY:
                        if (ob->empty_drawtype == OB_EMPTY_IMAGE && ob->data)
                                if (BKE_image_is_animated(ob->data))

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

Reply via email to