[Bf-blender-cvs] [b57db4b79ed] master: Cleanup: Reduce `void *` reliance of new RNA C++ Outliner elements

Julian Eisel noreply at git.blender.org
Wed Jan 26 19:16:08 CET 2022


Commit: b57db4b79ed25f07176474b864d698ef48578f42
Author: Julian Eisel
Date:   Wed Jan 26 18:02:33 2022 +0100
Branches: master
https://developer.blender.org/rBb57db4b79ed25f07176474b864d698ef48578f42

Cleanup: Reduce `void *` reliance of new RNA C++ Outliner elements

Continuation of the previous commit, this time addressing the same for
RNA tree-elements.

===================================================================

M	source/blender/editors/space_outliner/outliner_draw.cc
M	source/blender/editors/space_outliner/outliner_edit.cc
M	source/blender/editors/space_outliner/tree/tree_element_rna.cc
M	source/blender/editors/space_outliner/tree/tree_element_rna.hh

===================================================================

diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc
index 6de8d9539a9..1b64efd0088 100644
--- a/source/blender/editors/space_outliner/outliner_draw.cc
+++ b/source/blender/editors/space_outliner/outliner_draw.cc
@@ -81,6 +81,7 @@
 #include "outliner_intern.hh"
 #include "tree/tree_display.hh"
 #include "tree/tree_element.hh"
+#include "tree/tree_element_rna.hh"
 
 using namespace blender::ed::outliner;
 
