[Bf-blender-cvs] [097e1ca1a1d] geometry-nodes: Geometry Nodes: Add the concept of an active modifier
Hans Goudey
noreply at git.blender.org
Thu Nov 19 20:35:53 CET 2020
Commit: 097e1ca1a1daa463e5fb62ffd5006d21ba2aba75
Author: Hans Goudey
Date: Thu Nov 19 14:35:48 2020 -0500
Branches: geometry-nodes
https://developer.blender.org/rB097e1ca1a1daa463e5fb62ffd5006d21ba2aba75
Geometry Nodes: Add the concept of an active modifier
This commit adds functions to set and get the object's active
modifier, which is stored as a flag in the ModifierData struct,
similar to constraints. This will be used to set the context in
the node editor. There are no visible changes in this commit.
===================================================================
M source/blender/blenkernel/BKE_object.h
M source/blender/blenkernel/intern/object.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesdna/DNA_object_types.h
M source/blender/makesrna/intern/rna_modifier.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 28c912a4c9a..a620d9af946 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -77,6 +77,10 @@ bool BKE_object_shaderfx_use_time(struct Object *ob, struct ShaderFxData *md);
bool BKE_object_support_modifier_type_check(const struct Object *ob, int modifier_type);
+/* Active modifier. */
+void BKE_object_modifier_set_active(struct Object *ob, struct ModifierData *md);
+struct ModifierData *BKE_object_active_modifier(const struct Object *ob);
+
bool BKE_object_copy_modifier(struct Object *ob_dst,
const struct Object *ob_src,
struct ModifierData *md);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 7e8c412e637..57651bb8ef4 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1274,6 +1274,39 @@ void BKE_object_modifier_gpencil_hook_reset(Object *ob, HookGpencilModifierData
}
}
+void BKE_object_modifier_set_active(Object *ob, ModifierData *md)
+{
+ BLI_assert(BLI_findindex(&ob->modifiers, md) != -1);
+
+ LISTBASE_FOREACH (ModifierData *, md_iter, &ob->modifiers) {
+ md_iter->flag &= ~eModifierFlag_Active;
+ }
+
+ md->flag |= eModifierFlag_Active;
+}
+
+ModifierData *BKE_object_active_modifier(const Object *ob)
+{
+ /* In debug mode, check for only one active modifier. */
+#ifndef NDEBUG
+ int active_count = 0;
+ LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
+ if (md->flag & eModifierFlag_Active) {
+ active_count++;
+ }
+ }
+ BLI_assert(ELEM(active_count, 0, 1));
+#endif
+
+ LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
+ if (md->flag & eModifierFlag_Active) {
+ return md;
+ }
+ }
+
+ return NULL;
+}
+
bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type)
{
const ModifierTypeInfo *mti;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index d7ad1d59002..14394509e49 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -143,6 +143,11 @@ typedef enum {
eModifierFlag_OverrideLibrary_Local = (1 << 0),
/* This modifier does not own its caches, but instead shares them with another modifier. */
eModifierFlag_SharedCaches = (1 << 1),
+ /**
+ * This modifier is the object's active modifier. Used for context in the node editor.
+ * Only one modifier on an object should have this flag set.
+ */
+ eModifierFlag_Active = (1 << 2),
} ModifierFlag;
/* not a real modifier */
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index bdd9d1dc439..55690046fbd 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -428,6 +428,8 @@ typedef struct ObHook {
/* used many places... should be specialized */
#define SELECT 1
+#define OBJECT_ACTIVE_MODIFIER_NONE -1
+
/* type */
enum {
OB_EMPTY = 0,
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 965395bf314..632c9bb9de3 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1541,6 +1541,29 @@ static bool rna_Modifier_show_expanded_get(PointerRNA *ptr)
return md->ui_expand_flag & UI_PANEL_DATA_EXPAND_ROOT;
}
+static void rna_Modifier_is_active_set(PointerRNA *ptr, bool value)
+{
+ ModifierData *md = ptr->data;
+
+ if (value) {
+ /* Disable the active flag of all other modifiers. */
+ for (ModifierData *prev_md = md->prev; prev_md != NULL; prev_md = prev_md->prev) {
+ prev_md->flag &= ~eModifierFlag_Active;
+ }
+ for (ModifierData *next_md = md->next; next_md != NULL; next_md = next_md->next) {
+ next_md->flag &= ~eModifierFlag_Active;
+ }
+ }
+
+ SET_FLAG_FROM_TEST(md->flag, value, eModifierFlag_Active);
+}
+
+static bool rna_Modifier_is_active_get(PointerRNA *ptr)
+{
+ ModifierData *md = ptr->data;
+ return md->flag & eModifierFlag_Active;
+}
+
static int rna_MeshSequenceCacheModifier_has_velocity_get(PointerRNA *ptr)
{
# ifdef WITH_ALEMBIC
@@ -7259,6 +7282,13 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
+ prop = RNA_def_property(srna, "is_active", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_Modifier_is_active_get", "rna_Modifier_is_active_set");
+ RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
+ RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
+ RNA_def_property_ui_text(prop, "Active", "The active modifier in the list");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
+
prop = RNA_def_property(srna, "use_apply_on_spline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_ApplyOnSpline);
RNA_def_property_ui_text(
More information about the Bf-blender-cvs
mailing list