[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18086] branches/blender2.5/blender/source /blender: RNA:

joe joeedh at gmail.com
Sat Dec 27 05:54:40 CET 2008


What's the design rationale of supporting arrays of group properties?  Seems
supporting arrays of id properties in general would be a cleaner solution,
if it's needed. . .
Joe

On Fri, Dec 26, 2008 at 1:38 PM, Brecht Van Lommel <brecht at blender.org>wrote:

> Revision: 18086
>
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18086
> Author:   blendix
> Date:     2008-12-26 21:38:52 +0100 (Fri, 26 Dec 2008)
>
> Log Message:
> -----------
> RNA:
> * Added support for using pointers + collections as operator properties,
>  but with the restriction that they must point to other type derived from
>  ID property groups. The "add" function for these properties will allocate
>  a new ID property group and point to that.
> * Added support for arrays with type IDP_GROUP in ID properties.
> * Fix bug getting/setting float array values.
>
> Example code for collections, note the "OperatorMousePath" type is defined
> in rna_wm.c and has a float[2] property named "loc".
>
>
> Defining the operator property:
>
> prop= RNA_def_property(ot->srna, "path", PROP_COLLECTION, PROP_NONE);
> RNA_def_property_struct_runtime(prop, &RNA_OperatorMousePath);
>
>
> Adding values:
>
> PointerRNA itemptr;
> float loc[2] = {1, 1},
>
> RNA_collection_add(op->ptr, "path", &itemptr);
> RNA_float_set_array(&itemptr, "loc", loc);
>
>
> Iterating:
>
> RNA_BEGIN(op->ptr, itemptr, "path") {
>        float loc[2];
>
>        RNA_float_get_array(&itemptr, "loc", loc);
>        printf("Location: %f %f\n", loc[0], loc[1]);
> }
> RNA_END;
>
> Modified Paths:
> --------------
>    branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c
>    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
>    branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
>    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
>    branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
>    branches/blender2.5/blender/source/blender/makesrna/RNA_types.h
>    branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
>    branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c
>    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
>    branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c
>
>  branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h
>    branches/blender2.5/blender/source/blender/makesrna/intern/rna_wm.c
>
> Modified:
> branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c
> ===================================================================
> --- branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c
>     2008-12-26 20:25:02 UTC (rev 18085)
> +++ branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c
>     2008-12-26 20:38:52 UTC (rev 18086)
> @@ -61,6 +61,34 @@
>
>  /* ----------- Array Type ----------- */
>
> +static void idp_resize_group_array(IDProperty *prop, int newlen, void
> *newarr)
> +{
> +       if(prop->subtype != IDP_GROUP)
> +               return;
> +
> +       if(newlen >= prop->len) {
> +               /* bigger */
> +               IDProperty **array= newarr;
> +               IDPropertyTemplate val;
> +               int a;
> +
> +               for(a=prop->len; a<newlen; a++) {
> +                       val.i = 0; /* silence MSVC warning about
> uninitialized var when debugging */
> +                       array[a]= IDP_New(IDP_GROUP, val, "IDP_ResizeArray
> group");
> +               }
> +       }
> +       else {
> +               /* smaller */
> +               IDProperty **array= prop->data.pointer;
> +               int a;
> +
> +               for(a=newlen; a<prop->len; a++) {
> +                       IDP_FreeProperty(array[a]);
> +                       MEM_freeN(array[a]);
> +               }
> +       }
> +}
> +
>  /*this function works for strings too!*/
>  void IDP_ResizeArray(IDProperty *prop, int newlen)
>  {
> @@ -70,6 +98,7 @@
>        /*first check if the array buffer size has room*/
>        /*if newlen is 200 chars less then totallen, reallocate anyway*/
>        if (newlen <= prop->totallen && prop->totallen - newlen < 200) {
> +               idp_resize_group_array(prop, newlen, newarr);
>                prop->len = newlen;
>                return;
>        }
> @@ -84,11 +113,17 @@
>         */
>        newsize = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;
>
> -       newarr = MEM_callocN(idp_size_table[prop->type]*newsize,
> "idproperty array resized");
> -       /*newlen is bigger*/
> -       if (newlen >= prop->len) memcpy(newarr, prop->data.pointer,
> prop->len*idp_size_table[prop->type]);
> -       /*newlen is smaller*/
> -       else memcpy(newarr, prop->data.pointer,
> newlen*prop->len*idp_size_table[prop->type]);
> +       newarr = MEM_callocN(idp_size_table[prop->subtype]*newsize,
> "idproperty array resized");
> +       if (newlen >= prop->len) {
> +               /* newlen is bigger*/
> +               memcpy(newarr, prop->data.pointer,
> prop->len*idp_size_table[prop->subtype]);
> +               idp_resize_group_array(prop, newlen, newarr);
> +       }
> +       else {
> +               /* newlen is smaller*/
> +               idp_resize_group_array(prop, newlen, newarr);
> +               memcpy(newarr, prop->data.pointer,
> newlen*prop->len*idp_size_table[prop->subtype]);
> +       }
>
>        MEM_freeN(prop->data.pointer);
>        prop->data.pointer = newarr;
> @@ -96,10 +131,12 @@
>        prop->totallen = newsize;
>  }
>
> - void IDP_FreeArray(IDProperty *prop)
> +void IDP_FreeArray(IDProperty *prop)
>  {
> -       if (prop->data.pointer)
> +       if (prop->data.pointer) {
> +               idp_resize_group_array(prop, 0, NULL);
>                MEM_freeN(prop->data.pointer);
> +       }
>  }
>
>
> @@ -120,7 +157,17 @@
>  {
>        IDProperty *newp = idp_generic_copy(prop);
>
> -       if (prop->data.pointer) newp->data.pointer =
> MEM_dupallocN(prop->data.pointer);
> +       if (prop->data.pointer) {
> +               newp->data.pointer = MEM_dupallocN(prop->data.pointer);
> +
> +               if(prop->type == IDP_GROUP) {
> +                       IDProperty **array= newp->data.pointer;
> +                       int a;
> +
> +                       for(a=0; a<prop->len; a++)
> +                               array[a]= IDP_CopyProperty(array[a]);
> +               }
> +       }
>        newp->len = prop->len;
>        newp->subtype = prop->subtype;
>        newp->totallen = prop->totallen;
> @@ -381,11 +428,12 @@
>                case IDP_ARRAY:
>                {
>                        /*for now, we only support float and int and double
> arrays*/
> -                       if (val.array.type == IDP_FLOAT || val.array.type
> == IDP_INT || val.array.type == IDP_DOUBLE) {
> +                       if (val.array.type == IDP_FLOAT || val.array.type
> == IDP_INT || val.array.type == IDP_DOUBLE || val.array.type == IDP_GROUP) {
>                                prop = MEM_callocN(sizeof(IDProperty),
> "IDProperty array");
> -                               prop->len = prop->totallen = val.array.len;
>                                prop->subtype = val.array.type;
>                                prop->data.pointer =
> MEM_callocN(idp_size_table[val.array.type]*val.array.len, "id property
> array");
> +                               idp_resize_group_array(prop, val.array.len,
> prop->data.pointer);
> +                               prop->len = prop->totallen = val.array.len;
>                                break;
>                        } else {
>                                return NULL;
>
> Modified:
> branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
> ===================================================================
> --- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
>     2008-12-26 20:25:02 UTC (rev 18085)
> +++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
>     2008-12-26 20:38:52 UTC (rev 18086)
> @@ -1345,11 +1345,12 @@
>
>  /* ************ READ ID Properties *************** */
>
> -void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void
> *fd);
> -void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, void *fd);
> +void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData
> *fd);
> +void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData
> *fd);
>
> -static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, void
> *fd)
> +static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian,
> FileData *fd)
>  {
> +       IDProperty **array;
>        int i;
>
>        /*since we didn't save the extra buffer, set totallen to len.*/
> @@ -1357,26 +1358,33 @@
>        prop->data.pointer = newdataadr(fd, prop->data.pointer);
>
>        if (switch_endian) {
> -               if (prop->subtype != IDP_DOUBLE) {
> +               if(prop->subtype == IDP_GROUP) {
> +                       test_pointer_array(fd, prop->data.pointer);
> +                       array= prop->data.pointer;
> +
> +                       for(i=0; i<prop->len; i++)
> +                               IDP_DirectLinkProperty(array[i],
> switch_endian, fd);
> +               }
> +               else if(prop->subtype == IDP_DOUBLE) {
>                        for (i=0; i<prop->len; i++) {
> -                               SWITCH_INT(((int*)prop->data.pointer)[i]);
> +
> SWITCH_LONGINT(((double*)prop->data.pointer)[i]);
>                        }
>                } else {
>                        for (i=0; i<prop->len; i++) {
> -
> SWITCH_LONGINT(((double*)prop->data.pointer)[i]);
> +                               SWITCH_INT(((int*)prop->data.pointer)[i]);
>                        }
>                }
>        }
>  }
>
> -static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, void
> *fd)
> +static void IDP_DirectLinkString(IDProperty *prop, int switch_endian,
> FileData *fd)
>  {
>        /*since we didn't save the extra string buffer, set totallen to
> len.*/
>        prop->totallen = prop->len;
>        prop->data.pointer = newdataadr(fd, prop->data.pointer);
>  }
>
> -static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, void
> *fd)
> +static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian,
> FileData *fd)
>  {
>        ListBase *lb = &prop->data.group;
>        IDProperty *loop;
> @@ -1389,7 +1397,7 @@
>        }
>  }
>
> -void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void *fd)
> +void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData
> *fd)
>  {
>        switch (prop->type) {
>                case IDP_GROUP:
> @@ -1423,7 +1431,7 @@
>  }
>
>  /*stub function*/
> -void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, void *fd)
> +void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData
> *fd)
>  {
>  }
>
>
> Modified:
> branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
> ===================================================================
> ---
> branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
>  2008-12-26 20:25:02 UTC (rev 18085)
> +++
> branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
>  2008-12-26 20:38:52 UTC (rev 18086)
> @@ -390,6 +390,14 @@
>        /*REMEMBER to set totalen to len in the linking code!!*/
>        if (prop->data.pointer) {
>                writedata(wd, DATA, MEM_allocN_len(prop->data.pointer),
> prop->data.pointer);
> +
> +               if(prop->type == IDP_GROUP) {
> +                       IDProperty **array= prop->data.pointer;
> +                       int a;
> +
> +                       for(a=0; a<prop->len; a++)
> +                               IDP_WriteProperty(array[a], wd);
> +               }
>        }
>  }
>
>
> Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
> ===================================================================
> --- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
>  2008-12-26 20:25:02 UTC (rev 18085)
> +++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
>  2008-12-26 20:38:52 UTC (rev 18086)
> @@ -50,7 +50,6 @@
>  extern StructRNA RNA_CollisionSensor;
>  extern StructRNA RNA_ColorSequence;
>  extern StructRNA RNA_Constraint;
> -// ... constraint types...
>  extern StructRNA RNA_Controller;
>  extern StructRNA RNA_Curve;
>  extern StructRNA RNA_CurveMap;
> @@ -119,6 +118,7 @@
>  extern StructRNA RNA_NorController;
>  extern StructRNA RNA_Object;
>  extern StructRNA RNA_Operator;
> +extern StructRNA RNA_OperatorMousePath;
>  extern StructRNA RNA_OperatorProperties;
>  extern StructRNA RNA_OrController;
>  extern StructRNA RNA_PackedFile;
> @@ -266,6 +266,11 @@
>  int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop,
> int key, PointerRNA *r_ptr);
>  int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA
> *prop, const char *key, PointerRNA *r_ptr);
>
> +/* to create ID property groups */
> +void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop);
> +void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop,
> PointerRNA *r_ptr);
> +void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop);
> +
>  /* Path
>  *
>  * Experimental method to refer to structs and properties with a string,
> @@ -329,6 +334,25 @@
>  int RNA_string_length(PointerRNA *ptr, const char *name);
>  void RNA_string_set(PointerRNA *ptr, const char *name, const char *value);
>
> +void RNA_pointer_get(PointerRNA *ptr, const char *name, PointerRNA
> *r_value);
> +void RNA_pointer_add(PointerRNA *ptr, const char *name);
> +
> +void RNA_collection_begin(PointerRNA *ptr, const char *name,
> CollectionPropertyIterator *iter);
> +int RNA_collection_length(PointerRNA *ptr, const char *name);
> +void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA
> *r_value);
> +void RNA_collection_clear(PointerRNA *ptr, const char *name);
> +
> +#define RNA_BEGIN(sptr, itemptr, propname) \
> +       { \
> +               CollectionPropertyIterator rna_macro_iter; \
> +               for(RNA_collection_begin(sptr, propname, &rna_macro_iter);
> rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) { \
> +                       PointerRNA itemptr= rna_macro_iter.ptr;
> +
> +#define RNA_END \
> +               } \
> +               RNA_property_collection_end(&rna_macro_iter); \
> +       }
> +
>  /* check if the idproperty exists, for operators */
>  int RNA_property_is_set(PointerRNA *ptr, const char *name);
>
>
> Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
> ===================================================================
> --- branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
>  2008-12-26 20:25:02 UTC (rev 18085)
> +++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h
>  2008-12-26 20:38:52 UTC (rev 18086)
> @@ -69,6 +69,7 @@
>  void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem
> *item);
>  void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength);
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.blender.org/pipermail/bf-committers/attachments/20081226/715ec02c/attachment-0001.htm 


More information about the Bf-committers mailing list