@@ -1915,9 +1916,9 @@ static void outliner_draw_rnabuts(
   LISTBASE_FOREACH (TreeElement *, te, lb) {
     TreeStoreElem *tselem = TREESTORE(te);
     if (te->ys + 2 * UI_UNIT_Y >= region->v2d.cur.ymin && te->ys <= region->v2d.cur.ymax) {
-      if (tselem->type == TSE_RNA_PROPERTY) {
+      if (TreeElementRNAProperty *te_rna_prop = tree_element_cast<TreeElementRNAProperty>(te)) {
         ptr = &te->rnaptr;
-        prop = reinterpret_cast<PropertyRNA *>(te->directdata);
+        prop = te_rna_prop->getRNAProperty();
 
         if (!TSELEM_OPEN(tselem, space_outliner)) {
           if (RNA_property_type(prop) == PROP_POINTER) {
@@ -1959,9 +1960,10 @@ static void outliner_draw_rnabuts(
           }
         }
       }
-      else if (tselem->type == TSE_RNA_ARRAY_ELEM) {
+      else if (TreeElementRNAArrayElement *te_rna_array_elem =
+                   tree_element_cast<TreeElementRNAArrayElement>(te)) {
         ptr = &te->rnaptr;
-        prop = reinterpret_cast<PropertyRNA *>(te->directdata);
+        prop = te_rna_array_elem->getRNAProperty();
 
         uiDefAutoButR(block,
                       ptr,
diff --git a/source/blender/editors/space_outliner/outliner_edit.cc b/source/blender/editors/space_outliner/outliner_edit.cc
index a10dbc94b34..f45e7607534 100644
--- a/source/blender/editors/space_outliner/outliner_edit.cc
+++ b/source/blender/editors/space_outliner/outliner_edit.cc
@@ -74,6 +74,9 @@
 #include "GPU_material.h"
 
 #include "outliner_intern.hh"
+#include "tree/tree_element_rna.hh"
+
+using namespace blender::ed::outliner;
 
 static void outliner_show_active(SpaceOutliner *space_outliner,
                                  ARegion *region,
@@ -1718,7 +1721,6 @@ static void tree_element_to_path(TreeElement *te,
   TreeElement *tem, *temnext;
   TreeStoreElem *tse /* , *tsenext */ /* UNUSED */;
   PointerRNA *ptr, *nextptr;
-  PropertyRNA *prop;
   char *newpath = nullptr;
 
   /* optimize tricks:
@@ -1751,7 +1753,6 @@ static void tree_element_to_path(TreeElement *te,
     tem = (TreeElement *)ld->data;
     tse = TREESTORE(tem);
     ptr = &tem->rnaptr;
-    prop = reinterpret_cast<PropertyRNA *>(tem->directdata);
 
     /* check if we're looking for first ID, or appending to path */
     if (*id) {
@@ -1759,7 +1760,9 @@ static void tree_element_to_path(TreeElement *te,
        * - to prevent memory leaks, we must write to newpath not path,
        *   then free old path + swap them.
        */
-      if (tse->type == TSE_RNA_PROPERTY) {
+      if (TreeElementRNAProperty *tem_rna_prop = tree_element_cast<TreeElementRNAProperty>(tem)) {
+        PropertyRNA *prop = tem_rna_prop->getRNAProperty();
+
         if (RNA_property_type(prop) == PROP_POINTER) {
           /* for pointer we just append property name */
           newpath = RNA_path_append(*path, ptr, prop, 0, nullptr);
@@ -1827,8 +1830,7 @@ static void tree_element_to_path(TreeElement *te,
   /* step 3: if we've got an ID, add the current item to the path */
   if (*id) {
     /* add the active property to the path */
-    ptr = &te->rnaptr;
-    prop = reinterpret_cast<PropertyRNA *>(te->directdata);
+    PropertyRNA *prop = tree_element_cast<TreeElementRNACommon>(te)->getRNAProperty();
 
     /* array checks */
     if (tselem->type == TSE_RNA_ARRAY_ELEM) {
@@ -1886,9 +1888,11 @@ static void do_outliner_drivers_editop(SpaceOutliner *space_outliner,
       short flag = 0;
       short groupmode = KSP_GROUP_KSNAME;
 
+      TreeElementRNACommon *te_rna = tree_element_cast<TreeElementRNACommon>(te);
+      PropertyRNA *prop = te_rna ? te_rna->getRNAProperty() : nullptr;
+
       /* check if RNA-property described by this selected element is an animatable prop */
-      if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) &&
-          RNA_property_animateable(&te->rnaptr, reinterpret_cast<PropertyRNA *>(te->directdata))) {
+      if (prop && RNA_property_animateable(&te->rnaptr, prop)) {
         /* get id + path + index info from the selected element */
         tree_element_to_path(te, tselem, &id, &path, &array_index, &flag, &groupmode);
       }
@@ -1901,8 +1905,7 @@ static void do_outliner_drivers_editop(SpaceOutliner *space_outliner,
         /* array checks */
         if (flag & KSP_FLAG_WHOLE_ARRAY) {
           /* entire array was selected, so add drivers for all */
-          arraylen = RNA_property_array_length(&te->rnaptr,
-                                               reinterpret_cast<PropertyRNA *>(te->directdata));
+          arraylen = RNA_property_array_length(&te->rnaptr, prop);
         }
         else {
           arraylen = array_index;
@@ -2084,8 +2087,9 @@ static void do_outliner_keyingset_editop(SpaceOutliner *space_outliner,
       short groupmode = KSP_GROUP_KSNAME;
 
       /* check if RNA-property described by this selected element is an animatable prop */
-      if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) &&
-          RNA_property_animateable(&te->rnaptr, reinterpret_cast<PropertyRNA *>(te->directdata))) {
+      if (TreeElementRNACommon *te_rna = tree_element_cast<TreeElementRNACommon>(te);
+          te_rna && te_rna->getRNAProperty() &&
+          RNA_property_animateable(&te->rnaptr, te_rna->getRNAProperty())) {
         /* get id + path + index info from the selected element */
         tree_element_to_path(te, tselem, &id, &path, &array_index, &flag, &groupmode);
       }
diff --git a/source/blender/editors/space_outliner/tree/tree_element_rna.cc b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
index 1aa30e1a99a..b39ff74b03a 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_rna.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_rna.cc
@@ -73,6 +73,11 @@ bool TreeElementRNACommon::expandPoll(const SpaceOutliner &) const
   return isRNAValid();
 }
 
+PropertyRNA *TreeElementRNACommon::getRNAProperty() const
+{
+  return nullptr;
+}
+
 /* -------------------------------------------------------------------- */
 /* RNA Struct */
 
@@ -108,10 +113,12 @@ void TreeElementRNAStruct::expand(SpaceOutliner &space_outliner) const
   int tot = RNA_property_collection_length(ptr, iterprop);
   CLAMP_MAX(tot, max_index);
 
+  TreeElementRNAProperty *parent_prop_te = legacy_te_.parent ?
+                                               tree_element_cast<TreeElementRNAProperty>(
+                                                   legacy_te_.parent) :
+                                               nullptr;
   /* auto open these cases */
-  if (!legacy_te_.parent ||
-      (RNA_property_type(reinterpret_cast<PropertyRNA *>(legacy_te_.parent->directdata))) ==
-          PROP_POINTER) {
+  if (!parent_prop_te || (RNA_property_type(parent_prop_te->getRNAProperty()) == PROP_POINTER)) {
     if (!tselem.used) {
       tselem.flag &= ~TSE_CLOSED;
     }
@@ -157,7 +164,6 @@ TreeElementRNAProperty::TreeElementRNAProperty(TreeElement &legacy_te,
   PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(propptr.data);
 
   legacy_te_.name = RNA_property_ui_name(prop);
-  legacy_te_.directdata = prop;
   rna_prop_ = prop;
 }
 
@@ -225,6 +231,11 @@ void TreeElementRNAProperty::expand(SpaceOutliner &space_outliner) const
   }
 }
 
+PropertyRNA *TreeElementRNAProperty::getRNAProperty() const
+{
+  return rna_prop_;
+}
+
 /* -------------------------------------------------------------------- */
 /* RNA Array Element */
 
@@ -236,11 +247,9 @@ TreeElementRNAArrayElement::TreeElementRNAArrayElement(TreeElement &legacy_te,
   BLI_assert(legacy_te.store_elem->type == TSE_RNA_ARRAY_ELEM);
 
   BLI_assert(legacy_te.parent && (legacy_te.parent->store_elem->type == TSE_RNA_PROPERTY));
-  PropertyRNA *prop = reinterpret_cast<PropertyRNA *>(legacy_te_.parent->directdata);
-  legacy_te_.directdata = prop;
   legacy_te_.index = index;
 
-  char c = RNA_property_array_item_char(prop, index);
+  char c = RNA_property_array_item_char(TreeElementRNAArrayElement::getRNAProperty(), index);
 
   legacy_te_.name = reinterpret_cast<char *>(
       MEM_callocN(sizeof(char[20]), "OutlinerRNAArrayName"));
@@ -253,4 +262,12 @@ TreeElementRNAArrayElement::TreeElementRNAArrayElement(TreeElement &legacy_te,
   legacy_te_.flag |= TE_FREE_NAME;
 }
 
+PropertyRNA *TreeElementRNAArrayElement::getRNAProperty() const
+{
+  /* Forward query to the parent (which is expected to be a #TreeElementRNAProperty). */
+  const TreeElementRNAProperty *parent_prop_te = tree_element_cast<TreeElementRNAProperty>(
+      legacy_te_.parent);
+  return parent_prop_te ? parent_prop_te->getRNAProperty() : nullptr;
+}
+
 }  // namespace blender::ed::outliner
diff --git a/source/blender/editors/space_outliner/tree/tree_element_rna.hh b/source/blender/editors/space_outliner/tree/tree_element_rna.hh
index 352b8763acb..bce527e724b 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_rna.hh
+++ b/source/blender/editors/space_outliner/tree/tree_element_rna.hh
@@ -43,6 +43,12 @@ class TreeElementRNACommon : public AbstractTreeElement {
   bool isExpandValid() const override;
   bool expandPoll(const SpaceOutliner &) const override;
 
+  /**
+   * If this element represents a property or is part of a property (array element), this returns
+   * the property. Otherwise nullptr.
+   */
+  virtual PropertyRNA *getRNAProperty() const;
+
   bool isRNAValid() const;
 };
 
@@ -63,6 +69,8 @@ class TreeElementRNAProperty : public TreeElementRNACommon {
  public:
   TreeElementRNAProperty(TreeElement &legacy_te, PointerRNA &rna_ptr, int index);
   void expand(SpaceOutliner &space_outliner) const override;
+
+  PropertyRNA *getRNAProperty() const override;
 };
 
 /* -------------------------------------------------------------------- */
@@ -70,6 +78,8 @@ class TreeElementRNAProperty :

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list