[Bf-blender-cvs] [e15dd419d43] hair_guides: Depsgraph cleanup for groom curve cache eval.

Lukas Tönne noreply at git.blender.org
Sun Jan 21 17:06:47 CET 2018


Commit: e15dd419d43182f9b826210e9ae90803cb7626a4
Author: Lukas Tönne
Date:   Sun Jan 21 16:06:27 2018 +0000
Branches: hair_guides
https://developer.blender.org/rBe15dd419d43182f9b826210e9ae90803cb7626a4

Depsgraph cleanup for groom curve cache eval.

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

M	source/blender/blenkernel/BKE_groom.h
M	source/blender/blenkernel/intern/groom.c
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/draw/intern/draw_cache_impl_groom.c

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

diff --git a/source/blender/blenkernel/BKE_groom.h b/source/blender/blenkernel/BKE_groom.h
index 5bd07625937..2b9c3213b7a 100644
--- a/source/blender/blenkernel/BKE_groom.h
+++ b/source/blender/blenkernel/BKE_groom.h
@@ -54,6 +54,12 @@ bool BKE_groom_minmax(struct Groom *groom, float min[3], float max[3]);
 void BKE_groom_boundbox_calc(struct Groom *groom, float r_loc[3], float r_size[3]);
 
 
+/* === Curve cache === */
+
+void BKE_groom_curve_cache_update(struct Groom *groom);
+void BKE_groom_curve_cache_clear(struct Groom *groom);
+
+
 /* === Scalp regions === */
 
 /* Try to bind bundles to their scalp regions */
@@ -65,9 +71,6 @@ void BKE_groom_bundle_unbind(struct GroomBundle *bundle);
 
 /* === Depsgraph evaluation === */
 
-void BKE_groom_eval_curve_cache(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob);
-void BKE_groom_eval_curve_cache_clear(struct Object *ob);
-
 void BKE_groom_eval_geometry(const struct EvaluationContext *eval_ctx, struct Groom *groom);
 
 
diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index ab22b65a4cd..8d83a8d7b74 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -493,7 +493,7 @@ void BKE_groom_bundle_unbind(GroomBundle *bundle)
 }
 
 
-/* === Depsgraph evaluation === */
+/* === Curve cache === */
 
 /* forward differencing method for cubic polynomial eval */
 static void groom_forward_diff_cubic(float a, float b, float c, float d, float *p, int it, int stride)
@@ -681,10 +681,8 @@ static void groom_eval_section_mats(GroomBundle *bundle, int curve_res)
 	copy_m3_m3(section->mat, mat);
 }
 
-void BKE_groom_eval_curve_cache(const EvaluationContext *UNUSED(eval_ctx), Scene *UNUSED(scene), Object *ob)
+void BKE_groom_curve_cache_update(Groom *groom)
 {
-	BLI_assert(ob->type == OB_GROOM);
-	Groom *groom = (Groom *)ob->data;
 	ListBase *bundles = (groom->editgroom ? &groom->editgroom->bundles : &groom->bundles);
 	
 	for (GroomBundle *bundle = bundles->first; bundle; bundle = bundle->next)
@@ -731,11 +729,8 @@ void BKE_groom_eval_curve_cache(const EvaluationContext *UNUSED(eval_ctx), Scene
 	}
 }
 
-void BKE_groom_eval_curve_cache_clear(Object *ob)
+void BKE_groom_curve_cache_clear(Groom *groom)
 {
-	BLI_assert(ob->type == OB_GROOM);
-	Groom *groom = (Groom *)ob->data;
-	
 	for (GroomBundle *bundle = groom->bundles.first; bundle; bundle = bundle->next)
 	{
 		BKE_groom_bundle_curve_cache_clear(bundle);
@@ -749,12 +744,17 @@ void BKE_groom_eval_curve_cache_clear(Object *ob)
 	}
 }
 
