[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