From 790cbeda2ce920bcd4d5e1a4967783f351bfbf5e Mon Sep 17 00:00:00 2001 From: Almaz-Shinbay Date: Thu, 27 Jul 2023 18:42:09 +0200 Subject: [PATCH] Outliner: Port grease pencil effect elements to new tree-element code design No user visible changes expected. Part of #96713, continuation of work started in 249e4df110 and 2e221de4ce. Refer to these for a motivation and design overview. Adds new classes for grease pencil effect elements. Pull Request: https://projects.blender.org/blender/blender/pulls/110371 --- .../editors/space_outliner/CMakeLists.txt | 2 + .../editors/space_outliner/outliner_intern.hh | 6 ++ .../editors/space_outliner/outliner_tree.cc | 9 ++- .../space_outliner/tree/tree_element.cc | 9 +++ .../tree/tree_element_gpencil_effect.cc | 59 +++++++++++++++++++ .../tree/tree_element_gpencil_effect.hh | 36 +++++++++++ .../tree/tree_element_id_object.cc | 20 +------ 7 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc create mode 100644 source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.hh diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt index b8182ce5e10..62363a9b179 100644 --- a/source/blender/editors/space_outliner/CMakeLists.txt +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -53,6 +53,7 @@ set(SRC tree/tree_element_defgroup.cc tree/tree_element_driver.cc tree/tree_element_edit_bone.cc + tree/tree_element_gpencil_effect.cc tree/tree_element_gpencil_layer.cc tree/tree_element_id.cc tree/tree_element_id_armature.cc @@ -91,6 +92,7 @@ set(SRC tree/tree_element_id_armature.hh tree/tree_element_id_collection.hh tree/tree_element_id_curve.hh + tree/tree_element_gpencil_effect.hh tree/tree_element_id_gpencil_legacy.hh tree/tree_element_id_library.hh tree/tree_element_id_linestyle.hh diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh index 0fea06fec8f..c0a8f84ee93 100644 --- a/source/blender/editors/space_outliner/outliner_intern.hh +++ b/source/blender/editors/space_outliner/outliner_intern.hh @@ -25,6 +25,7 @@ struct ListBase; struct Main; struct Object; struct Scene; +struct ShaderFxData; struct TreeStoreElem; struct ViewLayer; struct bContext; @@ -303,6 +304,11 @@ struct DeformGroupElementCreateData { bDeformGroup *defgroup; }; +struct GPencilEffectElementCreateData { + Object *object; + ShaderFxData *fx; +}; + struct ParticleSystemElementCreateData { Object *object; ParticleSystem *psys; diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc index d3c6808ac3a..40e331168f9 100644 --- a/source/blender/editors/space_outliner/outliner_tree.cc +++ b/source/blender/editors/space_outliner/outliner_tree.cc @@ -245,6 +245,9 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (type == TSE_EBONE) { id = static_cast(idv)->armature_id; } + else if (type == TSE_GPENCIL_EFFECT) { + id = &static_cast(idv)->object->id; + } else if (type == TSE_DEFGROUP) { id = &static_cast(idv)->object->id; } @@ -309,6 +312,9 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (ELEM(type, TSE_BONE, TSE_EBONE)) { /* pass */ } + else if (ELEM(type, TSE_GPENCIL_EFFECT_BASE, TSE_GPENCIL_EFFECT)) { + /* pass */ + } else if (ELEM(type, TSE_DEFGROUP, TSE_DEFGROUP_BASE)) { /* pass */ } @@ -365,7 +371,8 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP, TSE_GENERIC_LABEL) || - ELEM(type, TSE_DEFGROUP, TSE_DEFGROUP_BASE)) + ELEM( + type, TSE_DEFGROUP, TSE_DEFGROUP_BASE, TSE_GPENCIL_EFFECT, TSE_GPENCIL_EFFECT_BASE)) { BLI_assert_msg(false, "Element type should already use new AbstractTreeElement design"); } diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index 8380b9fdf00..5c6353ac4f2 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -23,6 +23,7 @@ #include "tree_element_defgroup.hh" #include "tree_element_driver.hh" #include "tree_element_edit_bone.hh" +#include "tree_element_gpencil_effect.hh" #include "tree_element_gpencil_layer.hh" #include "tree_element_id.hh" #include "tree_element_label.hh" @@ -116,6 +117,14 @@ std::unique_ptr AbstractTreeElement::createFromType(const i return std::make_unique( legacy_te, *ebone_data->armature_id, *ebone_data->ebone); } + case TSE_GPENCIL_EFFECT: { + GPencilEffectElementCreateData *gp_effect_data = + static_cast(idv); + return std::make_unique( + legacy_te, *gp_effect_data->object, *gp_effect_data->fx); + } + case TSE_GPENCIL_EFFECT_BASE: + return std::make_unique(legacy_te, static_cast(idv)); case TSE_DEFGROUP_BASE: return std::make_unique(legacy_te, *static_cast(idv)); case TSE_DEFGROUP: { diff --git a/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc new file mode 100644 index 00000000000..21593cdc21b --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.cc @@ -0,0 +1,59 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#include "DNA_object_types.h" +#include "DNA_outliner_types.h" +#include "DNA_shader_fx_types.h" + +#include "BLI_listbase.h" + +#include "BLT_translation.h" + +#include "../outliner_intern.hh" + +#include "tree_element_gpencil_effect.hh" + +namespace blender::ed::outliner { + +TreeElementGPencilEffectBase::TreeElementGPencilEffectBase(TreeElement &legacy_te, Object &object) + : AbstractTreeElement(legacy_te), object_(object) +{ + legacy_te.name = IFACE_("Effects"); +} + +void TreeElementGPencilEffectBase::expand(SpaceOutliner &space_outliner) const +{ + int index; + LISTBASE_FOREACH_INDEX (ShaderFxData *, fx, &object_.shader_fx, index) { + outliner_add_element( + &space_outliner, &legacy_te_.subtree, &object_, &legacy_te_, TSE_GPENCIL_EFFECT, index); + } +} + +TreeElementGPencilEffect::TreeElementGPencilEffect(TreeElement &legacy_te, + Object & /* object */, + ShaderFxData &fx) + : AbstractTreeElement(legacy_te), /* object_(object), */ fx_(fx) +{ + legacy_te.name = fx_.name; + legacy_te.directdata = &fx_; +} + +void TreeElementGPencilEffect::expand(SpaceOutliner &space_outliner) const +{ + if (fx_.type == eShaderFxType_Swirl) { + outliner_add_element(&space_outliner, + &legacy_te_.subtree, + ((SwirlShaderFxData *)(&fx_))->object, + &legacy_te_, + TSE_LINKED_OB, + 0); + } +} + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.hh b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.hh new file mode 100644 index 00000000000..684f50ad735 --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_gpencil_effect.hh @@ -0,0 +1,36 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#pragma once + +#include "tree_element.hh" + +struct Object; +struct ShaderFxData; + +namespace blender::ed::outliner { + +class TreeElementGPencilEffectBase final : public AbstractTreeElement { + Object &object_; + + public: + TreeElementGPencilEffectBase(TreeElement &legacy_te, Object &object); + void expand(SpaceOutliner &) const override; +}; + +class TreeElementGPencilEffect final : public AbstractTreeElement { + /* Not needed right now, avoid unused member variable warning. */ + // Object &object_; + ShaderFxData &fx_; + + public: + TreeElementGPencilEffect(TreeElement &legacy_te, Object &object, ShaderFxData &fx); + void expand(SpaceOutliner &) const override; +}; + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_object.cc b/source/blender/editors/space_outliner/tree/tree_element_id_object.cc index d6b5eb51c91..02afbacab98 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id_object.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id_object.cc @@ -259,26 +259,8 @@ void TreeElementIDObject::expand_gpencil_effects(SpaceOutliner &space_outliner) if (BLI_listbase_is_empty(&object_.shader_fx)) { return; } - TreeElement *ten_fx = outliner_add_element( + outliner_add_element( &space_outliner, &legacy_te_.subtree, &object_, &legacy_te_, TSE_GPENCIL_EFFECT_BASE, 0); - ten_fx->name = IFACE_("Effects"); - - int index; - LISTBASE_FOREACH_INDEX (ShaderFxData *, fx, &object_.shader_fx, index) { - TreeElement *ten = outliner_add_element( - &space_outliner, &ten_fx->subtree, &object_, ten_fx, TSE_GPENCIL_EFFECT, index); - ten->name = fx->name; - ten->directdata = fx; - - if (fx->type == eShaderFxType_Swirl) { - outliner_add_element(&space_outliner, - &ten->subtree, - ((SwirlShaderFxData *)fx)->object, - ten, - TSE_LINKED_OB, - 0); - } - } } void TreeElementIDObject::expand_vertex_groups(SpaceOutliner &space_outliner) const