+
+/* === Depsgraph evaluation === */
+
 void BKE_groom_eval_geometry(const EvaluationContext *UNUSED(eval_ctx), Groom *groom)
 {
 	if (G.debug & G_DEBUG_DEPSGRAPH) {
 		printf("%s on %s\n", __func__, groom->id.name);
 	}
 	
+	BKE_groom_curve_cache_update(groom);
+	
 	if (groom->bb == NULL || (groom->bb->flag & BOUNDBOX_DIRTY)) {
 		BKE_groom_boundbox_calc(groom, NULL, NULL);
 	}
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 67788b66006..fb8aebe3004 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -216,10 +216,6 @@ void BKE_object_handle_data_update(
 			BKE_lattice_modifiers_calc(eval_ctx, scene, ob);
 			break;
 
-		case OB_GROOM:
-			BKE_groom_eval_curve_cache(eval_ctx, scene, ob);
-			break;
-
 		case OB_EMPTY:
 			if (ob->empty_drawtype == OB_EMPTY_IMAGE && ob->data)
 				if (BKE_image_is_animated(ob->data))
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index bd17603b22c..0ddb9fd3f28 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -550,8 +550,8 @@ void DepsgraphNodeBuilder::build_object_data(Object *object)
 		case OB_FONT:
 		case OB_SURF:
 		case OB_MBALL:
-		case OB_GROOM:
 		case OB_LATTICE:
+		case OB_GROOM:
 			build_obdata_geom(object);
 			/* TODO(sergey): Only for until we support granular
 			 * update of curves.
@@ -1131,13 +1131,12 @@ void DepsgraphNodeBuilder::build_obdata_geom(Object *object)
 		case OB_GROOM:
 		{
 			/* Groom evaluation operations. */
-			op_node = add_operation_node(obdata,
-			                             DEG_NODE_TYPE_GEOMETRY,
+			op_node = add_operation_node(obdata, DEG_NODE_TYPE_GEOMETRY,
 			                             function_bind(BKE_groom_eval_geometry,
 			                                           _1,
 			                                           (Groom *)obdata_cow),
-			                                           DEG_OPCODE_PLACEHOLDER,
-			                                           "Geometry Eval");
+			                             DEG_OPCODE_PLACEHOLDER,
+			                             "Geometry Eval");
 			op_node->set_as_entry();
 			break;
 		}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index cc8ad08ea3b..1482f7d947d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -42,6 +42,7 @@ struct GHash;
 struct ID;
 struct Image;
 struct FCurve;
+struct Groom;
 struct Group;
 struct Key;
 struct LayerCollection;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 7001fa9a82e..c89c436cb6a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -51,6 +51,7 @@ extern "C" {
 #include "DNA_curve_types.h"
 #include "DNA_effect_types.h"
 #include "DNA_gpencil_types.h"
+#include "DNA_groom_types.h"
 #include "DNA_group_types.h"
 #include "DNA_key_types.h"
 #include "DNA_lamp_types.h"
@@ -77,6 +78,7 @@ extern "C" {
 #include "BKE_effect.h"
 #include "BKE_collision.h"
 #include "BKE_fcurve.h"
+#include "BKE_groom.h"
 #include "BKE_group.h"
 #include "BKE_key.h"
 #include "BKE_library.h"
@@ -577,8 +579,8 @@ void DepsgraphRelationBuilder::build_object_data(Object *object)
 		case OB_FONT:
 		case OB_SURF:
 		case OB_MBALL:
-		case OB_GROOM:
 		case OB_LATTICE:
+		case OB_GROOM:
 		{
 			build_obdata_geom(object);
 			break;
@@ -1724,6 +1726,19 @@ void DepsgraphRelationBuilder::build_obdata_geom(Object *object)
 		{
 			break;
 		}
+
+		case OB_GROOM: /* Groom */
+		{
+			Groom *groom = (Groom *)obdata;
+			ComponentKey geometry_key(&groom->id, DEG_NODE_TYPE_GEOMETRY);
+			
+			if (groom->scalp_object)
+			{
+				ID *scalp_id = &groom->scalp_object->id;
+				add_relation(ComponentKey(scalp_id, DEG_NODE_TYPE_GEOMETRY), geometry_key, "Scalp Object -> Groom");
+			}
+			break;
+		}
 	}
 
 	/* ShapeKeys */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 30b3219f989..1d556f6b2ce 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -74,6 +74,7 @@ struct World;
 struct EffectorWeights;
 struct ParticleSystem;
 struct ParticleSettings;
+struct Groom;
 
 struct PropertyRNA;
 
diff --git a/source/blender/draw/intern/draw_cache_impl_groom.c b/source/blender/draw/intern/draw_cache_impl_groom.c
index b684dc97950..581dc707372 100644
--- a/source/blender/draw/intern/draw_cache_impl_groom.c
+++ b/source/blender/draw/intern/draw_cache_impl_groom.c
@@ -460,6 +460,10 @@ static void groom_get_edges(
 				if (use_curve_cache)
 				{
 					const int curvesize = bundle->curvesize;
+					if (curvesize == 0)
+					{
+						continue;
+					}
 					
 					/* a curve for each shape vertex */
 					for (int i = 0; i < numshapeverts; ++i)



More information about the Bf-blender-cvs mailing list