From 2c9b32949bc00e73603bcabadb74e5b3176a161a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 25 Jun 2018 16:04:56 +0200 Subject: Cleanup: refactor depsgraph physics API functions. --- source/blender/blenkernel/intern/collision.c | 12 +- source/blender/depsgraph/DEG_depsgraph_build.h | 16 -- source/blender/depsgraph/DEG_depsgraph_physics.h | 34 +++- .../intern/builder/deg_builder_relations.cc | 2 +- source/blender/depsgraph/intern/depsgraph.cc | 6 +- source/blender/depsgraph/intern/depsgraph.h | 5 +- source/blender/depsgraph/intern/depsgraph_build.cc | 76 --------- source/blender/depsgraph/intern/depsgraph_intern.h | 3 +- .../blender/depsgraph/intern/depsgraph_physics.cc | 176 +++++++++++++++------ source/blender/modifiers/intern/MOD_cloth.c | 1 + source/blender/modifiers/intern/MOD_dynamicpaint.c | 1 + source/blender/modifiers/intern/MOD_smoke.c | 1 + source/blender/modifiers/intern/MOD_softbody.c | 1 + 13 files changed, 168 insertions(+), 166 deletions(-) diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 546f37dbee6..1debdbb847e 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -545,14 +545,7 @@ void BKE_collision_relations_free(ListBase *relations) * Self will be excluded. */ Object **BKE_collision_objects_create(Depsgraph *depsgraph, Object *self, Collection *collection, unsigned int *numcollobj, unsigned int modifier_type) { - ListBase *relations; - - if (modifier_type == eModifierType_Smoke) { - relations = DEG_get_smoke_collision_relations(depsgraph, collection); - } - else { - relations = DEG_get_collision_relations(depsgraph, collection); - } + ListBase *relations = DEG_get_collision_relations(depsgraph, collection, modifier_type); if (!relations) { return NULL; @@ -592,8 +585,7 @@ void BKE_collision_objects_free(Object **objects) * Self will be excluded. */ ListBase *BKE_collider_cache_create(Depsgraph *depsgraph, Object *self, Collection *collection) { - /* TODO: does this get built? */ - ListBase *relations = DEG_get_collision_relations(depsgraph, collection); + ListBase *relations = DEG_get_collision_relations(depsgraph, collection, eModifierType_Collision); ListBase *cache = NULL; if (!relations) { diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h index 834d45a7e61..30fefb7d4e4 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.h +++ b/source/blender/depsgraph/DEG_depsgraph_build.h @@ -153,22 +153,6 @@ void DEG_add_object_cache_relation(struct DepsNodeHandle *handle, struct Depsgraph *DEG_get_graph_from_handle(struct DepsNodeHandle *handle); void DEG_add_special_eval_flag(struct Depsgraph *graph, struct ID *id, short flag); -/* Utility functions for physics modifiers */ -typedef bool (*DEG_CollobjFilterFunction)(struct Object *obj, struct ModifierData *md); - -void DEG_add_collision_relations(struct DepsNodeHandle *handle, - struct Object *object, - struct Collection *collection, - unsigned int modifier_type, - DEG_CollobjFilterFunction fn, - const char *name); -void DEG_add_forcefield_relations(struct DepsNodeHandle *handle, - struct Object *object, - struct EffectorWeights *eff, - bool add_absorption, - int skip_forcefield, - const char *name); - /* ************************************************ */ #ifdef __cplusplus diff --git a/source/blender/depsgraph/DEG_depsgraph_physics.h b/source/blender/depsgraph/DEG_depsgraph_physics.h index c90f66838cc..fd35a7fb2c0 100644 --- a/source/blender/depsgraph/DEG_depsgraph_physics.h +++ b/source/blender/depsgraph/DEG_depsgraph_physics.h @@ -34,21 +34,49 @@ struct Colllection; struct Depsgraph; +struct DepsNodeHandle; +struct EffectorWeights; struct ListBase; +struct Object; #ifdef __cplusplus extern "C" { #endif +typedef enum ePhysicsRelationType { + DEG_PHYSICS_EFFECTOR = 0, + DEG_PHYSICS_COLLISION = 1, + DEG_PHYSICS_SMOKE_COLLISION = 2, + DEG_PHYSICS_DYNAMIC_BRUSH = 3, + DEG_PHYSICS_RELATIONS_NUM = 4 +} ePhysicsRelationType; + /* Get collision/effector relations from collection or entire scene. These * created during depsgraph relations building and should only be accessed * during evaluation. */ struct ListBase *DEG_get_effector_relations(const struct Depsgraph *depsgraph, struct Collection *collection); struct ListBase *DEG_get_collision_relations(const struct Depsgraph *depsgraph, - struct Collection *collection); -struct ListBase *DEG_get_smoke_collision_relations(const struct Depsgraph *depsgraph, - struct Collection *collection); + struct Collection *collection, + unsigned int modifier_type); + + +/* Build collision/effector relations for depsgraph. */ +typedef bool (*DEG_CollobjFilterFunction)(struct Object *obj, + struct ModifierData *md); + +void DEG_add_collision_relations(struct DepsNodeHandle *handle, + struct Object *object, + struct Collection *collection, + unsigned int modifier_type, + DEG_CollobjFilterFunction fn, + const char *name); +void DEG_add_forcefield_relations(struct DepsNodeHandle *handle, + struct Object *object, + struct EffectorWeights *eff, + bool add_absorption, + int skip_forcefield, + const char *name); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index d87cb59e976..06c17b19a8c 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -302,7 +302,7 @@ void DepsgraphRelationBuilder::add_collision_relations( Collection *collection, const char *name) { - ListBase *relations = deg_build_collision_relations(graph_, collection); + ListBase *relations = deg_build_collision_relations(graph_, collection, eModifierType_Collision); LISTBASE_FOREACH (CollisionRelation *, relation, relations) { if (relation->ob != object) { diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc index 267cadb7993..ddc6e44ee1b 100644 --- a/source/blender/depsgraph/intern/depsgraph.cc +++ b/source/blender/depsgraph/intern/depsgraph.cc @@ -93,16 +93,14 @@ Depsgraph::Depsgraph(Scene *scene, mode(mode), ctime(BKE_scene_frame_get(scene)), scene_cow(NULL), - is_active(false), - collision_relations(NULL), - smoke_collision_relations(NULL), - effector_relations(NULL) + is_active(false) { BLI_spin_init(&lock); id_hash = BLI_ghash_ptr_new("Depsgraph id hash"); entry_tags = BLI_gset_ptr_new("Depsgraph entry_tags"); debug_flags = G.debug; memset(id_type_updated, 0, sizeof(id_type_updated)); + memset(physics_relations, 0, sizeof(physics_relations)); } Depsgraph::~Depsgraph() diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h index 3517a6f6f34..804fd1b36c2 100644 --- a/source/blender/depsgraph/intern/depsgraph.h +++ b/source/blender/depsgraph/intern/depsgraph.h @@ -45,6 +45,7 @@ #include "BLI_threads.h" /* for SpinLock */ #include "DEG_depsgraph.h" +#include "DEG_depsgraph_physics.h" #include "intern/depsgraph_types.h" @@ -229,9 +230,7 @@ struct Depsgraph { /* Cached list of colliders/effectors for collections and the scene * created along with relations, for fast lookup during evaluation. */ - GHash *collision_relations; - GHash *smoke_collision_relations; - GHash *effector_relations; + GHash *physics_relations[DEG_PHYSICS_RELATIONS_NUM]; }; } // namespace DEG diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index 042cf801e6b..fccb5808711 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -43,12 +43,8 @@ extern "C" { #include "DNA_cachefile_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_object_force_types.h" #include "BKE_main.h" -#include "BKE_collision.h" -#include "BKE_effect.h" -#include "BKE_modifier.h" #include "BKE_scene.h" } /* extern "C" */ @@ -322,75 +318,3 @@ void DEG_relations_tag_update(Main *bmain) } } } - -void DEG_add_collision_relations(DepsNodeHandle *handle, - Object *object, - Collection *collection, - unsigned int modifier_type, - DEG_CollobjFilterFunction fn, - const char *name) -{ - Depsgraph *depsgraph = DEG_get_graph_from_handle(handle); - DEG::Depsgraph *deg_graph = (DEG::Depsgraph *)depsgraph; - ListBase *relations; - - if (modifier_type == eModifierType_Smoke) { - relations = deg_build_smoke_collision_relations(deg_graph, collection); - } - else { - relations = deg_build_collision_relations(deg_graph, collection); - } - - LISTBASE_FOREACH (CollisionRelation *, relation, relations) { - Object *ob1 = relation->ob; - if (ob1 != object) { - if (!fn || fn(ob1, modifiers_findByType(ob1, (ModifierType)modifier_type))) { - DEG_add_object_relation(handle, ob1, DEG_OB_COMP_TRANSFORM, name); - DEG_add_object_relation(handle, ob1, DEG_OB_COMP_GEOMETRY, name); - } - } - } -} - -void DEG_add_forcefield_relations(DepsNodeHandle *handle, - Object *object, - EffectorWeights *effector_weights, - bool add_absorption, - int skip_forcefield, - const char *name) -{ - Depsgraph *depsgraph = DEG_get_graph_from_handle(handle); - DEG::Depsgraph *deg_graph = (DEG::Depsgraph *)depsgraph; - ListBase *relations = deg_build_effector_relations(deg_graph, effector_weights->group); - - LISTBASE_FOREACH (EffectorRelation *, relation, relations) { - if (relation->ob != object && relation->pd->forcefield != skip_forcefield) { - DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_TRANSFORM, name); - if (relation->psys) { - DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_EVAL_PARTICLES, name); - /* TODO: remove this when/if EVAL_PARTICLES is sufficient - * for up to date particles. - */ - DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_GEOMETRY, name); - } - if (relation->pd->forcefield == PFIELD_SMOKEFLOW && relation->pd->f_source) { - DEG_add_object_relation(handle, - relation->pd->f_source, - DEG_OB_COMP_TRANSFORM, - "Smoke Force Domain"); - DEG_add_object_relation(handle, - relation->pd->f_source, - DEG_OB_COMP_GEOMETRY, - "Smoke Force Domain"); - } - if (add_absorption && (relation->pd->flag & PFIELD_VISIBILITY)) { - DEG_add_collision_relations(handle, - object, - NULL, - eModifierType_Collision, - NULL, - "Force Absorption"); - } - } - } -} diff --git a/source/blender/depsgraph/intern/depsgraph_intern.h b/source/blender/depsgraph/intern/depsgraph_intern.h index 55ecfacf126..aa67226c47e 100644 --- a/source/blender/depsgraph/intern/depsgraph_intern.h +++ b/source/blender/depsgraph/intern/depsgraph_intern.h @@ -143,8 +143,7 @@ string deg_color_end(void); /* Physics Utilities -------------------------------------------------- */ struct ListBase *deg_build_effector_relations(Depsgraph *graph, struct Collection *collection); -struct ListBase *deg_build_collision_relations(Depsgraph *graph, struct Collection *collection); -struct ListBase *deg_build_smoke_collision_relations(Depsgraph *graph, struct Collection *collection); +struct ListBase *deg_build_collision_relations(Depsgraph *graph, struct Collection *collection, unsigned int modifier_type); void deg_clear_physics_relations(Depsgraph *graph); } // namespace DEG diff --git a/source/blender/depsgraph/intern/depsgraph_physics.cc b/source/blender/depsgraph/intern/depsgraph_physics.cc index ba42ef96365..2745a6c8722 100644 --- a/source/blender/depsgraph/intern/depsgraph_physics.cc +++ b/source/blender/depsgraph/intern/depsgraph_physics.cc @@ -31,55 +31,132 @@ #include "BLI_compiler_compat.h" #include "BLI_ghash.h" +#include "BLI_listbase.h" extern "C" { #include "BKE_collision.h" #include "BKE_effect.h" +#include "BKE_modifier.h" } /* extern "C" */ #include "DNA_group_types.h" +#include "DNA_object_force_types.h" +#include "DEG_depsgraph_build.h" #include "DEG_depsgraph_physics.h" #include "depsgraph.h" #include "depsgraph_intern.h" -/************************ Public API *************************/ +/*********************** Evaluation Query API *************************/ + +static ePhysicsRelationType modifier_to_relation_type(unsigned int modifier_type) +{ + switch (modifier_type) { + case eModifierType_Collision: + return DEG_PHYSICS_COLLISION; + case eModifierType_Smoke: + return DEG_PHYSICS_SMOKE_COLLISION; + case eModifierType_DynamicPaint: + return DEG_PHYSICS_DYNAMIC_BRUSH; + }; + + BLI_assert(!"Unknown collision modifier type"); + return DEG_PHYSICS_RELATIONS_NUM; +} ListBase *DEG_get_effector_relations(const Depsgraph *graph, Collection *collection) { const DEG::Depsgraph *deg_graph = reinterpret_cast(graph); - if (deg_graph->effector_relations == NULL) { + if (deg_graph->physics_relations[DEG_PHYSICS_EFFECTOR] == NULL) { return NULL; } - return (ListBase *)BLI_ghash_lookup(deg_graph->effector_relations, collection); + return (ListBase *)BLI_ghash_lookup(deg_graph->physics_relations[DEG_PHYSICS_EFFECTOR], collection); } ListBase *DEG_get_collision_relations(const Depsgraph *graph, - Collection *collection) + Collection *collection, + unsigned int modifier_type) { const DEG::Depsgraph *deg_graph = reinterpret_cast(graph); - if (deg_graph->collision_relations == NULL) { + const ePhysicsRelationType type = modifier_to_relation_type(modifier_type); + if (deg_graph->physics_relations[type] == NULL) { return NULL; } - return (ListBase*)BLI_ghash_lookup(deg_graph->collision_relations, collection); + return (ListBase *)BLI_ghash_lookup(deg_graph->physics_relations[type], collection); } -ListBase *DEG_get_smoke_collision_relations(const Depsgraph *graph, - Collection *collection) +/********************** Depsgraph Building API ************************/ + +void DEG_add_collision_relations(DepsNodeHandle *handle, + Object *object, + Collection *collection, + unsigned int modifier_type, + DEG_CollobjFilterFunction fn, + const char *name) { - const DEG::Depsgraph *deg_graph = reinterpret_cast(graph); - if (deg_graph->smoke_collision_relations == NULL) { - return NULL; + Depsgraph *depsgraph = DEG_get_graph_from_handle(handle); + DEG::Depsgraph *deg_graph = (DEG::Depsgraph *)depsgraph; + ListBase *relations = deg_build_collision_relations(deg_graph, collection, modifier_type); + + LISTBASE_FOREACH (CollisionRelation *, relation, relations) { + Object *ob1 = relation->ob; + if (ob1 != object) { + if (!fn || fn(ob1, modifiers_findByType(ob1, (ModifierType)modifier_type))) { + DEG_add_object_relation(handle, ob1, DEG_OB_COMP_TRANSFORM, name); + DEG_add_object_relation(handle, ob1, DEG_OB_COMP_GEOMETRY, name); + } + } } +} - return (ListBase*)BLI_ghash_lookup(deg_graph->smoke_collision_relations, collection); +void DEG_add_forcefield_relations(DepsNodeHandle *handle, + Object *object, + EffectorWeights *effector_weights, + bool add_absorption, + int skip_forcefield, + const char *name) +{ + Depsgraph *depsgraph = DEG_get_graph_from_handle(handle); + DEG::Depsgraph *deg_graph = (DEG::Depsgraph *)depsgraph; + ListBase *relations = deg_build_effector_relations(deg_graph, effector_weights->group); + + LISTBASE_FOREACH (EffectorRelation *, relation, relations) { + if (relation->ob != object && relation->pd->forcefield != skip_forcefield) { + DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_TRANSFORM, name); + if (relation->psys) { + DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_EVAL_PARTICLES, name); + /* TODO: remove this when/if EVAL_PARTICLES is sufficient + * for up to date particles. + */ + DEG_add_object_relation(handle, relation->ob, DEG_OB_COMP_GEOMETRY, name); + } + if (relation->pd->forcefield == PFIELD_SMOKEFLOW && relation->pd->f_source) { + DEG_add_object_relation(handle, + relation->pd->f_source, + DEG_OB_COMP_TRANSFORM, + "Smoke Force Domain"); + DEG_add_object_relation(handle, + relation->pd->f_source, + DEG_OB_COMP_GEOMETRY, + "Smoke Force Domain"); + } + if (add_absorption && (relation->pd->flag & PFIELD_VISIBILITY)) { + DEG_add_collision_relations(handle, + object, + NULL, + eModifierType_Collision, + NULL, + "Force Absorption"); + } + } + } } -/*********************** Internal API ************************/ +/**************************** Internal API ****************************/ namespace DEG { @@ -87,49 +164,38 @@ namespace DEG ListBase *deg_build_effector_relations(Depsgraph *graph, Collection *collection) { - if (graph->effector_relations == NULL) { - graph->effector_relations = BLI_ghash_ptr_new("Depsgraph effector relations hash"); + GHash *hash = graph->physics_relations[DEG_PHYSICS_EFFECTOR]; + if (hash == NULL) { + graph->physics_relations[DEG_PHYSICS_EFFECTOR] = BLI_ghash_ptr_new("Depsgraph physics relations hash"); + hash = graph->physics_relations[DEG_PHYSICS_EFFECTOR]; } - ListBase *relations = reinterpret_cast(BLI_ghash_lookup(graph->effector_relations, collection)); + ListBase *relations = reinterpret_cast(BLI_ghash_lookup(hash, collection)); if (relations == NULL) { ::Depsgraph *depsgraph = reinterpret_cast<::Depsgraph*>(graph); relations = BKE_effector_relations_create(depsgraph, graph->view_layer, collection); - BLI_ghash_insert(graph->effector_relations, collection, relations); + BLI_ghash_insert(hash, collection, relations); } return relations; } ListBase *deg_build_collision_relations(Depsgraph *graph, - Collection *collection) + Collection *collection, + unsigned int modifier_type) { - if (graph->collision_relations == NULL) { - graph->collision_relations = BLI_ghash_ptr_new("Depsgraph collision relations hash"); + const ePhysicsRelationType type = modifier_to_relation_type(modifier_type); + GHash *hash = graph->physics_relations[type]; + if (hash == NULL) { + graph->physics_relations[type] = BLI_ghash_ptr_new("Depsgraph physics relations hash"); + hash = graph->physics_relations[type]; } - ListBase *relations = reinterpret_cast(BLI_ghash_lookup(graph->collision_relations, collection)); + ListBase *relations = reinterpret_cast(BLI_ghash_lookup(hash, collection)); if (relations == NULL) { ::Depsgraph *depsgraph = reinterpret_cast<::Depsgraph*>(graph); - relations = BKE_collision_relations_create(depsgraph, collection, eModifierType_Collision); - BLI_ghash_insert(graph->collision_relations, collection, relations); - } - - return relations; -} - -ListBase *deg_build_smoke_collision_relations(Depsgraph *graph, - Collection *collection) -{ - if (graph->smoke_collision_relations == NULL) { - graph->smoke_collision_relations = BLI_ghash_ptr_new("Depsgraph smoke collision relations hash"); - } - - ListBase *relations = reinterpret_cast(BLI_ghash_lookup(graph->smoke_collision_relations, collection)); - if (relations == NULL) { - ::Depsgraph *depsgraph = reinterpret_cast<::Depsgraph*>(graph); - relations = BKE_collision_relations_create(depsgraph, collection, eModifierType_Smoke); - BLI_ghash_insert(graph->smoke_collision_relations, collection, relations); + relations = BKE_collision_relations_create(depsgraph, collection, modifier_type); + BLI_ghash_insert(hash, collection, relations); } return relations; @@ -147,17 +213,25 @@ static void free_collision_relations(void *value) void deg_clear_physics_relations(Depsgraph *graph) { - if (graph->collision_relations) { - BLI_ghash_free(graph->collision_relations, NULL, free_collision_relations); - graph->collision_relations = NULL; - } - if (graph->smoke_collision_relations) { - BLI_ghash_free(graph->smoke_collision_relations, NULL, free_collision_relations); - graph->smoke_collision_relations = NULL; - } - if (graph->effector_relations) { - BLI_ghash_free(graph->effector_relations, NULL, free_effector_relations); - graph->effector_relations = NULL; + for (int i = 0; i < DEG_PHYSICS_RELATIONS_NUM; i++) { + if (graph->physics_relations[i]) { + ePhysicsRelationType type = (ePhysicsRelationType)i; + + switch (type) { + case DEG_PHYSICS_EFFECTOR: + BLI_ghash_free(graph->physics_relations[i], NULL, free_effector_relations); + break; + case DEG_PHYSICS_COLLISION: + case DEG_PHYSICS_SMOKE_COLLISION: + case DEG_PHYSICS_DYNAMIC_BRUSH: + BLI_ghash_free(graph->physics_relations[i], NULL, free_collision_relations); + break; + case DEG_PHYSICS_RELATIONS_NUM: + break; + } + + graph->physics_relations[i] = NULL; + } } } diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c index 49f5c45d5c2..979faacc809 100644 --- a/source/blender/modifiers/intern/MOD_cloth.c +++ b/source/blender/modifiers/intern/MOD_cloth.c @@ -54,6 +54,7 @@ #include "BKE_modifier.h" #include "BKE_pointcache.h" +#include "DEG_depsgraph_physics.h" #include "DEG_depsgraph_query.h" #include "MOD_util.h" diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index 1d62abc283a..9131bc0659f 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -43,6 +43,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_physics.h" #include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c index a7a76b73521..e81c760ed67 100644 --- a/source/blender/modifiers/intern/MOD_smoke.c +++ b/source/blender/modifiers/intern/MOD_smoke.c @@ -55,6 +55,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_physics.h" #include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c index 911eb10a020..55df32b0e18 100644 --- a/source/blender/modifiers/intern/MOD_softbody.c +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -46,6 +46,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_physics.h" #include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.h" -- cgit v1.2.3