[Bf-blender-cvs] [0c2a314443e] master: RNA: automatically initialize defaults from DNA

Campbell Barton noreply at git.blender.org
Wed Sep 11 14:24:11 CEST 2019


Commit: 0c2a314443e8a0e38795e25b031997437278a8d7
Author: Campbell Barton
Date:   Wed Sep 11 22:21:13 2019 +1000
Branches: master
https://developer.blender.org/rB0c2a314443e8a0e38795e25b031997437278a8d7

RNA: automatically initialize defaults from DNA

Use defaults from DNA_*_defaults.h headers, this avoids calling
RNA_def_property_*_default explicitly & having to repeat values.

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

M	source/blender/makesrna/intern/CMakeLists.txt
M	source/blender/makesrna/intern/rna_define.c
M	source/blender/makesrna/intern/rna_internal.h

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

diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 2745cfa9740..259f656cc8c 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -164,10 +164,19 @@ set(SRC
   ../../../../intern/guardedalloc/intern/mallocn_guarded_impl.c
   ../../../../intern/guardedalloc/intern/mallocn_lockfree_impl.c
   ../../../../intern/guardedalloc/intern/mmap_win.c
+
+  # Needed for defaults.
+  ../../../../release/datafiles/userdef/userdef_default.c
+  ../../../../release/datafiles/userdef/userdef_default_theme.c
 )
 
 set(INC
-    ../../../../intern/clog
+  ../../../../intern/clog
+
+  # Needed for defaults forward declarations.
+  ../../../blender/blenloader
+
+  ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern
 )
 
 set(INC_SYS
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 03ab9da2eff..5392c81bd1f 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -31,6 +31,7 @@
 
 #include "DNA_genfile.h"
 #include "DNA_sdna_types.h"
+#include "DNA_defaults.h"
 
 #include "BLI_listbase.h"
 #include "BLI_ghash.h"
@@ -68,6 +69,25 @@ static struct {
 } g_version_data;
 #endif
 
+#ifndef RNA_RUNTIME
+/**
+ * When set, report report details about which defaults are used.
+ * Noisy but handy when investigating default extraction.
+ */
+static bool debugSRNA_defaults = false;
+
+static void print_defult_info(const PropertyDefRNA *dp)
+{
+  fprintf(stderr,
+          "dna_type=%s, dna_offset=%d, dna_struct=%s, dna_name=%s, id=%s\n",
+          dp->dnatype,
+          dp->dnaoffset,
+          dp->dnastructname,
+          dp->dnaname,
+          dp->prop->identifier);
+}
+#endif /* RNA_RUNTIME */
+
 /* Duplicated code since we can't link in blenkernel or blenlib */
 
 /* pedantic check for final '.', note '...' are allowed though. */
@@ -378,6 +398,8 @@ typedef struct DNAStructMember {
   const char *name;
   int arraylength;
   int pointerlevel;
+  int offset;
+  int size;
 } DNAStructMember;
 
 static int rna_member_cmp(const char *name, const char *oname)
@@ -420,7 +442,8 @@ static int rna_member_cmp(const char *name, const char *oname)
 static int rna_find_sdna_member(SDNA *sdna,
                                 const char *structname,
                                 const char *membername,
-                                DNAStructMember *smember)
+                                DNAStructMember *smember,
+                                int *offset)
 {
   const char *dnaname;
   const short *sp;
@@ -432,7 +455,11 @@ static int rna_find_sdna_member(SDNA *sdna,
   }
   structnr = DNA_struct_find_nr_wrapper(sdna, structname);
 
+  smember->offset = -1;
   if (structnr == -1) {
+    if (offset) {
+      *offset = -1;
+    }
     return 0;
   }
 
@@ -441,12 +468,15 @@ static int rna_find_sdna_member(SDNA *sdna,
   sp += 2;
 
   for (a = 0; a < totmember; a++, sp += 2) {
+    const int size = DNA_elem_size_nr(sdna, sp[0], sp[1]);
     dnaname = sdna->alias.names[sp[1]];
     cmp = rna_member_cmp(dnaname, membername);
 
     if (cmp == 1) {
       smember->type = sdna->alias.types[sp[0]];
       smember->name = dnaname;
+      smember->offset = *offset;
+      smember->size = size;
 
       if (strstr(membername, "[")) {
         smember->arraylength = 0;
@@ -465,25 +495,36 @@ static int rna_find_sdna_member(SDNA *sdna,
     else if (cmp == 2) {
       smember->type = "";
       smember->name = dnaname;
+      smember->offset = *offset;
+      smember->size = size;
       smember->pointerlevel = 0;
       smember->arraylength = 0;
 
       membername = strstr(membername, ".") + strlen(".");
-      rna_find_sdna_member(sdna, sdna->alias.types[sp[0]], membername, smember);
+      rna_find_sdna_member(sdna, sdna->alias.types[sp[0]], membername, smember, offset);
 
       return 1;
     }
     else if (cmp == 3) {
       smember->type = "";
       smember->name = dnaname;
+      smember->offset = *offset;
+      smember->size = size;
       smember->pointerlevel = 0;
       smember->arraylength = 0;
 
+      if (offset) {
+        *offset = -1;
+      }
       membername = strstr(membername, "->") + strlen("->");
-      rna_find_sdna_member(sdna, sdna->alias.types[sp[0]], membername, smember);
+      rna_find_sdna_member(sdna, sdna->alias.types[sp[0]], membername, smember, offset);
 
       return 1;
     }
+
+    if (offset && *offset != -1) {
+      *offset += size;
+    }
   }
 
   return 0;
@@ -2047,7 +2088,8 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop,
     propname = prop->identifier;
   }
 
-  if (!rna_find_sdna_member(DefRNA.sdna, structname, propname, &smember)) {
+  int dnaoffset = 0;
+  if (!rna_find_sdna_member(DefRNA.sdna, structname, propname, &smember, &dnaoffset)) {
     if (DefRNA.silent) {
       return NULL;
     }
@@ -2061,6 +2103,7 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop,
       if (prop->type == PROP_POINTER) {
         dp->dnapointerlevel = 1;
       }
+      dp->dnaoffset = smember.offset;
       return dp;
     }
     else {
@@ -2091,6 +2134,8 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop,
   dp->dnatype = smember.type;
   dp->dnaarraylength = smember.arraylength;
   dp->dnapointerlevel = smember.pointerlevel;
+  dp->dnaoffset = smember.offset;
+  dp->dnasize = smember.size;
 
   return dp;
 }
@@ -2101,6 +2146,7 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop,
                                    int bit)
 {
   PropertyDefRNA *dp;
+  BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop;
   StructRNA *srna = DefRNA.laststruct;
 
   if (!DefRNA.preprocess) {
@@ -2131,6 +2177,57 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop,
     }
 
     dp->booleanbit = bit;
+
+#ifndef RNA_RUNTIME
+    /* Set the default if possible. */
+    if (dp->dnaoffset != -1) {
+      int SDNAnr = DNA_struct_find_nr_wrapper(DefRNA.sdna, dp->dnastructname);
+      if (SDNAnr != -1) {
+        const void *default_data = DNA_default_table[SDNAnr];
+        if (default_data) {
+          default_data = POINTER_OFFSET(default_data, dp->dnaoffset);
+          bool has_default = true;
+          if (prop->totarraylength > 0) {
+            has_default = false;
+            if (debugSRNA_defaults) {
+              fprintf(stderr, "%s default: unsupported boolean array default\n", __func__);
+            }
+          }
+          else {
+            if (STREQ(dp->dnatype, "char")) {
+              bprop->defaultvalue = *(const char *)default_data & bit;
+            }
+            else if (STREQ(dp->dnatype, "short")) {
+              bprop->defaultvalue = *(const short *)default_data & bit;
+            }
+            else if (STREQ(dp->dnatype, "int")) {
+              bprop->defaultvalue = *(const int *)default_data & bit;
+            }
+            else {
+              has_default = false;
+              if (debugSRNA_defaults) {
+                fprintf(
+                    stderr, "%s default: unsupported boolean type (%s)\n", __func__, dp->dnatype);
+              }
+            }
+
+            if (has_default) {
+              if (dp->booleannegative) {
+                bprop->defaultvalue = !bprop->defaultvalue;
+              }
+
+              if (debugSRNA_defaults) {
+                fprintf(stderr, "value=%d, ", bprop->defaultvalue);
+                print_defult_info(dp);
+              }
+            }
+          }
+        }
+      }
+    }
+#else
+    UNUSED_VARS(bprop);
+#endif
   }
 }
 
@@ -2204,6 +2301,96 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
         prop->subtype == PROP_FACTOR) {
       iprop->hardmin = iprop->softmin = 0;
     }
+
+#ifndef RNA_RUNTIME
+    /* Set the default if possible. */
+    if (dp->dnaoffset != -1) {
+      int SDNAnr = DNA_struct_find_nr_wrapper(DefRNA.sdna, dp->dnastructname);
+      if (SDNAnr != -1) {
+        const void *default_data = DNA_default_table[SDNAnr];
+        if (default_data) {
+          default_data = POINTER_OFFSET(default_data, dp->dnaoffset);
+          /* NOTE: Currently doesn't store sign, assume chars are unsigned because
+           * we build with this enabled, otherwise check 'PROP_UNSIGNED'. */
+          bool has_default = true;
+          if (prop->totarraylength > 0) {
+            const void *default_data_end = POINTER_OFFSET(default_data, dp->dnasize);
+            const int size_final = sizeof(int) * prop->totarraylength;
+            if (STREQ(dp->dnatype, "char")) {
+              int *defaultarray = rna_calloc(size_final);
+              for (int i = 0; i < prop->totarraylength && default_data < default_data_end; i++) {
+                defaultarray[i] = *(const char *)default_data;
+                default_data = POINTER_OFFSET(default_data, sizeof(char));
+              }
+              iprop->defaultarray = defaultarray;
+            }
+            else if (STREQ(dp->dnatype, "short")) {
+
+              int *defaultarray = rna_calloc(size_final);
+              for (int i = 0; i < prop->totarraylength && default_data < default_data_end; i++) {
+                defaultarray[i] = (prop->subtype != PROP_UNSIGNED) ? *(const short *)default_data :
+                                                                     *(const ushort *)default_data;
+                default_data = POINTER_OFFSET(default_data, sizeof(short));
+              }
+              iprop->defaultarray = defaultarray;
+            }
+            else if (STREQ(dp->dnatype, "int")) {
+              int *defaultarray = rna_calloc(size_final);
+              memcpy(defaultarray, default_data, MIN2(size_final, dp->dnasize));
+              iprop->defaultarray = defaultarray;
+            }
+            else {
+              has_default = false;
+              if (debugSRNA_defaults) {
+                fprintf(stderr,
+                        "%s default: unsupported int array type (%s)\n",
+                        __func__,
+                        dp->dnatype);
+              }
+            }
+
+            if (has_default) {
+              if (debugSRNA_defaults) {
+                fpr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list