Fix ugly recursive pattern in RNA PointCache data layout.
authorBastien Montagne <montagne29@wanadoo.fr>
Sun, 18 Mar 2018 14:37:23 +0000 (15:37 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Sun, 18 Mar 2018 14:37:23 +0000 (15:37 +0100)
PointCache was having a collection of items of PointCache type, having a
collection of items of PointCache type, having...

Nuff said.

For now, chose the 'ugly' way to fix it, that is, the one that changes
nothing to API and scripts using it: we define another 'PointCacheItem'
RNA type for items of our point cache collection, which has exact same
interface as PointCache except for the collection.

This is doomed to be rewritten at some point anyway, not worth spending
time trying to define a really correct data layout for now.

source/blender/makesrna/intern/rna_dynamicpaint.c
source/blender/makesrna/intern/rna_object_force.c
source/blender/makesrna/intern/rna_rigidbody.c
source/blender/makesrna/intern/rna_smoke.c

index 6d93c56..94fda70 100644 (file)
@@ -722,11 +722,11 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_WAVE_OPEN_BORDERS);
        RNA_def_property_ui_text(prop, "Open Borders", "Pass waves through mesh edges");
 
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_WAVE_OPEN_BORDERS);
        RNA_def_property_ui_text(prop, "Open Borders", "Pass waves through mesh edges");
 
-       
        /* cache */
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
        /* cache */
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
+       RNA_def_property_struct_type(prop, "PointCache");
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        /* is cache used */
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        /* is cache used */
index b3808e4..c9c3372 100644 (file)
@@ -768,31 +768,8 @@ static const EnumPropertyItem *rna_Effector_shape_itemf(bContext *UNUSED(C), Poi
 
 #else
 
 
 #else
 
-/* ptcache.point_caches */
-static void rna_def_ptcache_point_caches(BlenderRNA *brna, PropertyRNA *cprop)
+static void rna_def_pointcache_common(StructRNA *srna)
 {
 {
-       StructRNA *srna;
-       PropertyRNA *prop;
-
-       /* FunctionRNA *func; */
-       /* PropertyRNA *parm; */
-
-       RNA_def_property_srna(cprop, "PointCaches");
-       srna = RNA_def_struct(brna, "PointCaches", NULL);
-       RNA_def_struct_sdna(srna, "PointCache");
-       RNA_def_struct_ui_text(srna, "Point Caches", "Collection of point caches");
-
-       prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
-       RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get",
-                                  "rna_Cache_active_point_cache_index_set",
-                                  "rna_Cache_active_point_cache_index_range");
-       RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
-       RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
-}
-
-static void rna_def_pointcache(BlenderRNA *brna)
-{
-       StructRNA *srna;
        PropertyRNA *prop;
 
        static const EnumPropertyItem point_cache_compress_items[] = {
        PropertyRNA *prop;
 
        static const EnumPropertyItem point_cache_compress_items[] = {
@@ -802,16 +779,12 @@ static void rna_def_pointcache(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}
        };
 
                {0, NULL, 0, NULL, NULL}
        };
 
-       srna = RNA_def_struct(brna, "PointCache", NULL);
-       RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations");
-       RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
-       
        prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "startframe");
        RNA_def_property_range(prop, -MAXFRAME, MAXFRAME);
        RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
        RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts");
        prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "startframe");
        RNA_def_property_range(prop, -MAXFRAME, MAXFRAME);
        RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
        RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts");
-       
+
        prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "endframe");
        RNA_def_property_range(prop, 1, MAXFRAME);
        prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "endframe");
        RNA_def_property_range(prop, 1, MAXFRAME);
@@ -892,13 +865,59 @@ static void rna_def_pointcache(BlenderRNA *brna)
                                 "Use this file's path for the disk cache when library linked into another file "
                                 "(for local bakes per scene file, disable this option)");
        RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
                                 "Use this file's path for the disk cache when library linked into another file "
                                 "(for local bakes per scene file, disable this option)");
        RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+}
+
+static void rna_def_ptcache_point_caches(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       /* FunctionRNA *func; */
+       /* PropertyRNA *parm; */
+
+       RNA_def_property_srna(cprop, "PointCaches");
+       srna = RNA_def_struct(brna, "PointCaches", NULL);
+       RNA_def_struct_sdna(srna, "PointCache");
+       RNA_def_struct_ui_text(srna, "Point Caches", "Collection of point caches");
+
+       prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+       RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get",
+                                  "rna_Cache_active_point_cache_index_set",
+                                  "rna_Cache_active_point_cache_index_range");
+       RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
+       RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
+
+       /* And define another RNA type for those collection items. */
+       srna = RNA_def_struct(brna, "PointCacheItem", NULL);
+       RNA_def_struct_sdna(srna, "PointCache");
+       RNA_def_struct_ui_text(srna, "Point Cache", "point cache for physics simulations");
+       RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
+
+       rna_def_pointcache_common(srna);
+}
+
+static void rna_def_pointcache_active(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       srna = RNA_def_struct(brna, "PointCache", NULL);
+       RNA_def_struct_ui_text(srna, "Active Point Cache", "Active point cache for physics simulations");
+       RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
+
+       rna_def_pointcache_common(srna);
 
 
+       /* This first-level RNA pointer also has list of all caches from owning ID.
+        * Those caches items have exact same content as 'active' one, except for that collection,
+        * to prevent ugly recursive layout pattern.
+        * Note: This shall probably be redone from scratch in a proper way at some poitn, but for now that will do,
+        *       and shall not break anything in the API. */
        prop = RNA_def_property(srna, "point_caches", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next",
                                          "rna_iterator_listbase_end", "rna_iterator_listbase_get",
                                          NULL, NULL, NULL, NULL);
        prop = RNA_def_property(srna, "point_caches", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next",
                                          "rna_iterator_listbase_end", "rna_iterator_listbase_get",
                                          NULL, NULL, NULL, NULL);
-       RNA_def_property_struct_type(prop, "PointCache");
-       RNA_def_property_ui_text(prop, "Point Cache List", "Point cache list");
+       RNA_def_property_struct_type(prop, "PointCacheItem");
+       RNA_def_property_ui_text(prop, "Point Cache List", "");
        rna_def_ptcache_point_caches(brna, prop);
 }
 
        rna_def_ptcache_point_caches(brna, prop);
 }
 
@@ -1878,7 +1897,7 @@ static void rna_def_softbody(BlenderRNA *brna)
 
 void RNA_def_object_force(BlenderRNA *brna)
 {
 
 void RNA_def_object_force(BlenderRNA *brna)
 {
-       rna_def_pointcache(brna);
+       rna_def_pointcache_active(brna);
        rna_def_collision(brna);
        rna_def_effector_weight(brna);
        rna_def_field(brna);
        rna_def_collision(brna);
        rna_def_effector_weight(brna);
        rna_def_field(brna);
index 335b7d3..188200e 100644 (file)
@@ -803,6 +803,7 @@ static void rna_def_rigidbody_world(BlenderRNA *brna)
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
+       RNA_def_property_struct_type(prop, "PointCache");
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        /* effector weights */
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        /* effector weights */
index 54daba7..3bfe1fb 100644 (file)
@@ -622,6 +622,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
        prop = RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
        RNA_def_property_flag(prop, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
+       RNA_def_property_struct_type(prop, "PointCache");
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        prop = RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_ui_text(prop, "Point Cache", "");
 
        prop = RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);