[Bf-blender-cvs] [12f04a805aa] hair_object: Depsgraph eval function for hair on object level that computes follicle space.
Lukas Tönne
noreply at git.blender.org
Sun Nov 11 12:46:00 CET 2018
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))
More information about the Bf-blender-cvs
mailing list