Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_outliner/tree/tree_element.cc')
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc
index 25bd9a53cf8..b0508e10671 100644
--- a/source/blender/editors/space_outliner/tree/tree_element.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element.cc
@@ -18,6 +18,7 @@
* \ingroup spoutliner
*/
+#include "DNA_anim_types.h"
#include "DNA_listBase.h"
#include "tree_element_anim_data.hh"
@@ -36,15 +37,25 @@ namespace blender::ed::outliner {
static AbstractTreeElement *tree_element_create(int type, TreeElement &legacy_te, void *idv)
{
- /* Would be nice to get rid of void * here, can we somehow expect the right type right away?
- * Perfect forwarding maybe, once the API is C++ only? */
ID &id = *static_cast<ID *>(idv);
+ /*
+ * The following calls make an implicit assumption about what data was passed to the `idv`
+ * argument of #outliner_add_element(). The old code does this already, here we just centralize
+ * it as much as possible for now. Would be nice to entirely get rid of that, no more `void *`.
+ *
+ * Once #outliner_add_element() is sufficiently simplified, it should be replaced by a C++ call.
+ * It could take the derived type as template parameter (e.g. #TreeElementAnimData) and use C++
+ * perfect forwarding to pass any data to the type's constructor.
+ * If general Outliner code wants to access the data, they can query that through the derived
+ * element type then. There's no need for `void *` anymore then.
+ */
+
switch (type) {
case TSE_SOME_ID:
return TreeElementID::createFromID(legacy_te, id);
case TSE_ANIM_DATA:
- return new TreeElementAnimData(legacy_te, id);
+ return new TreeElementAnimData(legacy_te, *reinterpret_cast<IdAdtTemplate &>(id).adt);
case TSE_DRIVER_BASE:
return new TreeElementDriverBase(legacy_te, *static_cast<AnimData *>(idv));
case TSE_NLA:
@@ -52,7 +63,7 @@ static AbstractTreeElement *tree_element_create(int type, TreeElement &legacy_te
case TSE_NLA_TRACK:
return new TreeElementNLATrack(legacy_te, *static_cast<NlaTrack *>(idv));
case TSE_NLA_ACTION:
- return new TreeElementNLAAction(legacy_te);
+ return new TreeElementNLAAction(legacy_te, *static_cast<bAction *>(idv));
case TSE_GP_LAYER:
return new TreeElementGPencilLayer(legacy_te, *static_cast<bGPDlayer *>(idv));
case TSE_R_LAYER_BASE: