2008-10-31 23:50:02 +00:00
/**
* $ Id $
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* Contributor ( s ) : Blender Foundation ( 2008 ) .
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
# include <stdlib.h>
# include <string.h>
# include "MEM_guardedalloc.h"
2009-01-01 15:52:51 +00:00
# include "DNA_ID.h"
# include "DNA_windowmanager_types.h"
2008-11-11 18:28:00 +00:00
# include "BLI_blenlib.h"
# include "BLI_dynstr.h"
2009-06-19 23:05:21 +00:00
# include "BLI_ghash.h"
2008-11-11 18:28:00 +00:00
2009-06-18 19:48:55 +00:00
# include "BKE_context.h"
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
# include "BKE_idprop.h"
2009-06-18 19:48:55 +00:00
# include "BKE_report.h"
2008-11-21 19:14:38 +00:00
# include "BKE_utildefines.h"
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
2009-01-01 15:52:51 +00:00
# include "WM_api.h"
2008-11-17 18:44:06 +00:00
2008-10-31 23:50:02 +00:00
# include "RNA_access.h"
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
# include "RNA_define.h"
2008-10-31 23:50:02 +00:00
# include "RNA_types.h"
2008-11-07 02:58:25 +00:00
# include "rna_internal.h"
2008-10-31 23:50:02 +00:00
2009-06-19 23:05:21 +00:00
/* Init/Exit */
void RNA_init ( )
{
StructRNA * srna ;
PropertyRNA * prop ;
for ( srna = BLENDER_RNA . structs . first ; srna ; srna = srna - > cont . next ) {
if ( ! srna - > cont . prophash ) {
srna - > cont . prophash = BLI_ghash_new ( BLI_ghashutil_strhash , BLI_ghashutil_strcmp ) ;
for ( prop = srna - > cont . properties . first ; prop ; prop = prop - > next )
if ( ! ( prop - > flag & PROP_BUILTIN ) )
BLI_ghash_insert ( srna - > cont . prophash , ( void * ) prop - > identifier , prop ) ;
}
}
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
void RNA_exit ( )
{
2009-06-19 23:05:21 +00:00
StructRNA * srna ;
for ( srna = BLENDER_RNA . structs . first ; srna ; srna = srna - > cont . next ) {
if ( srna - > cont . prophash ) {
BLI_ghash_free ( srna - > cont . prophash , NULL , NULL ) ;
srna - > cont . prophash = NULL ;
}
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
RNA_free ( & BLENDER_RNA ) ;
}
2008-11-07 02:58:25 +00:00
/* Pointer */
2009-06-16 00:52:21 +00:00
PointerRNA PointerRNA_NULL = { { 0 } , 0 , 0 } ;
2008-11-24 15:51:55 +00:00
void RNA_main_pointer_create ( struct Main * main , PointerRNA * r_ptr )
2008-10-31 23:50:02 +00:00
{
2008-11-24 15:51:55 +00:00
r_ptr - > id . data = NULL ;
r_ptr - > type = & RNA_Main ;
r_ptr - > data = main ;
}
2009-01-08 15:33:34 +00:00
void RNA_id_pointer_create ( ID * id , PointerRNA * r_ptr )
2008-11-24 15:51:55 +00:00
{
2009-01-08 15:33:34 +00:00
PointerRNA tmp ;
2009-05-19 17:13:33 +00:00
StructRNA * type , * idtype = NULL ;
2009-01-08 15:33:34 +00:00
if ( id ) {
memset ( & tmp , 0 , sizeof ( tmp ) ) ;
tmp . data = id ;
idtype = rna_ID_refine ( & tmp ) ;
2009-05-11 02:07:40 +00:00
2009-05-19 17:13:33 +00:00
while ( idtype - > refine ) {
type = idtype - > refine ( & tmp ) ;
if ( type = = idtype )
break ;
else
idtype = type ;
}
2009-01-08 15:33:34 +00:00
}
2009-05-11 02:07:40 +00:00
2008-11-24 15:51:55 +00:00
r_ptr - > id . data = id ;
r_ptr - > type = idtype ;
r_ptr - > data = id ;
}
2009-01-08 15:33:34 +00:00
void RNA_pointer_create ( ID * id , StructRNA * type , void * data , PointerRNA * r_ptr )
2008-11-24 15:51:55 +00:00
{
2009-01-08 15:33:34 +00:00
PointerRNA tmp ;
StructRNA * idtype = NULL ;
if ( id ) {
memset ( & tmp , 0 , sizeof ( tmp ) ) ;
tmp . data = id ;
idtype = rna_ID_refine ( & tmp ) ;
}
2008-11-24 15:51:55 +00:00
r_ptr - > id . data = id ;
r_ptr - > type = type ;
r_ptr - > data = data ;
2009-06-02 23:53:40 +00:00
if ( data ) {
while ( r_ptr - > type & & r_ptr - > type - > refine ) {
StructRNA * rtype = r_ptr - > type - > refine ( r_ptr ) ;
if ( rtype = = r_ptr - > type )
break ;
else
r_ptr - > type = rtype ;
}
}
2008-10-31 23:50:02 +00:00
}
2008-12-16 20:03:28 +00:00
static void rna_pointer_inherit_id ( StructRNA * type , PointerRNA * parent , PointerRNA * ptr )
2008-11-07 02:58:25 +00:00
{
2008-12-16 20:03:28 +00:00
if ( type & & type - > flag & STRUCT_ID ) {
2008-11-07 02:58:25 +00:00
ptr - > id . data = ptr - > data ;
}
else {
ptr - > id . data = parent - > id . data ;
}
}
2008-12-15 13:46:50 +00:00
void RNA_blender_rna_pointer_create ( PointerRNA * r_ptr )
{
r_ptr - > id . data = NULL ;
r_ptr - > type = & RNA_BlenderRNA ;
r_ptr - > data = & BLENDER_RNA ;
}
2009-03-19 19:03:38 +00:00
PointerRNA rna_pointer_inherit_refine ( PointerRNA * ptr , StructRNA * type , void * data )
{
PointerRNA result ;
if ( data ) {
result . data = data ;
result . type = type ;
rna_pointer_inherit_id ( type , ptr , & result ) ;
2009-05-19 17:13:33 +00:00
while ( result . type - > refine ) {
type = result . type - > refine ( & result ) ;
if ( type = = result . type )
break ;
else
result . type = type ;
}
2009-03-19 19:03:38 +00:00
}
else
memset ( & result , 0 , sizeof ( result ) ) ;
return result ;
}
2008-11-17 18:44:06 +00:00
/* ID Properties */
2009-05-20 09:52:02 +00:00
IDProperty * RNA_struct_idproperties ( PointerRNA * ptr , int create )
{
2009-05-20 17:18:47 +00:00
StructRNA * type = ptr - > type ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
2009-05-20 17:18:47 +00:00
if ( type & & type - > idproperties )
return type - > idproperties ( ptr , create ) ;
2009-05-20 09:52:02 +00:00
return NULL ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
static IDProperty * rna_idproperty_find ( PointerRNA * ptr , const char * name )
{
2009-05-20 09:52:02 +00:00
IDProperty * group = RNA_struct_idproperties ( ptr , 0 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * idprop ;
if ( group ) {
for ( idprop = group - > data . group . first ; idprop ; idprop = idprop - > next )
if ( strcmp ( idprop - > name , name ) = = 0 )
return idprop ;
}
return NULL ;
}
2009-09-09 19:40:46 +00:00
static int rna_ensure_property_array_length ( PointerRNA * ptr , PropertyRNA * prop )
{
if ( prop - > magic = = RNA_MAGIC ) {
int arraylen [ RNA_MAX_ARRAY_DIMENSION ] ;
return ( prop - > getlength ) ? prop - > getlength ( ptr , arraylen ) : prop - > totarraylength ;
}
else {
IDProperty * idprop = ( IDProperty * ) prop ;
if ( idprop - > type = = IDP_ARRAY )
return idprop - > len ;
else
return 0 ;
}
}
2009-09-15 10:01:20 +00:00
static int rna_ensure_property_array_check ( PointerRNA * ptr , PropertyRNA * prop )
{
if ( prop - > magic = = RNA_MAGIC ) {
return ( prop - > getlength | | prop - > totarraylength ) ? 1 : 0 ;
}
else {
IDProperty * idprop = ( IDProperty * ) prop ;
return idprop - > type = = IDP_ARRAY ? 1 : 0 ;
}
}
2009-09-09 19:40:46 +00:00
static void rna_ensure_property_multi_array_length ( PointerRNA * ptr , PropertyRNA * prop , int length [ ] )
{
if ( prop - > magic = = RNA_MAGIC ) {
if ( prop - > getlength )
prop - > getlength ( ptr , length ) ;
else
memcpy ( length , prop - > arraylength , prop - > arraydimension * sizeof ( int ) ) ;
}
else {
IDProperty * idprop = ( IDProperty * ) prop ;
if ( idprop - > type = = IDP_ARRAY )
length [ 0 ] = idprop - > len ;
else
length [ 0 ] = 0 ;
}
}
static int rna_idproperty_verify_valid ( PointerRNA * ptr , PropertyRNA * prop , IDProperty * idprop )
2008-11-21 19:14:38 +00:00
{
/* this verifies if the idproperty actually matches the property
* description and otherwise removes it . this is to ensure that
* rna property access is type safe , e . g . if you defined the rna
* to have a certain array length you can count on that staying so */
switch ( idprop - > type ) {
2008-12-31 13:16:37 +00:00
case IDP_IDPARRAY :
if ( prop - > type ! = PROP_COLLECTION )
return 0 ;
break ;
2008-11-21 19:14:38 +00:00
case IDP_ARRAY :
2009-09-09 19:40:46 +00:00
if ( rna_ensure_property_array_length ( ptr , prop ) ! = idprop - > len )
2008-11-21 19:14:38 +00:00
return 0 ;
if ( idprop - > subtype = = IDP_FLOAT & & prop - > type ! = PROP_FLOAT )
return 0 ;
if ( idprop - > subtype = = IDP_INT & & ! ELEM3 ( prop - > type , PROP_BOOLEAN , PROP_INT , PROP_ENUM ) )
return 0 ;
break ;
case IDP_INT :
if ( ! ELEM3 ( prop - > type , PROP_BOOLEAN , PROP_INT , PROP_ENUM ) )
return 0 ;
break ;
case IDP_FLOAT :
case IDP_DOUBLE :
if ( prop - > type ! = PROP_FLOAT )
return 0 ;
break ;
case IDP_STRING :
if ( prop - > type ! = PROP_STRING )
return 0 ;
break ;
case IDP_GROUP :
if ( prop - > type ! = PROP_POINTER )
return 0 ;
break ;
default :
return 0 ;
}
return 1 ;
}
2009-04-19 13:37:59 +00:00
static PropertyRNA * typemap [ IDP_NUMTYPES ] =
{ ( PropertyRNA * ) & rna_IDProperty_string ,
( PropertyRNA * ) & rna_IDProperty_int ,
( PropertyRNA * ) & rna_IDProperty_float ,
NULL , NULL , NULL ,
( PropertyRNA * ) & rna_IDProperty_group , NULL ,
( PropertyRNA * ) & rna_IDProperty_double } ;
static PropertyRNA * arraytypemap [ IDP_NUMTYPES ] =
{ NULL , ( PropertyRNA * ) & rna_IDProperty_int_array ,
( PropertyRNA * ) & rna_IDProperty_float_array ,
NULL , NULL , NULL ,
( PropertyRNA * ) & rna_IDProperty_collection , NULL ,
( PropertyRNA * ) & rna_IDProperty_double_array } ;
2008-11-17 18:44:06 +00:00
IDProperty * rna_idproperty_check ( PropertyRNA * * prop , PointerRNA * ptr )
{
/* This is quite a hack, but avoids some complexity in the API. we
* pass IDProperty structs as PropertyRNA pointers to the outside .
* We store some bytes in PropertyRNA structs that allows us to
* distinguish it from IDProperty structs . If it is an ID property ,
* we look up an IDP PropertyRNA based on the type , and set the data
* pointer to the IDProperty . */
if ( ( * prop ) - > magic = = RNA_MAGIC ) {
2008-11-21 19:14:38 +00:00
if ( ( * prop ) - > flag & PROP_IDPROPERTY ) {
IDProperty * idprop = rna_idproperty_find ( ptr , ( * prop ) - > identifier ) ;
2009-09-09 19:40:46 +00:00
if ( idprop & & ! rna_idproperty_verify_valid ( ptr , * prop , idprop ) ) {
2009-05-20 09:52:02 +00:00
IDProperty * group = RNA_struct_idproperties ( ptr , 0 ) ;
2008-11-21 19:14:38 +00:00
IDP_RemFromGroup ( group , idprop ) ;
IDP_FreeProperty ( idprop ) ;
MEM_freeN ( idprop ) ;
return NULL ;
}
return idprop ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
return NULL ;
2008-11-17 18:44:06 +00:00
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
{
IDProperty * idprop = ( IDProperty * ) ( * prop ) ;
2008-11-17 18:44:06 +00:00
if ( idprop - > type = = IDP_ARRAY )
* prop = arraytypemap [ ( int ) ( idprop - > subtype ) ] ;
else
* prop = typemap [ ( int ) ( idprop - > type ) ] ;
return idprop ;
}
}
2009-09-09 19:40:46 +00:00
static PropertyRNA * rna_ensure_property ( PropertyRNA * prop )
2009-04-19 13:37:59 +00:00
{
/* the quick version if we don't need the idproperty */
if ( prop - > magic = = RNA_MAGIC )
return prop ;
{
IDProperty * idprop = ( IDProperty * ) prop ;
if ( idprop - > type = = IDP_ARRAY )
return arraytypemap [ ( int ) ( idprop - > subtype ) ] ;
else
return typemap [ ( int ) ( idprop - > type ) ] ;
}
}
2009-09-09 19:40:46 +00:00
static const char * rna_ensure_property_identifier ( PropertyRNA * prop )
2009-04-19 13:37:59 +00:00
{
if ( prop - > magic = = RNA_MAGIC )
return prop - > identifier ;
else
return ( ( IDProperty * ) prop ) - > name ;
}
2009-09-09 19:40:46 +00:00
static const char * rna_ensure_property_name ( PropertyRNA * prop )
2009-04-19 13:37:59 +00:00
{
if ( prop - > magic = = RNA_MAGIC )
return prop - > name ;
else
return ( ( IDProperty * ) prop ) - > name ;
}
2008-11-14 14:34:19 +00:00
/* Structs */
2009-04-19 13:37:59 +00:00
const char * RNA_struct_identifier ( StructRNA * type )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return type - > identifier ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
const char * RNA_struct_ui_name ( StructRNA * type )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return type - > name ;
2008-11-14 14:34:19 +00:00
}
2009-06-03 23:16:51 +00:00
int RNA_struct_ui_icon ( StructRNA * type )
{
if ( type )
return type - > icon ;
else
return ICON_DOT ;
}
2009-04-19 13:37:59 +00:00
const char * RNA_struct_ui_description ( StructRNA * type )
2008-12-19 04:06:24 +00:00
{
2009-04-19 13:37:59 +00:00
return type - > description ;
2008-12-19 04:06:24 +00:00
}
2009-04-19 13:37:59 +00:00
PropertyRNA * RNA_struct_name_property ( StructRNA * type )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return type - > nameproperty ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
PropertyRNA * RNA_struct_iterator_property ( StructRNA * type )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return type - > iteratorproperty ;
2008-11-14 14:34:19 +00:00
}
2009-07-10 04:25:49 +00:00
StructRNA * RNA_struct_base ( StructRNA * type )
{
return type - > base ;
}
2009-04-19 13:37:59 +00:00
int RNA_struct_is_ID ( StructRNA * type )
2008-11-29 15:43:53 +00:00
{
2009-04-19 13:37:59 +00:00
return ( type - > flag & STRUCT_ID ) ! = 0 ;
2008-11-29 15:43:53 +00:00
}
2009-04-19 13:37:59 +00:00
int RNA_struct_is_a ( StructRNA * type , StructRNA * srna )
2009-03-14 23:17:55 +00:00
{
2009-04-19 13:37:59 +00:00
StructRNA * base ;
if ( ! type )
return 0 ;
2009-03-14 23:17:55 +00:00
/* ptr->type is always maximally refined */
2009-04-19 13:37:59 +00:00
for ( base = type ; base ; base = base - > base )
if ( base = = srna )
2009-03-14 23:17:55 +00:00
return 1 ;
return 0 ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
PropertyRNA * RNA_struct_find_property ( PointerRNA * ptr , const char * identifier )
{
2009-06-19 23:05:21 +00:00
PropertyRNA * iterprop = RNA_struct_iterator_property ( ptr - > type ) ;
PointerRNA propptr ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
2009-06-19 23:05:21 +00:00
if ( RNA_property_collection_lookup_string ( ptr , iterprop , identifier , & propptr ) )
return propptr . data ;
return NULL ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-05-11 05:18:49 +00:00
/* Find the property which uses the given nested struct */
PropertyRNA * RNA_struct_find_nested ( PointerRNA * ptr , StructRNA * srna )
{
2009-06-24 21:27:10 +00:00
PropertyRNA * prop = NULL ;
2009-05-11 05:18:49 +00:00
2009-06-24 21:27:10 +00:00
RNA_STRUCT_BEGIN ( ptr , iprop ) {
2009-05-11 05:18:49 +00:00
/* This assumes that there can only be one user of this nested struct */
2009-06-24 21:27:10 +00:00
if ( RNA_property_pointer_type ( ptr , iprop ) = = srna ) {
prop = iprop ;
2009-05-11 05:18:49 +00:00
break ;
}
}
2009-06-24 21:27:10 +00:00
RNA_PROP_END ;
2009-05-11 05:18:49 +00:00
return prop ;
}
2008-12-31 13:16:37 +00:00
const struct ListBase * RNA_struct_defined_properties ( StructRNA * srna )
{
2009-04-07 00:49:39 +00:00
return & srna - > cont . properties ;
}
FunctionRNA * RNA_struct_find_function ( PointerRNA * ptr , const char * identifier )
{
PointerRNA tptr ;
PropertyRNA * iterprop ;
FunctionRNA * func ;
RNA_pointer_create ( NULL , & RNA_Struct , ptr - > type , & tptr ) ;
iterprop = RNA_struct_find_property ( & tptr , " functions " ) ;
func = NULL ;
2009-06-24 21:27:10 +00:00
RNA_PROP_BEGIN ( & tptr , funcptr , iterprop ) {
if ( strcmp ( identifier , RNA_function_identifier ( funcptr . data ) ) = = 0 ) {
func = funcptr . data ;
2009-04-07 00:49:39 +00:00
break ;
}
}
2009-06-24 21:27:10 +00:00
RNA_PROP_END ;
2009-04-07 00:49:39 +00:00
return func ;
}
const struct ListBase * RNA_struct_defined_functions ( StructRNA * srna )
{
return & srna - > functions ;
}
2009-04-19 13:37:59 +00:00
StructRegisterFunc RNA_struct_register ( StructRNA * type )
{
return type - > reg ;
}
StructUnregisterFunc RNA_struct_unregister ( StructRNA * type )
{
do {
if ( type - > unreg )
return type - > unreg ;
} while ( ( type = type - > base ) ) ;
return NULL ;
}
2009-04-07 00:49:39 +00:00
void * RNA_struct_py_type_get ( StructRNA * srna )
{
return srna - > py_type ;
}
void RNA_struct_py_type_set ( StructRNA * srna , void * py_type )
{
srna - > py_type = py_type ;
2008-12-31 13:16:37 +00:00
}
2009-04-19 13:37:59 +00:00
void * RNA_struct_blender_type_get ( StructRNA * srna )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return srna - > blender_type ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
void RNA_struct_blender_type_set ( StructRNA * srna , void * blender_type )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
srna - > blender_type = blender_type ;
2008-11-14 14:34:19 +00:00
}
2009-06-24 14:03:55 +00:00
char * RNA_struct_name_get_alloc ( PointerRNA * ptr , char * fixedbuf , int fixedlen )
{
PropertyRNA * nameprop ;
if ( ptr - > data & & ( nameprop = RNA_struct_name_property ( ptr - > type ) ) )
return RNA_property_string_get_alloc ( ptr , nameprop , fixedbuf , fixedlen ) ;
return NULL ;
}
2009-04-19 13:37:59 +00:00
/* Property Information */
2008-11-17 18:44:06 +00:00
2009-04-19 13:37:59 +00:00
const char * RNA_property_identifier ( PropertyRNA * prop )
{
return rna_ensure_property_identifier ( prop ) ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
PropertyType RNA_property_type ( PropertyRNA * prop )
2009-04-11 01:43:50 +00:00
{
2009-04-19 13:37:59 +00:00
return rna_ensure_property ( prop ) - > type ;
}
2009-04-11 01:43:50 +00:00
2009-04-19 13:37:59 +00:00
PropertySubType RNA_property_subtype ( PropertyRNA * prop )
{
return rna_ensure_property ( prop ) - > subtype ;
2009-04-11 01:43:50 +00:00
}
RNA: subtypes and units
* Reviewed subtypes, making them more specific and adding new ones.
* Subtypes now have an associated type of units (length, area, volume,
mass, rotation, time, velocity, acceleration). These are not used
yet anywhere.
* Centralized code that decides the name of array items based on
subtype (XYZ, RGB), was copied in 3 places.
* RNA_def_float etc functions still need to be update, will do this
later together with another change.
2009-08-10 21:31:05 +00:00
PropertyUnit RNA_property_unit ( PropertyRNA * prop )
{
return RNA_SUBTYPE_UNIT ( rna_ensure_property ( prop ) - > subtype ) ;
}
2009-04-19 13:37:59 +00:00
int RNA_property_flag ( PropertyRNA * prop )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return rna_ensure_property ( prop ) - > flag ;
}
2008-11-17 18:44:06 +00:00
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
int RNA_property_array_length ( PointerRNA * ptr , PropertyRNA * prop )
2009-04-19 13:37:59 +00:00
{
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return rna_ensure_property_array_length ( ptr , prop ) ;
}
2009-09-15 10:01:20 +00:00
int RNA_property_array_check ( PointerRNA * ptr , PropertyRNA * prop )
{
return rna_ensure_property_array_check ( ptr , prop ) ;
}
2009-09-09 19:40:46 +00:00
/* used by BPY to make an array from the python object */
int RNA_property_array_dimension ( PointerRNA * ptr , PropertyRNA * prop , int length [ ] )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2009-09-09 19:40:46 +00:00
PropertyRNA * rprop = rna_ensure_property ( prop ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2009-09-09 19:40:46 +00:00
if ( length & & rprop - > arraydimension > 1 )
rna_ensure_property_multi_array_length ( ptr , prop , length ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2009-09-09 19:40:46 +00:00
return rprop - > arraydimension ;
2008-11-14 14:34:19 +00:00
}
2009-09-06 15:13:57 +00:00
/* Return the size of Nth dimension. */
2009-09-09 19:40:46 +00:00
int RNA_property_multi_array_length ( PointerRNA * ptr , PropertyRNA * prop , int dim )
2009-09-06 15:13:57 +00:00
{
2009-09-09 19:40:46 +00:00
int len [ RNA_MAX_ARRAY_DIMENSION ] ;
2009-09-06 15:13:57 +00:00
2009-09-09 19:40:46 +00:00
rna_ensure_property_multi_array_length ( ptr , prop , len ) ;
2009-09-06 15:13:57 +00:00
2009-09-09 19:40:46 +00:00
return len [ dim ] ;
2009-09-06 15:13:57 +00:00
}
RNA: subtypes and units
* Reviewed subtypes, making them more specific and adding new ones.
* Subtypes now have an associated type of units (length, area, volume,
mass, rotation, time, velocity, acceleration). These are not used
yet anywhere.
* Centralized code that decides the name of array items based on
subtype (XYZ, RGB), was copied in 3 places.
* RNA_def_float etc functions still need to be update, will do this
later together with another change.
2009-08-10 21:31:05 +00:00
char RNA_property_array_item_char ( PropertyRNA * prop , int index )
{
const char * vectoritem = " XYZW " ;
const char * quatitem = " WXYZ " ;
const char * coloritem = " RGBA " ;
PropertySubType subtype = rna_ensure_property ( prop ) - > subtype ;
/* get string to use for array index */
2009-09-28 10:19:20 +00:00
if ( ( index < 4 ) & & ELEM ( subtype , PROP_QUATERNION , PROP_AXISANGLE ) )
RNA: subtypes and units
* Reviewed subtypes, making them more specific and adding new ones.
* Subtypes now have an associated type of units (length, area, volume,
mass, rotation, time, velocity, acceleration). These are not used
yet anywhere.
* Centralized code that decides the name of array items based on
subtype (XYZ, RGB), was copied in 3 places.
* RNA_def_float etc functions still need to be update, will do this
later together with another change.
2009-08-10 21:31:05 +00:00
return quatitem [ index ] ;
else if ( ( index < 4 ) & & ELEM6 ( subtype , PROP_TRANSLATION , PROP_DIRECTION , PROP_XYZ , PROP_EULER , PROP_VELOCITY , PROP_ACCELERATION ) )
return vectoritem [ index ] ;
else if ( ( index < 4 ) & & ELEM ( subtype , PROP_COLOR , PROP_RGB ) )
return coloritem [ index ] ;
else
return ' \0 ' ;
}
2008-11-24 15:51:55 +00:00
void RNA_property_int_range ( PointerRNA * ptr , PropertyRNA * prop , int * hardmin , int * hardmax )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-14 14:34:19 +00:00
2008-11-24 12:12:24 +00:00
if ( iprop - > range ) {
iprop - > range ( ptr , hardmin , hardmax ) ;
}
else {
* hardmin = iprop - > hardmin ;
* hardmax = iprop - > hardmax ;
}
2008-11-14 14:34:19 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_int_ui_range ( PointerRNA * ptr , PropertyRNA * prop , int * softmin , int * softmax , int * step )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-24 12:12:24 +00:00
int hardmin , hardmax ;
2008-11-17 18:44:06 +00:00
2008-11-24 12:12:24 +00:00
if ( iprop - > range ) {
iprop - > range ( ptr , & hardmin , & hardmax ) ;
* softmin = MAX2 ( iprop - > softmin , hardmin ) ;
* softmax = MIN2 ( iprop - > softmax , hardmax ) ;
}
else {
* softmin = iprop - > softmin ;
* softmax = iprop - > softmax ;
}
2008-11-14 14:34:19 +00:00
* step = iprop - > step ;
}
2008-11-24 15:51:55 +00:00
void RNA_property_float_range ( PointerRNA * ptr , PropertyRNA * prop , float * hardmin , float * hardmax )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-14 14:34:19 +00:00
2008-11-24 12:12:24 +00:00
if ( fprop - > range ) {
fprop - > range ( ptr , hardmin , hardmax ) ;
}
else {
* hardmin = fprop - > hardmin ;
* hardmax = fprop - > hardmax ;
}
2008-11-14 14:34:19 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_float_ui_range ( PointerRNA * ptr , PropertyRNA * prop , float * softmin , float * softmax , float * step , float * precision )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-24 12:12:24 +00:00
float hardmin , hardmax ;
2008-11-17 18:44:06 +00:00
2008-11-24 12:12:24 +00:00
if ( fprop - > range ) {
fprop - > range ( ptr , & hardmin , & hardmax ) ;
* softmin = MAX2 ( fprop - > softmin , hardmin ) ;
* softmax = MIN2 ( fprop - > softmax , hardmax ) ;
}
else {
* softmin = fprop - > softmin ;
* softmax = fprop - > softmax ;
}
2008-11-14 14:34:19 +00:00
* step = fprop - > step ;
2008-12-26 02:06:54 +00:00
* precision = ( float ) fprop - > precision ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
int RNA_property_string_maxlength ( PropertyRNA * prop )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
StringPropertyRNA * sprop = ( StringPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-14 14:34:19 +00:00
return sprop - > maxlength ;
}
2009-06-07 13:09:18 +00:00
StructRNA * RNA_property_pointer_type ( PointerRNA * ptr , PropertyRNA * prop )
2009-03-13 13:38:41 +00:00
{
2009-04-19 13:37:59 +00:00
prop = rna_ensure_property ( prop ) ;
2009-03-13 13:38:41 +00:00
2009-03-30 17:31:37 +00:00
if ( prop - > type = = PROP_POINTER ) {
PointerPropertyRNA * pprop = ( PointerPropertyRNA * ) prop ;
2009-06-07 13:09:18 +00:00
if ( pprop - > typef )
return pprop - > typef ( ptr ) ;
else if ( pprop - > type )
2009-03-30 17:31:37 +00:00
return pprop - > type ;
}
else if ( prop - > type = = PROP_COLLECTION ) {
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
if ( cprop - > type )
return cprop - > type ;
}
2009-03-13 13:38:41 +00:00
return & RNA_UnknownType ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
void RNA_property_enum_items ( bContext * C , PointerRNA * ptr , PropertyRNA * prop , EnumPropertyItem * * item , int * totitem , int * free )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
EnumPropertyRNA * eprop = ( EnumPropertyRNA * ) rna_ensure_property ( prop ) ;
2008-11-14 14:34:19 +00:00
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
* free = 0 ;
2009-07-13 19:33:59 +00:00
if ( eprop - > itemf ) {
int tot = 0 ;
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
* item = eprop - > itemf ( C , ptr , free ) ;
2009-07-11 13:32:20 +00:00
if ( totitem ) {
2009-07-13 19:33:59 +00:00
if ( * item ) {
for ( ; ( * item ) [ tot ] . identifier ; tot + + ) ;
}
2009-07-11 13:32:20 +00:00
* totitem = tot ;
}
2009-05-28 23:23:47 +00:00
}
else {
* item = eprop - > item ;
2009-06-23 12:36:15 +00:00
if ( totitem )
* totitem = eprop - > totitem ;
2009-05-28 23:23:47 +00:00
}
2008-11-14 14:34:19 +00:00
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_property_enum_value ( bContext * C , PointerRNA * ptr , PropertyRNA * prop , const char * identifier , int * value )
2008-12-02 14:36:35 +00:00
{
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
EnumPropertyItem * item ;
int free ;
2008-12-02 14:36:35 +00:00
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
RNA_property_enum_items ( C , ptr , prop , & item , NULL , & free ) ;
2008-12-02 14:36:35 +00:00
2009-06-23 12:36:15 +00:00
for ( ; item - > identifier ; item + + ) {
2009-07-10 11:36:02 +00:00
if ( item - > identifier [ 0 ] & & strcmp ( item - > identifier , identifier ) = = 0 ) {
2009-06-23 12:36:15 +00:00
* value = item - > value ;
2008-12-02 14:36:35 +00:00
return 1 ;
}
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
if ( free )
MEM_freeN ( item ) ;
2008-12-02 14:36:35 +00:00
return 0 ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_enum_identifier ( EnumPropertyItem * item , const int value , const char * * identifier )
2009-06-21 14:30:59 +00:00
{
for ( ; item - > identifier ; item + + ) {
2009-07-10 11:36:02 +00:00
if ( item - > identifier [ 0 ] & & item - > value = = value ) {
2009-06-21 14:30:59 +00:00
* identifier = item - > identifier ;
return 1 ;
}
}
return 0 ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_enum_name ( EnumPropertyItem * item , const int value , const char * * name )
2009-06-21 14:30:59 +00:00
{
for ( ; item - > identifier ; item + + ) {
2009-07-10 11:36:02 +00:00
if ( item - > identifier [ 0 ] & & item - > value = = value ) {
2009-06-21 14:30:59 +00:00
* name = item - > name ;
return 1 ;
}
}
return 0 ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_property_enum_identifier ( bContext * C , PointerRNA * ptr , PropertyRNA * prop , const int value , const char * * identifier )
2008-12-02 14:36:35 +00:00
{
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
EnumPropertyItem * item = NULL ;
int result , free ;
2008-12-02 14:36:35 +00:00
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
RNA_property_enum_items ( C , ptr , prop , & item , NULL , & free ) ;
2009-07-13 19:33:59 +00:00
if ( item ) {
result = RNA_enum_identifier ( item , value , identifier ) ;
if ( free )
MEM_freeN ( item ) ;
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
2009-07-13 19:33:59 +00:00
return result ;
}
return 0 ;
2008-12-02 14:36:35 +00:00
}
2009-04-19 13:37:59 +00:00
const char * RNA_property_ui_name ( PropertyRNA * prop )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return rna_ensure_property_name ( prop ) ;
2008-11-14 14:34:19 +00:00
}
2009-04-19 13:37:59 +00:00
const char * RNA_property_ui_description ( PropertyRNA * prop )
2008-11-14 14:34:19 +00:00
{
2009-04-19 13:37:59 +00:00
return rna_ensure_property ( prop ) - > description ;
2008-11-14 14:34:19 +00:00
}
2009-06-16 00:52:21 +00:00
int RNA_property_ui_icon ( PropertyRNA * prop )
{
return rna_ensure_property ( prop ) - > icon ;
}
2008-11-24 15:51:55 +00:00
int RNA_property_editable ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
2009-05-21 15:34:09 +00:00
ID * id ;
2008-11-24 12:12:24 +00:00
int flag ;
2009-04-19 13:37:59 +00:00
prop = rna_ensure_property ( prop ) ;
2008-11-17 18:44:06 +00:00
2008-11-24 12:12:24 +00:00
if ( prop - > editable )
flag = prop - > editable ( ptr ) ;
else
flag = prop - > flag ;
2009-05-21 15:34:09 +00:00
id = ptr - > id . data ;
2008-11-24 12:12:24 +00:00
2009-07-24 16:41:12 +00:00
return ( flag & PROP_EDITABLE ) & & ( ! id | | ! id - > lib | | ( flag & PROP_LIB_EXCEPTION ) ) ;
2008-10-31 23:50:02 +00:00
}
2009-01-17 13:54:56 +00:00
int RNA_property_animateable ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
2008-11-24 12:12:24 +00:00
int flag ;
2009-04-19 13:37:59 +00:00
prop = rna_ensure_property ( prop ) ;
2008-11-17 18:44:06 +00:00
2009-03-23 13:24:48 +00:00
if ( ! ( prop - > flag & PROP_ANIMATEABLE ) )
2009-01-17 13:54:56 +00:00
return 0 ;
2008-11-24 12:12:24 +00:00
if ( prop - > editable )
flag = prop - > editable ( ptr ) ;
else
flag = prop - > flag ;
2009-03-23 13:24:48 +00:00
return ( flag & PROP_EDITABLE ) ;
2009-01-17 13:54:56 +00:00
}
int RNA_property_animated ( PointerRNA * ptr , PropertyRNA * prop )
{
/* would need to ask animation system */
return 0 ;
2008-10-31 23:50:02 +00:00
}
2009-06-18 19:48:55 +00:00
void RNA_property_update ( bContext * C , PointerRNA * ptr , PropertyRNA * prop )
2008-11-07 02:58:25 +00:00
{
2009-04-19 13:37:59 +00:00
prop = rna_ensure_property ( prop ) ;
2008-11-17 18:44:06 +00:00
2009-01-01 15:52:51 +00:00
if ( prop - > update )
prop - > update ( C , ptr ) ;
if ( prop - > noteflag )
WM_event_add_notifier ( C , prop - > noteflag , ptr - > id . data ) ;
2008-11-07 02:58:25 +00:00
}
2008-11-17 18:44:06 +00:00
/* Property Data */
2008-11-24 15:51:55 +00:00
int RNA_property_boolean_get ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
BooleanPropertyRNA * bprop = ( BooleanPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
return IDP_Int ( idprop ) ;
else if ( bprop - > get )
return bprop - > get ( ptr ) ;
else
return bprop - > defaultvalue ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_boolean_set ( PointerRNA * ptr , PropertyRNA * prop , int value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
BooleanPropertyRNA * bprop = ( BooleanPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
IDP_Int ( idprop ) = value ;
else if ( bprop - > set )
2008-11-14 14:34:19 +00:00
bprop - > set ( ptr , value ) ;
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
val . i = value ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_INT , val , ( char * ) prop - > identifier ) ) ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_boolean_get_array ( PointerRNA * ptr , PropertyRNA * prop , int * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
BooleanPropertyRNA * bprop = ( BooleanPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-03-07 15:23:03 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_boolean_get ( ptr , prop ) ;
else
memcpy ( values , IDP_Array ( idprop ) , sizeof ( int ) * idprop - > len ) ;
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_boolean_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( bprop - > getarray )
2009-02-02 19:57:57 +00:00
bprop - > getarray ( ptr , values ) ;
2009-01-15 04:22:23 +00:00
else if ( bprop - > defaultarray )
2009-09-09 19:40:46 +00:00
memcpy ( values , bprop - > defaultarray , sizeof ( int ) * prop - > totarraylength ) ;
2009-01-15 04:22:23 +00:00
else
2009-09-09 19:40:46 +00:00
memset ( values , 0 , sizeof ( int ) * prop - > totarraylength ) ;
2009-02-02 19:57:57 +00:00
}
int RNA_property_boolean_get_index ( PointerRNA * ptr , PropertyRNA * prop , int index )
{
2009-09-09 19:40:46 +00:00
int tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_boolean_get_array ( ptr , prop , tmp ) ;
return tmp [ index ] ;
}
else {
int * tmparray , value ;
2009-02-02 19:57:57 +00:00
2009-09-09 19:40:46 +00:00
tmparray = MEM_callocN ( sizeof ( int ) * len , " RNA_property_boolean_get_index " ) ;
RNA_property_boolean_get_array ( ptr , prop , tmparray ) ;
value = tmparray [ index ] ;
MEM_freeN ( tmparray ) ;
return value ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_boolean_set_array ( PointerRNA * ptr , PropertyRNA * prop , const int * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
BooleanPropertyRNA * bprop = ( BooleanPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-03-12 15:28:00 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
IDP_Int ( idprop ) = values [ 0 ] ;
else
memcpy ( IDP_Array ( idprop ) , values , sizeof ( int ) * idprop - > len ) ;
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
RNA_property_boolean_set ( ptr , prop , values [ 0 ] ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( bprop - > setarray )
2009-02-02 19:57:57 +00:00
bprop - > setarray ( ptr , values ) ;
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
2009-09-09 19:40:46 +00:00
val . array . len = prop - > totarraylength ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
val . array . type = IDP_INT ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group ) {
idprop = IDP_New ( IDP_ARRAY , val , ( char * ) prop - > identifier ) ;
IDP_AddToGroup ( group , idprop ) ;
2009-02-02 19:57:57 +00:00
memcpy ( IDP_Array ( idprop ) , values , sizeof ( int ) * idprop - > len ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_boolean_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , int value )
{
2009-09-09 19:40:46 +00:00
int tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_boolean_get_array ( ptr , prop , tmp ) ;
tmp [ index ] = value ;
RNA_property_boolean_set_array ( ptr , prop , tmp ) ;
}
else {
int * tmparray ;
2009-02-02 19:57:57 +00:00
2009-09-09 19:40:46 +00:00
tmparray = MEM_callocN ( sizeof ( int ) * len , " RNA_property_boolean_get_index " ) ;
RNA_property_boolean_get_array ( ptr , prop , tmparray ) ;
tmparray [ index ] = value ;
RNA_property_boolean_set_array ( ptr , prop , tmparray ) ;
MEM_freeN ( tmparray ) ;
}
2009-02-02 19:57:57 +00:00
}
2008-11-24 15:51:55 +00:00
int RNA_property_int_get ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
return IDP_Int ( idprop ) ;
else if ( iprop - > get )
return iprop - > get ( ptr ) ;
else
return iprop - > defaultvalue ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_int_set ( PointerRNA * ptr , PropertyRNA * prop , int value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
IDP_Int ( idprop ) = value ;
else if ( iprop - > set )
2008-11-14 14:34:19 +00:00
iprop - > set ( ptr , value ) ;
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
val . i = value ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_INT , val , ( char * ) prop - > identifier ) ) ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_int_get_array ( PointerRNA * ptr , PropertyRNA * prop , int * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-03-07 15:23:03 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_int_get ( ptr , prop ) ;
else
memcpy ( values , IDP_Array ( idprop ) , sizeof ( int ) * idprop - > len ) ;
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_int_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( iprop - > getarray )
2009-02-02 19:57:57 +00:00
iprop - > getarray ( ptr , values ) ;
2009-01-15 04:22:23 +00:00
else if ( iprop - > defaultarray )
2009-09-09 19:40:46 +00:00
memcpy ( values , iprop - > defaultarray , sizeof ( int ) * prop - > totarraylength ) ;
2009-01-15 04:22:23 +00:00
else
2009-09-09 19:40:46 +00:00
memset ( values , 0 , sizeof ( int ) * prop - > totarraylength ) ;
2009-02-02 19:57:57 +00:00
}
int RNA_property_int_get_index ( PointerRNA * ptr , PropertyRNA * prop , int index )
{
2009-09-09 19:40:46 +00:00
int tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_int_get_array ( ptr , prop , tmp ) ;
return tmp [ index ] ;
}
else {
int * tmparray , value ;
tmparray = MEM_callocN ( sizeof ( int ) * len , " RNA_property_int_get_index " ) ;
RNA_property_int_get_array ( ptr , prop , tmparray ) ;
value = tmparray [ index ] ;
MEM_freeN ( tmparray ) ;
2009-02-02 19:57:57 +00:00
2009-09-09 19:40:46 +00:00
return value ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_int_set_array ( PointerRNA * ptr , PropertyRNA * prop , const int * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IntPropertyRNA * iprop = ( IntPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-03-12 15:28:00 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
IDP_Int ( idprop ) = values [ 0 ] ;
else
memcpy ( IDP_Array ( idprop ) , values , sizeof ( int ) * idprop - > len ) ; \
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
RNA_property_int_set ( ptr , prop , values [ 0 ] ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( iprop - > setarray )
2009-02-02 19:57:57 +00:00
iprop - > setarray ( ptr , values ) ;
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
2009-09-09 19:40:46 +00:00
val . array . len = prop - > totarraylength ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
val . array . type = IDP_INT ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group ) {
idprop = IDP_New ( IDP_ARRAY , val , ( char * ) prop - > identifier ) ;
IDP_AddToGroup ( group , idprop ) ;
2009-02-02 19:57:57 +00:00
memcpy ( IDP_Array ( idprop ) , values , sizeof ( int ) * idprop - > len ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_int_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , int value )
{
2009-09-09 19:40:46 +00:00
int tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
2009-02-02 19:57:57 +00:00
2009-09-09 19:40:46 +00:00
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_int_get_array ( ptr , prop , tmp ) ;
tmp [ index ] = value ;
RNA_property_int_set_array ( ptr , prop , tmp ) ;
}
else {
int * tmparray ;
tmparray = MEM_callocN ( sizeof ( int ) * len , " RNA_property_int_get_index " ) ;
RNA_property_int_get_array ( ptr , prop , tmparray ) ;
tmparray [ index ] = value ;
RNA_property_int_set_array ( ptr , prop , tmparray ) ;
MEM_freeN ( tmparray ) ;
}
2009-02-02 19:57:57 +00:00
}
2008-11-24 15:51:55 +00:00
float RNA_property_float_get ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
if ( idprop - > type = = IDP_FLOAT )
return IDP_Float ( idprop ) ;
else
return ( float ) IDP_Double ( idprop ) ;
}
else if ( fprop - > get )
return fprop - > get ( ptr ) ;
else
return fprop - > defaultvalue ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_float_set ( PointerRNA * ptr , PropertyRNA * prop , float value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
if ( idprop - > type = = IDP_FLOAT )
IDP_Float ( idprop ) = value ;
else
IDP_Double ( idprop ) = value ;
}
else if ( fprop - > set ) {
2008-11-14 14:34:19 +00:00
fprop - > set ( ptr , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
val . f = value ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_FLOAT , val , ( char * ) prop - > identifier ) ) ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_float_get_array ( PointerRNA * ptr , PropertyRNA * prop , float * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) prop ;
IDProperty * idprop ;
2009-02-02 19:57:57 +00:00
int i ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_float_get ( ptr , prop ) ;
else if ( idprop - > subtype = = IDP_FLOAT ) {
2009-02-02 19:57:57 +00:00
memcpy ( values , IDP_Array ( idprop ) , sizeof ( float ) * idprop - > len ) ;
}
else {
for ( i = 0 ; i < idprop - > len ; i + + )
values [ i ] = ( float ) ( ( ( double * ) IDP_Array ( idprop ) ) [ i ] ) ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-07 15:23:03 +00:00
values [ 0 ] = RNA_property_float_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( fprop - > getarray )
2009-02-02 19:57:57 +00:00
fprop - > getarray ( ptr , values ) ;
2009-01-15 04:22:23 +00:00
else if ( fprop - > defaultarray )
2009-09-09 19:40:46 +00:00
memcpy ( values , fprop - > defaultarray , sizeof ( float ) * prop - > totarraylength ) ;
2009-01-15 04:22:23 +00:00
else
2009-09-09 19:40:46 +00:00
memset ( values , 0 , sizeof ( float ) * prop - > totarraylength ) ;
2009-02-02 19:57:57 +00:00
}
float RNA_property_float_get_index ( PointerRNA * ptr , PropertyRNA * prop , int index )
{
2009-09-09 19:40:46 +00:00
float tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_float_get_array ( ptr , prop , tmp ) ;
return tmp [ index ] ;
}
else {
float * tmparray , value ;
tmparray = MEM_callocN ( sizeof ( float ) * len , " RNA_property_float_get_index " ) ;
RNA_property_float_get_array ( ptr , prop , tmparray ) ;
value = tmparray [ index ] ;
MEM_freeN ( tmparray ) ;
return value ;
}
2009-02-02 19:57:57 +00:00
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_float_set_array ( PointerRNA * ptr , PropertyRNA * prop , const float * values )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
FloatPropertyRNA * fprop = ( FloatPropertyRNA * ) prop ;
IDProperty * idprop ;
2009-02-02 19:57:57 +00:00
int i ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-09-09 19:40:46 +00:00
if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
IDP_Double ( idprop ) = values [ 0 ] ;
else if ( idprop - > subtype = = IDP_FLOAT ) {
2009-02-02 19:57:57 +00:00
memcpy ( IDP_Array ( idprop ) , values , sizeof ( float ) * idprop - > len ) ;
}
else {
for ( i = 0 ; i < idprop - > len ; i + + )
( ( double * ) IDP_Array ( idprop ) ) [ i ] = values [ i ] ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-09-09 19:40:46 +00:00
else if ( prop - > arraydimension = = 0 )
2009-03-12 15:28:00 +00:00
RNA_property_float_set ( ptr , prop , values [ 0 ] ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else if ( fprop - > setarray ) {
2009-02-02 19:57:57 +00:00
fprop - > setarray ( ptr , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
2009-09-09 19:40:46 +00:00
val . array . len = prop - > totarraylength ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
val . array . type = IDP_FLOAT ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group ) {
idprop = IDP_New ( IDP_ARRAY , val , ( char * ) prop - > identifier ) ;
IDP_AddToGroup ( group , idprop ) ;
2009-02-02 19:57:57 +00:00
memcpy ( IDP_Array ( idprop ) , values , sizeof ( float ) * idprop - > len ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_float_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , float value )
{
2009-09-09 19:40:46 +00:00
float tmp [ RNA_MAX_ARRAY_LENGTH ] ;
int len = rna_ensure_property_array_length ( ptr , prop ) ;
2009-02-02 19:57:57 +00:00
2009-09-09 19:40:46 +00:00
if ( len < = RNA_MAX_ARRAY_LENGTH ) {
RNA_property_float_get_array ( ptr , prop , tmp ) ;
tmp [ index ] = value ;
RNA_property_float_set_array ( ptr , prop , tmp ) ;
}
else {
float * tmparray ;
tmparray = MEM_callocN ( sizeof ( float ) * len , " RNA_property_float_get_index " ) ;
RNA_property_float_get_array ( ptr , prop , tmparray ) ;
tmparray [ index ] = value ;
RNA_property_float_set_array ( ptr , prop , tmparray ) ;
MEM_freeN ( tmparray ) ;
}
2009-02-02 19:57:57 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_string_get ( PointerRNA * ptr , PropertyRNA * prop , char * value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
StringPropertyRNA * sprop = ( StringPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
strcpy ( value , IDP_String ( idprop ) ) ;
else if ( sprop - > get )
sprop - > get ( ptr , value ) ;
else
strcpy ( value , sprop - > defaultvalue ) ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
char * RNA_property_string_get_alloc ( PointerRNA * ptr , PropertyRNA * prop , char * fixedbuf , int fixedlen )
2008-11-11 15:03:26 +00:00
{
char * buf ;
int length ;
2008-11-24 15:51:55 +00:00
length = RNA_property_string_length ( ptr , prop ) ;
2008-11-11 15:03:26 +00:00
if ( length + 1 < fixedlen )
buf = fixedbuf ;
else
buf = MEM_callocN ( sizeof ( char ) * ( length + 1 ) , " RNA_string_get_alloc " ) ;
2008-11-24 15:51:55 +00:00
RNA_property_string_get ( ptr , prop , buf ) ;
2008-11-11 15:03:26 +00:00
return buf ;
}
2008-11-24 15:51:55 +00:00
int RNA_property_string_length ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
StringPropertyRNA * sprop = ( StringPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
return strlen ( IDP_String ( idprop ) ) ;
else if ( sprop - > length )
return sprop - > length ( ptr ) ;
else
return strlen ( sprop - > defaultvalue ) ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_string_set ( PointerRNA * ptr , PropertyRNA * prop , const char * value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
StringPropertyRNA * sprop = ( StringPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
IDP_AssignString ( idprop , ( char * ) value ) ;
else if ( sprop - > set )
2008-11-14 14:34:19 +00:00
sprop - > set ( ptr , value ) ;
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
2008-12-25 14:17:54 +00:00
IDProperty * group ;
2008-12-26 02:06:54 +00:00
val . str = ( char * ) value ;
2008-12-25 14:17:54 +00:00
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
2008-12-25 14:17:54 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_STRING , val , ( char * ) prop - > identifier ) ) ;
}
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
int RNA_property_enum_get ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
EnumPropertyRNA * eprop = ( EnumPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
return IDP_Int ( idprop ) ;
else if ( eprop - > get )
return eprop - > get ( ptr ) ;
else
return eprop - > defaultvalue ;
2008-10-31 23:50:02 +00:00
}
2008-12-02 14:36:35 +00:00
2008-11-24 15:51:55 +00:00
void RNA_property_enum_set ( PointerRNA * ptr , PropertyRNA * prop , int value )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
EnumPropertyRNA * eprop = ( EnumPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
IDP_Int ( idprop ) = value ;
else if ( eprop - > set ) {
2008-11-14 14:34:19 +00:00
eprop - > set ( ptr , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2009-03-23 13:24:48 +00:00
else if ( prop - > flag & PROP_EDITABLE ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
IDProperty * group ;
val . i = value ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_INT , val , ( char * ) prop - > identifier ) ) ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
PointerRNA RNA_property_pointer_get ( PointerRNA * ptr , PropertyRNA * prop )
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
{
PointerPropertyRNA * pprop = ( PointerPropertyRNA * ) prop ;
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-02-02 19:57:57 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
pprop = ( PointerPropertyRNA * ) prop ;
2008-11-07 02:58:25 +00:00
2009-02-02 19:57:57 +00:00
/* for groups, data is idprop itself */
2009-03-23 13:24:48 +00:00
return rna_pointer_inherit_refine ( ptr , pprop - > type , idprop ) ;
2009-02-02 19:57:57 +00:00
}
else if ( pprop - > get ) {
return pprop - > get ( ptr ) ;
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
else if ( prop - > flag & PROP_IDPROPERTY ) {
/* XXX temporary hack to add it automatically, reading should
never do any write ops , to ensure thread safety etc . . */
RNA_property_pointer_add ( ptr , prop ) ;
return RNA_property_pointer_get ( ptr , prop ) ;
}
2009-02-02 19:57:57 +00:00
else {
PointerRNA result ;
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
2009-02-02 19:57:57 +00:00
memset ( & result , 0 , sizeof ( result ) ) ;
return result ;
}
2008-10-31 23:50:02 +00:00
}
2009-02-02 19:57:57 +00:00
void RNA_property_pointer_set ( PointerRNA * ptr , PropertyRNA * prop , PointerRNA ptr_value )
2008-10-31 23:50:02 +00:00
{
2009-09-16 18:04:01 +00:00
IDProperty * idprop ;
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
/* not supported */
}
else {
PointerPropertyRNA * pprop = ( PointerPropertyRNA * ) prop ;
2008-10-31 23:50:02 +00:00
2009-09-16 18:04:01 +00:00
if ( pprop - > set & & ! ( ( prop - > flag & PROP_NEVER_NULL ) & & ptr_value . data = = NULL ) )
pprop - > set ( ptr , ptr_value ) ;
}
2008-10-31 23:50:02 +00:00
}
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;
2008-12-26 20:38:52 +00:00
void RNA_property_pointer_add ( PointerRNA * ptr , PropertyRNA * prop )
{
IDProperty * idprop ;
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
/* already exists */
}
else if ( prop - > flag & PROP_IDPROPERTY ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
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;
2008-12-26 20:38:52 +00:00
IDProperty * group ;
val . i = 0 ;
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
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;
2008-12-26 20:38:52 +00:00
if ( group )
IDP_AddToGroup ( group , IDP_New ( IDP_GROUP , val , ( char * ) prop - > identifier ) ) ;
}
else
printf ( " RNA_property_pointer_add %s.%s: only supported for id properties. \n " , ptr - > type - > identifier , prop - > identifier ) ;
}
2009-05-28 23:23:47 +00:00
void RNA_property_pointer_remove ( PointerRNA * ptr , PropertyRNA * prop )
{
IDProperty * idprop , * group ;
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
group = RNA_struct_idproperties ( ptr , 0 ) ;
if ( group ) {
IDP_RemFromGroup ( group , idprop ) ;
IDP_FreeProperty ( idprop ) ;
MEM_freeN ( idprop ) ;
}
}
else
printf ( " RNA_property_pointer_remove %s.%s: only supported for id properties. \n " , ptr - > type - > identifier , prop - > identifier ) ;
}
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;
2008-12-26 20:38:52 +00:00
static void rna_property_collection_get_idp ( CollectionPropertyIterator * iter )
{
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) iter - > prop ;
2008-12-31 13:16:37 +00:00
iter - > ptr . data = rna_iterator_array_get ( iter ) ;
2009-03-23 13:24:48 +00:00
iter - > ptr . type = cprop - > type ;
rna_pointer_inherit_id ( cprop - > type , & iter - > parent , & iter - > ptr ) ;
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;
2008-12-26 20:38:52 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_collection_begin ( PointerRNA * ptr , PropertyRNA * prop , CollectionPropertyIterator * iter )
2008-10-31 23:50:02 +00:00
{
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;
2008-12-26 20:38:52 +00:00
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
2009-02-02 19:57:57 +00:00
memset ( iter , 0 , sizeof ( * iter ) ) ;
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;
2008-12-26 20:38:52 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) | | ( prop - > flag & PROP_IDPROPERTY ) ) {
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
iter - > parent = * ptr ;
2008-11-24 15:51:55 +00:00
iter - > prop = prop ;
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;
2008-12-26 20:38:52 +00:00
if ( idprop )
2009-07-13 19:33:59 +00:00
rna_iterator_array_begin ( iter , IDP_IDPArray ( idprop ) , sizeof ( IDProperty ) , idprop - > len , 0 , NULL ) ;
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;
2008-12-26 20:38:52 +00:00
else
2009-07-13 19:33:59 +00:00
rna_iterator_array_begin ( iter , NULL , sizeof ( IDProperty ) , 0 , 0 , NULL ) ;
2008-11-14 17:05:25 +00:00
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
if ( iter - > valid )
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;
2008-12-26 20:38:52 +00:00
rna_property_collection_get_idp ( iter ) ;
iter - > idprop = 1 ;
}
else {
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
2009-02-02 19:57:57 +00:00
cprop - > begin ( iter , ptr ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_collection_next ( CollectionPropertyIterator * iter )
2008-10-31 23:50:02 +00:00
{
2008-11-24 15:51:55 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) iter - > prop ;
2008-10-31 23:50:02 +00:00
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;
2008-12-26 20:38:52 +00:00
if ( iter - > idprop ) {
rna_iterator_array_next ( iter ) ;
2008-11-07 02:58:25 +00:00
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;
2008-12-26 20:38:52 +00:00
if ( iter - > valid )
rna_property_collection_get_idp ( iter ) ;
}
2009-02-02 19:57:57 +00:00
else
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;
2008-12-26 20:38:52 +00:00
cprop - > next ( iter ) ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
void RNA_property_collection_end ( CollectionPropertyIterator * iter )
2008-10-31 23:50:02 +00:00
{
2008-11-24 15:51:55 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) iter - > prop ;
2008-10-31 23:50:02 +00:00
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;
2008-12-26 20:38:52 +00:00
if ( iter - > idprop )
rna_iterator_array_end ( iter ) ;
2009-02-02 19:57:57 +00:00
else
2008-11-14 17:05:25 +00:00
cprop - > end ( iter ) ;
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
int RNA_property_collection_length ( PointerRNA * ptr , PropertyRNA * prop )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
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;
2008-12-26 20:38:52 +00:00
IDProperty * idprop ;
2008-10-31 23:50:02 +00:00
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;
2008-12-26 20:38:52 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
return idprop - > len ;
}
else if ( cprop - > length ) {
2008-11-07 02:58:25 +00:00
return cprop - > length ( ptr ) ;
2008-10-31 23:50:02 +00:00
}
else {
CollectionPropertyIterator iter ;
int length = 0 ;
2008-11-24 15:51:55 +00:00
RNA_property_collection_begin ( ptr , prop , & iter ) ;
for ( ; iter . valid ; RNA_property_collection_next ( & iter ) )
2008-10-31 23:50:02 +00:00
length + + ;
2008-11-24 15:51:55 +00:00
RNA_property_collection_end ( & iter ) ;
2008-10-31 23:50:02 +00:00
return length ;
}
}
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;
2008-12-26 20:38:52 +00:00
void RNA_property_collection_add ( PointerRNA * ptr , PropertyRNA * prop , PointerRNA * r_ptr )
{
IDProperty * idprop ;
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
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;
2008-12-26 20:38:52 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
2008-12-31 13:16:37 +00:00
IDProperty * item ;
item = IDP_New ( IDP_GROUP , val , " " ) ;
IDP_AppendArray ( idprop , item ) ;
IDP_FreeProperty ( item ) ;
MEM_freeN ( item ) ;
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;
2008-12-26 20:38:52 +00:00
}
else if ( prop - > flag & PROP_IDPROPERTY ) {
2008-12-31 13:16:37 +00:00
IDProperty * group , * item ;
2009-05-20 09:52:02 +00:00
IDPropertyTemplate val = { 0 } ;
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;
2008-12-26 20:38:52 +00:00
2009-05-20 09:52:02 +00:00
group = RNA_struct_idproperties ( ptr , 1 ) ;
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;
2008-12-26 20:38:52 +00:00
if ( group ) {
2008-12-31 13:16:37 +00:00
idprop = IDP_NewIDPArray ( prop - > identifier ) ;
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;
2008-12-26 20:38:52 +00:00
IDP_AddToGroup ( group , idprop ) ;
2008-12-31 13:16:37 +00:00
item = IDP_New ( IDP_GROUP , val , " " ) ;
IDP_AppendArray ( idprop , item ) ;
IDP_FreeProperty ( item ) ;
MEM_freeN ( item ) ;
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;
2008-12-26 20:38:52 +00:00
}
}
2009-06-18 19:48:55 +00:00
else if ( cprop - > add ) {
if ( ! ( cprop - > add - > flag & FUNC_USE_CONTEXT ) ) { /* XXX check for this somewhere else */
2009-07-17 02:31:28 +00:00
ParameterList params ;
RNA_parameter_list_create ( & params , ptr , cprop - > add ) ;
RNA_function_call ( NULL , NULL , ptr , cprop - > add , & params ) ;
RNA_parameter_list_free ( & params ) ;
2009-06-18 19:48:55 +00:00
}
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
/*else
printf ( " RNA_property_collection_add %s.%s: not implemented for this property. \n " , ptr - > type - > identifier , prop - > identifier ) ; */
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;
2008-12-26 20:38:52 +00:00
if ( r_ptr ) {
if ( idprop ) {
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
2008-12-31 13:16:37 +00:00
r_ptr - > data = IDP_GetIndexArray ( idprop , idprop - > len - 1 ) ;
2009-03-23 13:24:48 +00:00
r_ptr - > type = cprop - > type ;
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;
2008-12-26 20:38:52 +00:00
rna_pointer_inherit_id ( NULL , ptr , r_ptr ) ;
}
else
memset ( r_ptr , 0 , sizeof ( * r_ptr ) ) ;
}
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
int RNA_property_collection_remove ( PointerRNA * ptr , PropertyRNA * prop , int key )
2009-05-28 23:23:47 +00:00
{
IDProperty * idprop ;
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
2009-05-28 23:23:47 +00:00
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) ) {
IDProperty tmp , * array ;
int len ;
len = idprop - > len ;
array = IDP_IDPArray ( idprop ) ;
if ( key > = 0 & & key < len ) {
if ( key + 1 < len ) {
/* move element to be removed to the back */
memcpy ( & tmp , & array [ key ] , sizeof ( IDProperty ) ) ;
memmove ( array + key , array + key + 1 , sizeof ( IDProperty ) * ( len - key + 1 ) ) ;
memcpy ( & array [ len - 1 ] , & tmp , sizeof ( IDProperty ) ) ;
}
IDP_ResizeIDPArray ( idprop , len - 1 ) ;
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
return 1 ;
2009-05-28 23:23:47 +00:00
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
else if ( prop - > flag & PROP_IDPROPERTY )
return 1 ;
2009-06-18 19:48:55 +00:00
else if ( cprop - > remove ) {
if ( ! ( cprop - > remove - > flag & FUNC_USE_CONTEXT ) ) { /* XXX check for this somewhere else */
2009-07-17 02:31:28 +00:00
ParameterList params ;
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
RNA_parameter_list_create ( & params , ptr , cprop - > remove ) ;
2009-07-17 02:31:28 +00:00
RNA_function_call ( NULL , NULL , ptr , cprop - > remove , & params ) ;
RNA_parameter_list_free ( & params ) ;
2009-06-18 19:48:55 +00:00
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
return 0 ;
2009-06-18 19:48:55 +00:00
}
2.5: RNA, defining enums, pointers and collections properties is now
possible from python, but it's still work in progress.
Pointers and collections are restricted to types derived from
IDPropertyGroup (same as for operators), because RNA knows how to
allocate/deallocate those.
Collections have .add() and .remove(number) functions that can be
used. The remove function should be fixed to take an other argument
than a number.
With the IDPropertyGroup restriction, pointers are more like nested
structs. They don't have add(), remove() yet, not sure where to put
them. Currently the pointer / nested struct is automatically allocated
in the get() function, this needs to be fixed, rule is that RNA get()
will not change any data for thread safety.
Also, it is only possible to add properties to structs after they have
been registered, which needs to be improved as well.
Example code:
http://www.pasteall.org/7201/python
2009-08-18 01:29:25 +00:00
/*else
printf ( " RNA_property_collection_remove %s.%s: only supported for id properties. \n " , ptr - > type - > identifier , prop - > identifier ) ; */
return 0 ;
2009-05-28 23:23:47 +00:00
}
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;
2008-12-26 20:38:52 +00:00
void RNA_property_collection_clear ( PointerRNA * ptr , PropertyRNA * prop )
{
IDProperty * idprop ;
if ( ( idprop = rna_idproperty_check ( & prop , ptr ) ) )
2008-12-31 13:16:37 +00:00
IDP_ResizeIDPArray ( idprop , 0 ) ;
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;
2008-12-26 20:38:52 +00:00
}
2008-11-24 15:51:55 +00:00
int RNA_property_collection_lookup_int ( PointerRNA * ptr , PropertyRNA * prop , int key , PointerRNA * r_ptr )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
2008-10-31 23:50:02 +00:00
if ( cprop - > lookupint ) {
2008-11-07 02:58:25 +00:00
/* we have a callback defined, use it */
2009-02-02 19:57:57 +00:00
* r_ptr = cprop - > lookupint ( ptr , key ) ;
return ( r_ptr - > data ! = NULL ) ;
2008-10-31 23:50:02 +00:00
}
else {
2008-11-07 02:58:25 +00:00
/* no callback defined, just iterate and find the nth item */
2008-10-31 23:50:02 +00:00
CollectionPropertyIterator iter ;
2008-11-07 02:58:25 +00:00
int i ;
2008-10-31 23:50:02 +00:00
2008-11-24 15:51:55 +00:00
RNA_property_collection_begin ( ptr , prop , & iter ) ;
for ( i = 0 ; iter . valid ; RNA_property_collection_next ( & iter ) , i + + ) {
2008-11-07 02:58:25 +00:00
if ( i = = key ) {
2008-11-14 17:05:25 +00:00
* r_ptr = iter . ptr ;
2008-10-31 23:50:02 +00:00
break ;
2008-11-07 02:58:25 +00:00
}
2008-10-31 23:50:02 +00:00
}
2008-11-24 15:51:55 +00:00
RNA_property_collection_end ( & iter ) ;
2008-10-31 23:50:02 +00:00
2008-11-07 02:58:25 +00:00
if ( ! iter . valid )
memset ( r_ptr , 0 , sizeof ( * r_ptr ) ) ;
2008-10-31 23:50:02 +00:00
2008-11-07 02:58:25 +00:00
return iter . valid ;
2008-10-31 23:50:02 +00:00
}
}
2008-11-24 15:51:55 +00:00
int RNA_property_collection_lookup_string ( PointerRNA * ptr , PropertyRNA * prop , const char * key , PointerRNA * r_ptr )
2008-10-31 23:50:02 +00:00
{
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
CollectionPropertyRNA * cprop = ( CollectionPropertyRNA * ) prop ;
2008-10-31 23:50:02 +00:00
if ( cprop - > lookupstring ) {
2008-11-07 02:58:25 +00:00
/* we have a callback defined, use it */
2009-02-02 19:57:57 +00:00
* r_ptr = cprop - > lookupstring ( ptr , key ) ;
return ( r_ptr - > data ! = NULL ) ;
2008-10-31 23:50:02 +00:00
}
else {
2008-11-07 02:58:25 +00:00
/* no callback defined, compare with name properties if they exist */
2008-10-31 23:50:02 +00:00
CollectionPropertyIterator iter ;
2008-11-11 18:28:00 +00:00
PropertyRNA * nameprop ;
2008-10-31 23:50:02 +00:00
char name [ 256 ] , * nameptr ;
2008-11-29 15:43:53 +00:00
int found = 0 ;
2008-10-31 23:50:02 +00:00
2008-11-24 15:51:55 +00:00
RNA_property_collection_begin ( ptr , prop , & iter ) ;
for ( ; iter . valid ; RNA_property_collection_next ( & iter ) ) {
2008-11-14 17:05:25 +00:00
if ( iter . ptr . data & & iter . ptr . type - > nameproperty ) {
nameprop = iter . ptr . type - > nameproperty ;
2008-10-31 23:50:02 +00:00
2008-11-29 15:43:53 +00:00
nameptr = RNA_property_string_get_alloc ( & iter . ptr , nameprop , name , sizeof ( name ) ) ;
2008-10-31 23:50:02 +00:00
2008-11-07 02:58:25 +00:00
if ( strcmp ( nameptr , key ) = = 0 ) {
2008-11-14 17:05:25 +00:00
* r_ptr = iter . ptr ;
2008-11-07 02:58:25 +00:00
found = 1 ;
2008-10-31 23:50:02 +00:00
}
2008-11-07 02:58:25 +00:00
2009-04-07 00:49:39 +00:00
if ( ( char * ) & name ! = nameptr )
2008-11-07 02:58:25 +00:00
MEM_freeN ( nameptr ) ;
if ( found )
break ;
2008-10-31 23:50:02 +00:00
}
}
2008-11-24 15:51:55 +00:00
RNA_property_collection_end ( & iter ) ;
2008-10-31 23:50:02 +00:00
2008-11-07 02:58:25 +00:00
if ( ! iter . valid )
memset ( r_ptr , 0 , sizeof ( * r_ptr ) ) ;
2008-10-31 23:50:02 +00:00
2008-11-07 02:58:25 +00:00
return iter . valid ;
2008-10-31 23:50:02 +00:00
}
}
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
int RNA_property_collection_raw_array ( PointerRNA * ptr , PropertyRNA * prop , PropertyRNA * itemprop , RawArray * array )
{
CollectionPropertyIterator iter ;
ArrayIterator * internal ;
char * arrayp ;
if ( ! ( prop - > flag & PROP_RAW_ARRAY ) | | ! ( itemprop - > flag & PROP_RAW_ACCESS ) )
return 0 ;
RNA_property_collection_begin ( ptr , prop , & iter ) ;
if ( iter . valid ) {
/* get data from array iterator and item property */
internal = iter . internal ;
arrayp = ( iter . valid ) ? iter . ptr . data : NULL ;
if ( internal - > skip | | ! RNA_property_editable ( & iter . ptr , itemprop ) ) {
/* we might skip some items, so it's not a proper array */
RNA_property_collection_end ( & iter ) ;
return 0 ;
}
array - > array = arrayp + itemprop - > rawoffset ;
array - > stride = internal - > itemsize ;
array - > len = ( ( char * ) internal - > endptr - arrayp ) / internal - > itemsize ;
array - > type = itemprop - > rawtype ;
}
else
memset ( array , 0 , sizeof ( RawArray ) ) ;
RNA_property_collection_end ( & iter ) ;
return 1 ;
}
# define RAW_GET(dtype, var, raw, a) \
{ \
switch ( raw . type ) { \
case PROP_RAW_CHAR : var = ( dtype ) ( ( char * ) raw . array ) [ a ] ; break ; \
case PROP_RAW_SHORT : var = ( dtype ) ( ( short * ) raw . array ) [ a ] ; break ; \
case PROP_RAW_INT : var = ( dtype ) ( ( int * ) raw . array ) [ a ] ; break ; \
case PROP_RAW_FLOAT : var = ( dtype ) ( ( float * ) raw . array ) [ a ] ; break ; \
case PROP_RAW_DOUBLE : var = ( dtype ) ( ( double * ) raw . array ) [ a ] ; break ; \
default : var = ( dtype ) 0 ; \
} \
}
# define RAW_SET(dtype, raw, a, var) \
{ \
switch ( raw . type ) { \
case PROP_RAW_CHAR : ( ( char * ) raw . array ) [ a ] = ( char ) var ; break ; \
case PROP_RAW_SHORT : ( ( short * ) raw . array ) [ a ] = ( short ) var ; break ; \
case PROP_RAW_INT : ( ( int * ) raw . array ) [ a ] = ( int ) var ; break ; \
case PROP_RAW_FLOAT : ( ( float * ) raw . array ) [ a ] = ( float ) var ; break ; \
case PROP_RAW_DOUBLE : ( ( double * ) raw . array ) [ a ] = ( double ) var ; break ; \
} \
}
2009-06-30 12:52:16 +00:00
int RNA_raw_type_sizeof ( RawPropertyType type )
{
switch ( type ) {
case PROP_RAW_CHAR : return sizeof ( char ) ;
case PROP_RAW_SHORT : return sizeof ( short ) ;
case PROP_RAW_INT : return sizeof ( int ) ;
case PROP_RAW_FLOAT : return sizeof ( float ) ;
case PROP_RAW_DOUBLE : return sizeof ( double ) ;
2009-06-30 19:10:14 +00:00
default : return 0 ;
2009-06-30 12:52:16 +00:00
}
}
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
static int rna_raw_access ( ReportList * reports , PointerRNA * ptr , PropertyRNA * prop , char * propname , void * inarray , RawPropertyType intype , int inlen , int set )
{
StructRNA * ptype ;
PointerRNA itemptr ;
PropertyRNA * itemprop , * iprop ;
2009-07-16 04:45:52 +00:00
PropertyType itemtype = 0 ;
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
RawArray in ;
int itemlen = 0 ;
/* initialize in array, stride assumed 0 in following code */
in . array = inarray ;
in . type = intype ;
in . len = inlen ;
in . stride = 0 ;
ptype = RNA_property_pointer_type ( ptr , prop ) ;
/* try to get item property pointer */
RNA_pointer_create ( NULL , ptype , NULL , & itemptr ) ;
itemprop = RNA_struct_find_property ( & itemptr , propname ) ;
if ( itemprop ) {
/* we have item property pointer */
RawArray out ;
/* check type */
itemtype = RNA_property_type ( itemprop ) ;
if ( ! ELEM3 ( itemtype , PROP_BOOLEAN , PROP_INT , PROP_FLOAT ) ) {
BKE_report ( reports , RPT_ERROR , " Only boolean, int and float properties supported. " ) ;
return 0 ;
}
/* check item array */
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
itemlen = RNA_property_array_length ( & itemptr , itemprop ) ;
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
/* try to access as raw array */
if ( RNA_property_collection_raw_array ( ptr , prop , itemprop , & out ) ) {
if ( in . len ! = itemlen * out . len ) {
BKE_reportf ( reports , RPT_ERROR , " Array length mismatch (expected %d, got %d). " , out . len * itemlen , in . len ) ;
return 0 ;
}
/* matching raw types */
if ( out . type = = in . type ) {
void * inp = in . array ;
void * outp = out . array ;
int a , size ;
itemlen = ( itemlen = = 0 ) ? 1 : itemlen ;
2009-06-30 12:52:16 +00:00
size = RNA_raw_type_sizeof ( out . type ) * itemlen ;
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
for ( a = 0 ; a < out . len ; a + + ) {
if ( set ) memcpy ( outp , inp , size ) ;
else memcpy ( inp , outp , size ) ;
inp = ( char * ) inp + size ;
outp = ( char * ) outp + out . stride ;
}
return 1 ;
}
/* could also be faster with non-matching types,
* for now we just do slower loop . . */
}
}
{
void * tmparray = NULL ;
int tmplen = 0 ;
int err = 0 , j , a = 0 ;
/* no item property pointer, can still be id property, or
* property of a type derived from the collection pointer type */
RNA_PROP_BEGIN ( ptr , itemptr , prop ) {
if ( itemptr . data ) {
if ( itemprop ) {
/* we got the property already */
iprop = itemprop ;
}
else {
/* not yet, look it up and verify if it is valid */
iprop = RNA_struct_find_property ( & itemptr , propname ) ;
if ( iprop ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
itemlen = RNA_property_array_length ( & itemptr , iprop ) ;
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
itemtype = RNA_property_type ( iprop ) ;
}
else {
BKE_reportf ( reports , RPT_ERROR , " Property named %s not found. " , propname ) ;
err = 1 ;
break ;
}
if ( ! ELEM3 ( itemtype , PROP_BOOLEAN , PROP_INT , PROP_FLOAT ) ) {
BKE_report ( reports , RPT_ERROR , " Only boolean, int and float properties supported. " ) ;
err = 1 ;
break ;
}
}
/* editable check */
if ( RNA_property_editable ( & itemptr , iprop ) ) {
if ( a + itemlen > in . len ) {
BKE_reportf ( reports , RPT_ERROR , " Array length mismatch (got %d, expected more). " , in . len ) ;
err = 1 ;
break ;
}
if ( itemlen = = 0 ) {
/* handle conversions */
if ( set ) {
switch ( itemtype ) {
case PROP_BOOLEAN : {
int b ;
RAW_GET ( int , b , in , a ) ;
RNA_property_boolean_set ( & itemptr , iprop , b ) ;
break ;
}
case PROP_INT : {
int i ;
RAW_GET ( int , i , in , a ) ;
RNA_property_int_set ( & itemptr , iprop , i ) ;
break ;
}
case PROP_FLOAT : {
float f ;
RAW_GET ( float , f , in , a ) ;
RNA_property_float_set ( & itemptr , iprop , f ) ;
break ;
}
default :
break ;
}
}
else {
switch ( itemtype ) {
case PROP_BOOLEAN : {
int b = RNA_property_boolean_get ( & itemptr , iprop ) ;
RAW_SET ( int , in , a , b ) ;
break ;
}
case PROP_INT : {
int i = RNA_property_int_get ( & itemptr , iprop ) ;
RAW_SET ( int , in , a , i ) ;
break ;
}
case PROP_FLOAT : {
float f = RNA_property_float_get ( & itemptr , iprop ) ;
RAW_SET ( float , in , a , f ) ;
break ;
}
default :
break ;
}
}
a + + ;
}
else {
/* allocate temporary array if needed */
if ( tmparray & & tmplen ! = itemlen ) {
MEM_freeN ( tmparray ) ;
tmparray = NULL ;
}
if ( ! tmparray ) {
tmparray = MEM_callocN ( sizeof ( float ) * itemlen , " RNA tmparray \n " ) ;
tmplen = itemlen ;
}
/* handle conversions */
if ( set ) {
switch ( itemtype ) {
case PROP_BOOLEAN : {
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_GET ( int , ( ( int * ) tmparray ) [ j ] , in , a ) ;
RNA_property_boolean_set_array ( & itemptr , iprop , tmparray ) ;
break ;
}
case PROP_INT : {
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_GET ( int , ( ( int * ) tmparray ) [ j ] , in , a ) ;
RNA_property_int_set_array ( & itemptr , iprop , tmparray ) ;
break ;
}
case PROP_FLOAT : {
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_GET ( float , ( ( float * ) tmparray ) [ j ] , in , a ) ;
RNA_property_float_set_array ( & itemptr , iprop , tmparray ) ;
break ;
}
default :
break ;
}
}
else {
switch ( itemtype ) {
case PROP_BOOLEAN : {
RNA_property_boolean_get_array ( & itemptr , iprop , tmparray ) ;
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_SET ( int , in , a , ( ( int * ) tmparray ) [ j ] ) ;
break ;
}
case PROP_INT : {
RNA_property_int_get_array ( & itemptr , iprop , tmparray ) ;
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_SET ( int , in , a , ( ( int * ) tmparray ) [ j ] ) ;
break ;
}
case PROP_FLOAT : {
RNA_property_float_get_array ( & itemptr , iprop , tmparray ) ;
for ( j = 0 ; j < itemlen ; j + + , a + + )
RAW_SET ( float , in , a , ( ( float * ) tmparray ) [ j ] ) ;
break ;
}
default :
break ;
}
}
}
}
}
}
RNA_PROP_END ;
if ( tmparray )
MEM_freeN ( tmparray ) ;
return ! err ;
}
}
2009-06-30 12:52:16 +00:00
RawPropertyType RNA_property_raw_type ( PropertyRNA * prop )
{
return prop - > rawtype ;
}
RNA
Implementation of RNA side of foreach_get/foreach_set,
Campbell will do python code.
Three functions for efficiently setting some property for all
items in a collection. RNA_property_collection_raw_array gives
access to the properties as an array with length, stride, and
type specified, if this is possible, i.e. not when it uses a
ListBase, or if a manual get/set function is implemented.
Two other functions take a C array pointer and get/set it
using the a collection + property name, using efficient array
access if possible, and otherwise using slower RNA iterator.
RNA_property_collection_raw_get
RNA_property_collection_raw_set
The number of type conversion required here got a bit out of
hand, it could be more efficient still if checking for more
cases, but function is already long enough.
Example: http://www.pasteall.org/6362/c
2009-06-29 19:15:51 +00:00
int RNA_property_collection_raw_get ( ReportList * reports , PointerRNA * ptr , PropertyRNA * prop , char * propname , void * array , RawPropertyType type , int len )
{
return rna_raw_access ( reports , ptr , prop , propname , array , type , len , 0 ) ;
}
int RNA_property_collection_raw_set ( ReportList * reports , PointerRNA * ptr , PropertyRNA * prop , char * propname , void * array , RawPropertyType type , int len )
{
return rna_raw_access ( reports , ptr , prop , propname , array , type , len , 1 ) ;
}
2008-10-31 23:50:02 +00:00
/* Standard iterator functions */
2008-11-24 12:12:24 +00:00
void rna_iterator_listbase_begin ( CollectionPropertyIterator * iter , ListBase * lb , IteratorSkipFunc skip )
2008-10-31 23:50:02 +00:00
{
2008-11-17 18:44:06 +00:00
ListBaseIterator * internal ;
internal = MEM_callocN ( sizeof ( ListBaseIterator ) , " ListBaseIterator " ) ;
2009-06-19 14:56:49 +00:00
internal - > link = ( lb ) ? lb - > first : NULL ;
2008-11-24 12:12:24 +00:00
internal - > skip = skip ;
2008-11-17 18:44:06 +00:00
iter - > internal = internal ;
iter - > valid = ( internal - > link ! = NULL ) ;
2008-11-24 12:12:24 +00:00
if ( skip & & iter - > valid & & skip ( iter , internal - > link ) )
rna_iterator_listbase_next ( iter ) ;
2008-10-31 23:50:02 +00:00
}
void rna_iterator_listbase_next ( CollectionPropertyIterator * iter )
{
2008-11-17 18:44:06 +00:00
ListBaseIterator * internal = iter - > internal ;
2008-11-24 12:12:24 +00:00
if ( internal - > skip ) {
do {
internal - > link = internal - > link - > next ;
iter - > valid = ( internal - > link ! = NULL ) ;
} while ( iter - > valid & & internal - > skip ( iter , internal - > link ) ) ;
}
else {
internal - > link = internal - > link - > next ;
iter - > valid = ( internal - > link ! = NULL ) ;
}
2008-10-31 23:50:02 +00:00
}
void * rna_iterator_listbase_get ( CollectionPropertyIterator * iter )
{
2008-11-17 18:44:06 +00:00
ListBaseIterator * internal = iter - > internal ;
return internal - > link ;
}
void rna_iterator_listbase_end ( CollectionPropertyIterator * iter )
{
MEM_freeN ( iter - > internal ) ;
2009-06-05 19:43:33 +00:00
iter - > internal = NULL ;
2008-10-31 23:50:02 +00:00
}
2009-07-13 19:33:59 +00:00
void rna_iterator_array_begin ( CollectionPropertyIterator * iter , void * ptr , int itemsize , int length , int free_ptr , IteratorSkipFunc skip )
2008-10-31 23:50:02 +00:00
{
ArrayIterator * internal ;
2008-11-24 12:12:24 +00:00
if ( ptr = = NULL )
length = 0 ;
2008-10-31 23:50:02 +00:00
internal = MEM_callocN ( sizeof ( ArrayIterator ) , " ArrayIterator " ) ;
internal - > ptr = ptr ;
2009-07-13 19:33:59 +00:00
internal - > free_ptr = free_ptr ? ptr : NULL ;
2008-11-01 00:23:08 +00:00
internal - > endptr = ( ( char * ) ptr ) + length * itemsize ;
2008-11-07 02:58:25 +00:00
internal - > itemsize = itemsize ;
2008-11-24 12:12:24 +00:00
internal - > skip = skip ;
2008-10-31 23:50:02 +00:00
iter - > internal = internal ;
iter - > valid = ( internal - > ptr ! = internal - > endptr ) ;
2008-11-24 12:12:24 +00:00
if ( skip & & iter - > valid & & skip ( iter , internal - > ptr ) )
rna_iterator_array_next ( iter ) ;
2008-10-31 23:50:02 +00:00
}
void rna_iterator_array_next ( CollectionPropertyIterator * iter )
{
ArrayIterator * internal = iter - > internal ;
2008-11-24 12:12:24 +00:00
if ( internal - > skip ) {
do {
internal - > ptr + = internal - > itemsize ;
iter - > valid = ( internal - > ptr ! = internal - > endptr ) ;
} while ( iter - > valid & & internal - > skip ( iter , internal - > ptr ) ) ;
}
else {
internal - > ptr + = internal - > itemsize ;
iter - > valid = ( internal - > ptr ! = internal - > endptr ) ;
}
2008-10-31 23:50:02 +00:00
}
void * rna_iterator_array_get ( CollectionPropertyIterator * iter )
{
ArrayIterator * internal = iter - > internal ;
return internal - > ptr ;
}
2008-11-26 22:24:26 +00:00
void * rna_iterator_array_dereference_get ( CollectionPropertyIterator * iter )
{
ArrayIterator * internal = iter - > internal ;
/* for ** arrays */
return * ( void * * ) ( internal - > ptr ) ;
}
2008-10-31 23:50:02 +00:00
void rna_iterator_array_end ( CollectionPropertyIterator * iter )
{
2009-07-13 19:33:59 +00:00
ArrayIterator * internal = iter - > internal ;
2009-08-16 15:46:09 +00:00
if ( internal - > free_ptr ) {
2009-07-13 19:33:59 +00:00
MEM_freeN ( internal - > free_ptr ) ;
2009-08-16 15:46:09 +00:00
internal - > free_ptr = NULL ;
}
2008-10-31 23:50:02 +00:00
MEM_freeN ( iter - > internal ) ;
2009-06-05 19:43:33 +00:00
iter - > internal = NULL ;
2008-10-31 23:50:02 +00:00
}
2008-11-07 02:58:25 +00:00
/* RNA Path - Experiment */
static char * rna_path_token ( const char * * path , char * fixedbuf , int fixedlen , int bracket )
{
const char * p ;
char * buf ;
int i , j , len , escape ;
len = 0 ;
if ( bracket ) {
/* get data between [], check escaping ] with \] */
if ( * * path = = ' [ ' ) ( * path ) + + ;
else return NULL ;
p = * path ;
escape = 0 ;
while ( * p & & ( * p ! = ' ] ' | | escape ) ) {
escape = ( * p = = ' \\ ' ) ;
len + + ;
p + + ;
}
if ( * p ! = ' ] ' ) return NULL ;
}
else {
/* get data until . or [ */
p = * path ;
while ( * p & & * p ! = ' . ' & & * p ! = ' [ ' ) {
len + + ;
p + + ;
}
}
/* empty, return */
if ( len = = 0 )
return NULL ;
/* try to use fixed buffer if possible */
if ( len + 1 < fixedlen )
buf = fixedbuf ;
else
buf = MEM_callocN ( sizeof ( char ) * ( len + 1 ) , " rna_path_token " ) ;
/* copy string, taking into account escaped ] */
2009-06-19 23:05:21 +00:00
if ( bracket ) {
for ( p = * path , i = 0 , j = 0 ; i < len ; i + + , p + + ) {
if ( * p = = ' \\ ' & & * ( p + 1 ) = = ' ] ' ) ;
else buf [ j + + ] = * p ;
}
2008-11-07 02:58:25 +00:00
2009-06-19 23:05:21 +00:00
buf [ j ] = 0 ;
}
else {
memcpy ( buf , * path , sizeof ( char ) * len ) ;
buf [ len ] = ' \0 ' ;
}
2008-11-07 02:58:25 +00:00
/* set path to start of next token */
if ( * p = = ' ] ' ) p + + ;
if ( * p = = ' . ' ) p + + ;
* path = p ;
return buf ;
}
int RNA_path_resolve ( PointerRNA * ptr , const char * path , PointerRNA * r_ptr , PropertyRNA * * r_prop )
{
2009-06-19 23:05:21 +00:00
PropertyRNA * prop ;
2008-11-07 02:58:25 +00:00
PointerRNA curptr , nextptr ;
char fixedbuf [ 256 ] , * token ;
int len , intkey ;
prop = NULL ;
curptr = * ptr ;
while ( * path ) {
/* look up property name in current struct */
token = rna_path_token ( & path , fixedbuf , sizeof ( fixedbuf ) , 0 ) ;
if ( ! token )
return 0 ;
2009-06-19 23:05:21 +00:00
prop = RNA_struct_find_property ( & curptr , token ) ;
2008-11-07 02:58:25 +00:00
if ( token ! = fixedbuf )
MEM_freeN ( token ) ;
if ( ! prop )
return 0 ;
/* now look up the value of this property if it is a pointer or
* collection , otherwise return the property rna so that the
* caller can read the value of the property itself */
2009-04-19 13:37:59 +00:00
if ( RNA_property_type ( prop ) = = PROP_POINTER ) {
2009-02-02 19:57:57 +00:00
nextptr = RNA_property_pointer_get ( & curptr , prop ) ;
2008-11-07 02:58:25 +00:00
if ( nextptr . data )
curptr = nextptr ;
else
return 0 ;
}
2009-04-19 13:37:59 +00:00
else if ( RNA_property_type ( prop ) = = PROP_COLLECTION & & * path ) {
2008-11-07 02:58:25 +00:00
/* resolve the lookup with [] brackets */
token = rna_path_token ( & path , fixedbuf , sizeof ( fixedbuf ) , 1 ) ;
if ( ! token )
return 0 ;
len = strlen ( token ) ;
2009-01-23 02:59:21 +00:00
2008-11-07 02:58:25 +00:00
/* check for "" to see if it is a string */
2009-01-23 02:50:04 +00:00
if ( len > = 2 & & token [ 0 ] = = ' " ' & & token [ len - 1 ] = = ' " ' ) {
2008-11-07 02:58:25 +00:00
/* strip away "" */
2009-01-23 02:50:04 +00:00
token [ len - 1 ] = 0 ;
2008-11-24 15:51:55 +00:00
RNA_property_collection_lookup_string ( & curptr , prop , token + 1 , & nextptr ) ;
2008-11-07 02:58:25 +00:00
}
else {
/* otherwise do int lookup */
intkey = atoi ( token ) ;
2008-11-24 15:51:55 +00:00
RNA_property_collection_lookup_int ( & curptr , prop , intkey , & nextptr ) ;
2008-11-07 02:58:25 +00:00
}
if ( token ! = fixedbuf )
MEM_freeN ( token ) ;
if ( nextptr . data )
curptr = nextptr ;
else
return 0 ;
}
}
* r_ptr = curptr ;
* r_prop = prop ;
return 1 ;
}
2008-11-17 18:44:06 +00:00
char * RNA_path_append ( const char * path , PointerRNA * ptr , PropertyRNA * prop , int intkey , const char * strkey )
2008-11-07 02:58:25 +00:00
{
DynStr * dynstr ;
const char * s ;
char appendstr [ 128 ] , * result ;
dynstr = BLI_dynstr_new ( ) ;
2008-11-14 18:46:57 +00:00
/* add .identifier */
2008-11-07 02:58:25 +00:00
if ( path ) {
BLI_dynstr_append ( dynstr , ( char * ) path ) ;
if ( * path )
BLI_dynstr_append ( dynstr , " . " ) ;
}
2009-04-19 13:37:59 +00:00
BLI_dynstr_append ( dynstr , ( char * ) RNA_property_identifier ( prop ) ) ;
2008-11-07 02:58:25 +00:00
2009-04-19 13:37:59 +00:00
if ( RNA_property_type ( prop ) = = PROP_COLLECTION ) {
2008-11-07 02:58:25 +00:00
/* add ["strkey"] or [intkey] */
BLI_dynstr_append ( dynstr , " [ " ) ;
if ( strkey ) {
BLI_dynstr_append ( dynstr , " \" " ) ;
for ( s = strkey ; * s ; s + + ) {
if ( * s = = ' [ ' ) {
appendstr [ 0 ] = ' \\ ' ;
appendstr [ 1 ] = * s ;
appendstr [ 2 ] = 0 ;
}
else {
appendstr [ 0 ] = * s ;
appendstr [ 1 ] = 0 ;
}
BLI_dynstr_append ( dynstr , appendstr ) ;
}
BLI_dynstr_append ( dynstr , " \" " ) ;
}
else {
sprintf ( appendstr , " %d " , intkey ) ;
BLI_dynstr_append ( dynstr , appendstr ) ;
}
BLI_dynstr_append ( dynstr , " ] " ) ;
}
result = BLI_dynstr_get_cstring ( dynstr ) ;
BLI_dynstr_free ( dynstr ) ;
return result ;
}
char * RNA_path_back ( const char * path )
{
char fixedbuf [ 256 ] ;
const char * previous , * current ;
char * result , * token ;
int i ;
if ( ! path )
return NULL ;
previous = NULL ;
current = path ;
/* parse token by token until the end, then we back up to the previous
* position and strip of the next token to get the path one step back */
while ( * current ) {
token = rna_path_token ( & current , fixedbuf , sizeof ( fixedbuf ) , 0 ) ;
if ( ! token )
return NULL ;
if ( token ! = fixedbuf )
MEM_freeN ( token ) ;
/* in case of collection we also need to strip off [] */
token = rna_path_token ( & current , fixedbuf , sizeof ( fixedbuf ) , 1 ) ;
if ( token & & token ! = fixedbuf )
MEM_freeN ( token ) ;
if ( ! * current )
break ;
previous = current ;
}
if ( ! previous )
return NULL ;
/* copy and strip off last token */
i = previous - path ;
result = BLI_strdup ( path ) ;
if ( i > 0 & & result [ i - 1 ] = = ' . ' ) i - - ;
result [ i ] = 0 ;
return result ;
}
2009-09-17 10:14:56 +00:00
char * RNA_path_from_ID_to_struct ( PointerRNA * ptr )
2009-03-25 20:29:01 +00:00
{
2009-09-17 10:14:56 +00:00
char * ptrpath = NULL ;
2009-03-25 20:29:01 +00:00
2009-09-17 10:14:56 +00:00
if ( ! ptr - > id . data | | ! ptr - > data )
2009-03-25 20:29:01 +00:00
return NULL ;
2009-04-19 13:37:59 +00:00
if ( ! RNA_struct_is_ID ( ptr - > type ) ) {
2009-05-11 05:18:49 +00:00
if ( ptr - > type - > path ) {
/* if type has a path to some ID, use it */
ptrpath = ptr - > type - > path ( ptr ) ;
2009-05-11 02:26:18 +00:00
}
2009-05-11 05:18:49 +00:00
else if ( ptr - > type - > nested ) {
PointerRNA parentptr ;
PropertyRNA * userprop ;
/* find the property in the struct we're nested in that references this struct, and
* use its identifier as the first part of the path used . . .
*/
RNA_pointer_create ( ptr - > id . data , ptr - > type - > nested , ptr - > data , & parentptr ) ;
userprop = RNA_struct_find_nested ( & parentptr , ptr - > type ) ;
if ( userprop )
ptrpath = BLI_strdup ( RNA_property_identifier ( userprop ) ) ;
2009-05-11 02:26:18 +00:00
else
2009-05-11 05:18:49 +00:00
return NULL ; // can't do anything about this case yet...
2009-05-11 02:26:18 +00:00
}
2009-05-11 05:18:49 +00:00
else
return NULL ;
2009-03-25 20:29:01 +00:00
}
2009-09-17 10:14:56 +00:00
return ptrpath ;
}
char * RNA_path_from_ID_to_property ( PointerRNA * ptr , PropertyRNA * prop )
{
const char * propname ;
char * ptrpath , * path ;
if ( ! ptr - > id . data | | ! ptr - > data | | ! prop )
return NULL ;
/* path from ID to the struct holding this property */
ptrpath = RNA_path_from_ID_to_struct ( ptr ) ;
2009-03-25 20:29:01 +00:00
2009-04-19 13:37:59 +00:00
propname = RNA_property_identifier ( prop ) ;
2009-03-25 20:29:01 +00:00
if ( ptrpath ) {
path = BLI_sprintfN ( " %s.%s " , ptrpath , propname ) ;
MEM_freeN ( ptrpath ) ;
}
else
path = BLI_strdup ( propname ) ;
return path ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
/* Quick name based property access */
int RNA_boolean_get ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_boolean_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_boolean_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
void RNA_boolean_set ( PointerRNA * ptr , const char * name , int value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_boolean_set ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_boolean_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_boolean_get_array ( PointerRNA * ptr , const char * name , int * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_boolean_get_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_boolean_get_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_boolean_set_array ( PointerRNA * ptr , const char * name , const int * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_boolean_set_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_boolean_set_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
int RNA_int_get ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_int_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_int_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
void RNA_int_set ( PointerRNA * ptr , const char * name , int value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_int_set ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_int_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_int_get_array ( PointerRNA * ptr , const char * name , int * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_int_get_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_int_get_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_int_set_array ( PointerRNA * ptr , const char * name , const int * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_int_set_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_int_set_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
float RNA_float_get ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_float_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_float_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
void RNA_float_set ( PointerRNA * ptr , const char * name , float value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_float_set ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_float_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_float_get_array ( PointerRNA * ptr , const char * name , float * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_float_get_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_float_get_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_float_set_array ( PointerRNA * ptr , const char * name , const float * values )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop )
RNA_property_float_set_array ( ptr , prop , values ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_float_set_array: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
int RNA_enum_get ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_enum_get ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_enum_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
void RNA_enum_set ( PointerRNA * ptr , const char * name , int value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_enum_set ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_enum_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_enum_is_equal ( bContext * C , PointerRNA * ptr , const char * name , const char * enumname )
2008-12-24 10:50:39 +00:00
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
EnumPropertyItem * item ;
int free ;
2008-12-24 10:50:39 +00:00
if ( prop ) {
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
RNA_property_enum_items ( C , ptr , prop , & item , NULL , & free ) ;
2008-12-24 10:50:39 +00:00
2009-06-23 12:36:15 +00:00
for ( ; item - > identifier ; item + + )
if ( strcmp ( item - > identifier , enumname ) = = 0 )
return ( item - > value = = RNA_property_enum_get ( ptr , prop ) ) ;
2008-12-24 10:50:39 +00:00
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
if ( free )
MEM_freeN ( item ) ;
2008-12-24 10:50:39 +00:00
printf ( " RNA_enum_is_equal: %s.%s item %s not found. \n " , ptr - > type - > identifier , name , enumname ) ;
return 0 ;
}
else {
printf ( " RNA_enum_is_equal: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_enum_value_from_id ( EnumPropertyItem * item , const char * identifier , int * value )
2009-04-01 12:43:07 +00:00
{
for ( ; item - > identifier ; item + + ) {
2009-04-07 00:49:39 +00:00
if ( strcmp ( item - > identifier , identifier ) = = 0 ) {
2009-04-01 12:43:07 +00:00
* value = item - > value ;
return 1 ;
}
}
return 0 ;
}
RNA
* Enums can now be dynamically created in the _itemf callback,
using RNA_enum_item(s)_add, RNA_enum_item_end. All places asking
for enum items now need to potentially free the items.
* This callback now also gets context, this was added specifically
for operators. This doesn't fit design well at all, needed to do
some ugly hacks, but can't find a good solution at the moment.
* All enums must have a default list of items too, even with an
_itemf callback, for docs and fallback in case there is no context.
* Used by MESH_OT_merge, MESH_OT_select_similar, TFM_OT_select_orientation.
* Also changes some operator properties that were enums to booleas
(unselected, deselect), to make them consistent with other ops.
2009-07-10 19:56:13 +00:00
int RNA_enum_id_from_value ( EnumPropertyItem * item , int value , const char * * identifier )
2009-04-01 12:43:07 +00:00
{
for ( ; item - > identifier ; item + + ) {
2009-04-07 00:49:39 +00:00
if ( item - > value = = value ) {
2009-04-01 12:43:07 +00:00
* identifier = item - > identifier ;
return 1 ;
}
}
return 0 ;
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
void RNA_string_get ( PointerRNA * ptr , const char * name , char * value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_string_get ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_string_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
char * RNA_string_get_alloc ( PointerRNA * ptr , const char * name , char * fixedbuf , int fixedlen )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_string_get_alloc ( ptr , prop , fixedbuf , fixedlen ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_string_get_alloc: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
int RNA_string_length ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
2008-11-24 15:51:55 +00:00
return RNA_property_string_length ( ptr , prop ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
}
else {
printf ( " RNA_string_length: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
void RNA_string_set ( PointerRNA * ptr , const char * name , const char * value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
2008-11-24 15:51:55 +00:00
RNA_property_string_set ( ptr , prop , value ) ;
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
else
printf ( " RNA_string_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
2009-02-02 19:57:57 +00:00
PointerRNA RNA_pointer_get ( PointerRNA * ptr , const char * name )
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;
2008-12-26 20:38:52 +00:00
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
2009-02-02 19:57:57 +00:00
if ( prop ) {
return RNA_property_pointer_get ( ptr , prop ) ;
}
else {
PointerRNA result ;
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;
2008-12-26 20:38:52 +00:00
printf ( " RNA_pointer_get: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
2009-02-02 19:57:57 +00:00
memset ( & result , 0 , sizeof ( result ) ) ;
return result ;
}
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;
2008-12-26 20:38:52 +00:00
}
2009-07-25 19:10:24 +00:00
void RNA_pointer_set ( PointerRNA * ptr , const char * name , PointerRNA ptr_value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
RNA_property_pointer_set ( ptr , prop , ptr_value ) ;
}
else {
printf ( " RNA_pointer_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
}
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;
2008-12-26 20:38:52 +00:00
void RNA_pointer_add ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
RNA_property_pointer_add ( ptr , prop ) ;
else
printf ( " RNA_pointer_set: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_collection_begin ( PointerRNA * ptr , const char * name , CollectionPropertyIterator * iter )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
RNA_property_collection_begin ( ptr , prop , iter ) ;
else
printf ( " RNA_collection_begin: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_collection_add ( PointerRNA * ptr , const char * name , PointerRNA * r_value )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
RNA_property_collection_add ( ptr , prop , r_value ) ;
else
printf ( " RNA_collection_add: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
void RNA_collection_clear ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop )
RNA_property_collection_clear ( ptr , prop ) ;
else
printf ( " RNA_collection_clear: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
}
int RNA_collection_length ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
return RNA_property_collection_length ( ptr , prop ) ;
}
else {
printf ( " RNA_collection_length: %s.%s not found. \n " , ptr - > type - > identifier , name ) ;
return 0 ;
}
}
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
int RNA_property_is_set ( PointerRNA * ptr , const char * name )
{
PropertyRNA * prop = RNA_struct_find_property ( ptr , name ) ;
if ( prop ) {
return ( rna_idproperty_find ( ptr , name ) ! = NULL ) ;
}
else {
2009-09-10 11:04:53 +00:00
// printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
RNA
* More ID property support. What was already possible was showing
ID properties as RNA properties. Now it is possible to define
RNA properties and have an ID property automatically created the
first time it is set (if not set it retuns the default).
* Added support for defining RNA structs and properties at runtime.
This is useful for python and plugins, and could also be used
for operators, not sure yet what is best there, they could be done
in preprocess for speed, but not sure how to do that while keeping
operator registration a single function.
* Added quick functions to get/set properties based on names, to be
used for operators.
* Added some simple support for inheritance, was already doing this
but having it as a feature simplifies things. Two things were added
for this: when defining a struct you can give a 'from' struct whose
properties will be copied, and structs like ID, operator, modifier,
can define a refine callback that will return the more specific type
of the struct like ID -> Object, Mesh, .. .
* Added simple windowmanager wrap with only the registered operators
list, used for testing RNA for operators.
2008-11-21 02:23:46 +00:00
return 0 ;
}
}
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;
2008-12-26 20:38:52 +00:00
/* string representation of a property, python
* compatible but can be used for display too */
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
char * RNA_pointer_as_string ( PointerRNA * ptr )
{
DynStr * dynstr = BLI_dynstr_new ( ) ;
char * cstring ;
const char * propname ;
int first_time = 1 ;
BLI_dynstr_append ( dynstr , " { " ) ;
2009-06-24 21:27:10 +00:00
RNA_STRUCT_BEGIN ( ptr , prop ) {
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
propname = RNA_property_identifier ( prop ) ;
if ( strcmp ( propname , " rna_type " ) = = 0 )
continue ;
if ( first_time = = 0 )
BLI_dynstr_append ( dynstr , " , " ) ;
first_time = 0 ;
2009-08-16 14:43:08 +00:00
cstring = RNA_property_as_string ( NULL , ptr , prop ) ;
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
BLI_dynstr_appendf ( dynstr , " \" %s \" :%s " , propname , cstring ) ;
MEM_freeN ( cstring ) ;
}
2009-06-24 21:27:10 +00:00
RNA_STRUCT_END ;
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
BLI_dynstr_append ( dynstr , " } " ) ;
cstring = BLI_dynstr_get_cstring ( dynstr ) ;
BLI_dynstr_free ( dynstr ) ;
return cstring ;
}
2009-08-16 14:43:08 +00:00
char * RNA_property_as_string ( bContext * C , PointerRNA * ptr , PropertyRNA * prop )
2008-12-26 03:56:52 +00:00
{
2009-04-19 13:37:59 +00:00
int type = RNA_property_type ( prop ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
int len = RNA_property_array_length ( ptr , prop ) ;
2008-12-26 03:56:52 +00:00
int i ;
DynStr * dynstr = BLI_dynstr_new ( ) ;
char * cstring ;
/* see if we can coorce into a python type - PropertyType */
switch ( type ) {
case PROP_BOOLEAN :
2009-04-07 00:49:39 +00:00
if ( len = = 0 ) {
2008-12-26 03:56:52 +00:00
BLI_dynstr_append ( dynstr , RNA_property_boolean_get ( ptr , prop ) ? " True " : " False " ) ;
}
else {
BLI_dynstr_append ( dynstr , " ( " ) ;
for ( i = 0 ; i < len ; i + + ) {
2009-02-02 19:57:57 +00:00
BLI_dynstr_appendf ( dynstr , i ? " , %s " : " %s " , RNA_property_boolean_get_index ( ptr , prop , i ) ? " True " : " False " ) ;
2008-12-26 03:56:52 +00:00
}
2009-07-19 00:49:44 +00:00
if ( len = = 1 )
BLI_dynstr_append ( dynstr , " , " ) ; /* otherwise python wont see it as a tuple */
2008-12-26 03:56:52 +00:00
BLI_dynstr_append ( dynstr , " ) " ) ;
}
break ;
case PROP_INT :
2009-04-07 00:49:39 +00:00
if ( len = = 0 ) {
2008-12-26 03:56:52 +00:00
BLI_dynstr_appendf ( dynstr , " %d " , RNA_property_int_get ( ptr , prop ) ) ;
}
else {
BLI_dynstr_append ( dynstr , " ( " ) ;
for ( i = 0 ; i < len ; i + + ) {
2009-02-02 19:57:57 +00:00
BLI_dynstr_appendf ( dynstr , i ? " , %d " : " %d " , RNA_property_int_get_index ( ptr , prop , i ) ) ;
2008-12-26 03:56:52 +00:00
}
2009-07-19 00:49:44 +00:00
if ( len = = 1 )
BLI_dynstr_append ( dynstr , " , " ) ; /* otherwise python wont see it as a tuple */
2008-12-26 03:56:52 +00:00
BLI_dynstr_append ( dynstr , " ) " ) ;
}
break ;
case PROP_FLOAT :
2009-04-07 00:49:39 +00:00
if ( len = = 0 ) {
Made modal operators print their operator string after executing
(when in debug "-d" mode only)
copy & paste duplicate and transform operations can now be copied from user input and pasted into ./test.py and run with the Pkey (fixed some minor bugs preventing this)
Would be nice if the "mode" setting used a proper RNA Enum rather then an int.
# example, duplicate and transform
bpyoperator.OBJECT_OT_add_duplicate(mode=1)
bpyoperator.TFM_OT_transform(mode=1, options=0, values=(-1.23989, 0.570745, 0, 0), constraint_orientation=0, constraint_mode=0, constraint_matrix=(0, 0, 0, 0, 0, 0, 0, 0, 0))
2009-01-18 07:35:44 +00:00
BLI_dynstr_appendf ( dynstr , " %g " , RNA_property_float_get ( ptr , prop ) ) ;
2008-12-26 03:56:52 +00:00
}
else {
BLI_dynstr_append ( dynstr , " ( " ) ;
for ( i = 0 ; i < len ; i + + ) {
2009-02-02 19:57:57 +00:00
BLI_dynstr_appendf ( dynstr , i ? " , %g " : " %g " , RNA_property_float_get_index ( ptr , prop , i ) ) ;
2008-12-26 03:56:52 +00:00
}
2009-07-19 00:49:44 +00:00
if ( len = = 1 )
BLI_dynstr_append ( dynstr , " , " ) ; /* otherwise python wont see it as a tuple */
2008-12-26 03:56:52 +00:00
BLI_dynstr_append ( dynstr , " ) " ) ;
}
break ;
case PROP_STRING :
{
/* string arrays dont exist */
char * buf ;
buf = RNA_property_string_get_alloc ( ptr , prop , NULL , - 1 ) ;
BLI_dynstr_appendf ( dynstr , " \" %s \" " , buf ) ;
MEM_freeN ( buf ) ;
break ;
}
case PROP_ENUM :
{
/* string arrays dont exist */
const char * identifier ;
int val = RNA_property_enum_get ( ptr , prop ) ;
2009-08-16 14:43:08 +00:00
if ( RNA_property_enum_identifier ( C , ptr , prop , val , & identifier ) ) {
2008-12-26 03:56:52 +00:00
BLI_dynstr_appendf ( dynstr , " '%s' " , identifier ) ;
}
else {
BLI_dynstr_appendf ( dynstr , " '<UNKNOWN ENUM>' " , identifier ) ;
}
break ;
}
case PROP_POINTER :
{
BLI_dynstr_append ( dynstr , " '<POINTER>' " ) ; /* TODO */
break ;
}
case PROP_COLLECTION :
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
{
int first_time = 1 ;
CollectionPropertyIterator collect_iter ;
BLI_dynstr_append ( dynstr , " [ " ) ;
for ( RNA_property_collection_begin ( ptr , prop , & collect_iter ) ; collect_iter . valid ; RNA_property_collection_next ( & collect_iter ) ) {
PointerRNA itemptr = collect_iter . ptr ;
if ( first_time = = 0 )
BLI_dynstr_append ( dynstr , " , " ) ;
first_time = 0 ;
/* now get every prop of the collection */
cstring = RNA_pointer_as_string ( & itemptr ) ;
BLI_dynstr_append ( dynstr , cstring ) ;
MEM_freeN ( cstring ) ;
}
RNA_property_collection_end ( & collect_iter ) ;
BLI_dynstr_append ( dynstr , " ] " ) ;
2008-12-26 03:56:52 +00:00
break ;
PyRNA
- Support for python to convert a PyObject into a collection (uses a list of dicts - quite verbose :/)
- Operators can now take collection args when called from python.
- Support for printing operators that use collections (macro recording).
- Added RNA_pointer_as_string which prints all pointer prop values as a python dict.
Example that can run in the in test.py (F7 key)
bpy.ops.VIEW3D_OT_select_lasso(path=[{"loc":(0, 0), "time":0}, {"loc":(1000, 0), "time":0}, {"loc":(1000, 1000), "time":0}], type='SELECT')
for some reason lasso locations always print as 0,0. Need to look into why this is.
2009-06-05 12:48:58 +00:00
}
2008-12-26 03:56:52 +00:00
default :
BLI_dynstr_append ( dynstr , " '<UNKNOWN TYPE>' " ) ; /* TODO */
break ;
}
cstring = BLI_dynstr_get_cstring ( dynstr ) ;
BLI_dynstr_free ( dynstr ) ;
return cstring ;
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;
2008-12-26 20:38:52 +00:00
}
2008-12-31 13:16:37 +00:00
2009-04-07 00:49:39 +00:00
/* Function */
2009-04-19 13:37:59 +00:00
const char * RNA_function_identifier ( FunctionRNA * func )
2009-04-07 00:49:39 +00:00
{
return func - > identifier ;
}
2009-04-19 13:37:59 +00:00
PropertyRNA * RNA_function_return ( FunctionRNA * func )
2009-04-07 00:49:39 +00:00
{
return func - > ret ;
}
2009-04-19 13:37:59 +00:00
const char * RNA_function_ui_description ( FunctionRNA * func )
2009-04-07 00:49:39 +00:00
{
return func - > description ;
}
2009-04-19 13:37:59 +00:00
int RNA_function_flag ( FunctionRNA * func )
{
return func - > flag ;
}
2009-04-07 00:49:39 +00:00
PropertyRNA * RNA_function_get_parameter ( PointerRNA * ptr , FunctionRNA * func , int index )
{
PropertyRNA * parm ;
int i ;
parm = func - > cont . properties . first ;
for ( i = 0 ; parm ; parm = parm - > next , i + + )
if ( i = = index )
return parm ;
return NULL ;
}
PropertyRNA * RNA_function_find_parameter ( PointerRNA * ptr , FunctionRNA * func , const char * identifier )
{
PropertyRNA * parm ;
parm = func - > cont . properties . first ;
for ( ; parm ; parm = parm - > next )
if ( strcmp ( parm - > identifier , identifier ) = = 0 )
return parm ;
return NULL ;
}
2009-04-19 13:37:59 +00:00
const struct ListBase * RNA_function_defined_parameters ( FunctionRNA * func )
2009-04-07 00:49:39 +00:00
{
return & func - > cont . properties ;
}
/* Utility */
2009-07-17 02:31:28 +00:00
ParameterList * RNA_parameter_list_create ( ParameterList * parms , PointerRNA * ptr , FunctionRNA * func )
2009-04-07 00:49:39 +00:00
{
PropertyRNA * parm ;
2009-08-18 12:56:43 +00:00
void * data ;
int tot = 0 , size ;
2009-04-07 00:49:39 +00:00
2009-08-18 12:56:43 +00:00
/* allocate data */
2009-07-17 02:31:28 +00:00
for ( parm = func - > cont . properties . first ; parm ; parm = parm - > next )
2009-04-07 00:49:39 +00:00
tot + = rna_parameter_size ( parm ) ;
parms - > data = MEM_callocN ( tot , " RNA_parameter_list_create " ) ;
parms - > func = func ;
2009-07-17 02:31:28 +00:00
parms - > tot = tot ;
2009-04-07 00:49:39 +00:00
2009-08-18 12:56:43 +00:00
/* set default values */
data = parms - > data ;
for ( parm = func - > cont . properties . first ; parm ; parm = parm - > next ) {
size = rna_parameter_size ( parm ) ;
if ( ! ( parm - > flag & PROP_REQUIRED ) ) {
switch ( parm - > type ) {
case PROP_BOOLEAN :
2009-09-09 19:40:46 +00:00
if ( parm - > arraydimension ) memcpy ( data , & ( ( BooleanPropertyRNA * ) parm ) - > defaultarray , size ) ;
2009-08-18 12:56:43 +00:00
else memcpy ( data , & ( ( BooleanPropertyRNA * ) parm ) - > defaultvalue , size ) ;
break ;
case PROP_INT :
2009-09-09 19:40:46 +00:00
if ( parm - > arraydimension ) memcpy ( data , & ( ( IntPropertyRNA * ) parm ) - > defaultarray , size ) ;
2009-08-18 12:56:43 +00:00
else memcpy ( data , & ( ( IntPropertyRNA * ) parm ) - > defaultvalue , size ) ;
break ;
case PROP_FLOAT :
2009-09-09 19:40:46 +00:00
if ( parm - > arraydimension ) memcpy ( data , & ( ( FloatPropertyRNA * ) parm ) - > defaultarray , size ) ;
2009-08-18 12:56:43 +00:00
else memcpy ( data , & ( ( FloatPropertyRNA * ) parm ) - > defaultvalue , size ) ;
break ;
case PROP_ENUM :
memcpy ( data , & ( ( EnumPropertyRNA * ) parm ) - > defaultvalue , size ) ;
break ;
case PROP_STRING : {
const char * defvalue = ( ( StringPropertyRNA * ) parm ) - > defaultvalue ;
if ( defvalue & & defvalue [ 0 ] )
memcpy ( data , & defvalue , size ) ;
break ;
}
case PROP_POINTER :
case PROP_COLLECTION :
break ;
}
}
data = ( ( char * ) data ) + size ;
}
2009-04-07 00:49:39 +00:00
return parms ;
}
void RNA_parameter_list_free ( ParameterList * parms )
{
2009-06-27 01:10:39 +00:00
PropertyRNA * parm ;
int tot ;
parm = parms - > func - > cont . properties . first ;
for ( tot = 0 ; parm ; parm = parm - > next ) {
if ( parm - > type = = PROP_COLLECTION )
BLI_freelistN ( ( ListBase * ) ( ( char * ) parms - > data + tot ) ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
else if ( parm - > flag & PROP_DYNAMIC ) {
/* for dynamic arrays and strings, data is a pointer to an array */
char * array = * ( char * * ) ( ( char * ) parms - > data + tot ) ;
if ( array )
MEM_freeN ( array ) ;
}
2009-06-27 01:10:39 +00:00
tot + = rna_parameter_size ( parm ) ;
}
2009-04-07 00:49:39 +00:00
MEM_freeN ( parms - > data ) ;
2009-06-05 19:43:33 +00:00
parms - > data = NULL ;
2009-04-07 00:49:39 +00:00
parms - > func = NULL ;
2009-07-17 02:31:28 +00:00
}
2009-04-07 00:49:39 +00:00
2009-07-17 02:31:28 +00:00
int RNA_parameter_list_size ( ParameterList * parms )
{
return parms - > tot ;
2009-04-07 00:49:39 +00:00
}
void RNA_parameter_list_begin ( ParameterList * parms , ParameterIterator * iter )
{
PropertyType ptype ;
RNA_pointer_create ( NULL , & RNA_Function , parms - > func , & iter - > funcptr ) ;
iter - > parms = parms ;
iter - > parm = parms - > func - > cont . properties . first ;
iter - > valid = iter - > parm ! = NULL ;
iter - > offset = 0 ;
if ( iter - > valid ) {
iter - > size = rna_parameter_size ( iter - > parm ) ;
iter - > data = ( ( ( char * ) iter - > parms - > data ) + iter - > offset ) ;
2009-04-19 13:37:59 +00:00
ptype = RNA_property_type ( iter - > parm ) ;
2009-04-07 00:49:39 +00:00
}
}
void RNA_parameter_list_next ( ParameterIterator * iter )
{
PropertyType ptype ;
iter - > offset + = iter - > size ;
iter - > parm = iter - > parm - > next ;
iter - > valid = iter - > parm ! = NULL ;
if ( iter - > valid ) {
iter - > size = rna_parameter_size ( iter - > parm ) ;
iter - > data = ( ( ( char * ) iter - > parms - > data ) + iter - > offset ) ;
2009-04-19 13:37:59 +00:00
ptype = RNA_property_type ( iter - > parm ) ;
2009-04-07 00:49:39 +00:00
}
}
void RNA_parameter_list_end ( ParameterIterator * iter )
{
/* nothing to do */
}
void RNA_parameter_get ( ParameterList * parms , PropertyRNA * parm , void * * value )
{
ParameterIterator iter ;
RNA_parameter_list_begin ( parms , & iter ) ;
for ( ; iter . valid ; RNA_parameter_list_next ( & iter ) )
if ( iter . parm = = parm )
break ;
if ( iter . valid )
* value = iter . data ;
else
* value = NULL ;
RNA_parameter_list_end ( & iter ) ;
}
void RNA_parameter_get_lookup ( ParameterList * parms , const char * identifier , void * * value )
{
PropertyRNA * parm ;
parm = parms - > func - > cont . properties . first ;
for ( ; parm ; parm = parm - > next )
2009-04-19 13:37:59 +00:00
if ( strcmp ( RNA_property_identifier ( parm ) , identifier ) = = 0 )
2009-04-07 00:49:39 +00:00
break ;
if ( parm )
RNA_parameter_get ( parms , parm , value ) ;
}
void RNA_parameter_set ( ParameterList * parms , PropertyRNA * parm , void * value )
{
ParameterIterator iter ;
RNA_parameter_list_begin ( parms , & iter ) ;
for ( ; iter . valid ; RNA_parameter_list_next ( & iter ) )
if ( iter . parm = = parm )
break ;
if ( iter . valid )
memcpy ( iter . data , value , iter . size ) ;
RNA_parameter_list_end ( & iter ) ;
}
void RNA_parameter_set_lookup ( ParameterList * parms , const char * identifier , void * value )
{
PropertyRNA * parm ;
parm = parms - > func - > cont . properties . first ;
for ( ; parm ; parm = parm - > next )
2009-04-19 13:37:59 +00:00
if ( strcmp ( RNA_property_identifier ( parm ) , identifier ) = = 0 )
2009-04-07 00:49:39 +00:00
break ;
if ( parm )
RNA_parameter_set ( parms , parm , value ) ;
}
2009-06-18 19:48:55 +00:00
int RNA_function_call ( bContext * C , ReportList * reports , PointerRNA * ptr , FunctionRNA * func , ParameterList * parms )
2009-04-07 00:49:39 +00:00
{
if ( func - > call ) {
2009-06-18 19:48:55 +00:00
func - > call ( C , reports , ptr , parms ) ;
2009-04-07 00:49:39 +00:00
return 0 ;
}
2009-04-11 12:44:01 +00:00
return - 1 ;
2009-04-07 00:49:39 +00:00
}
2009-06-18 19:48:55 +00:00
int RNA_function_call_lookup ( bContext * C , ReportList * reports , PointerRNA * ptr , const char * identifier , ParameterList * parms )
2009-04-07 00:49:39 +00:00
{
FunctionRNA * func ;
func = RNA_struct_find_function ( ptr , identifier ) ;
if ( func )
2009-06-18 19:48:55 +00:00
return RNA_function_call ( C , reports , ptr , func , parms ) ;
2009-04-07 00:49:39 +00:00
2009-04-11 12:44:01 +00:00
return - 1 ;
2009-04-07 00:49:39 +00:00
}
2009-06-18 19:48:55 +00:00
int RNA_function_call_direct ( bContext * C , ReportList * reports , PointerRNA * ptr , FunctionRNA * func , const char * format , . . . )
2009-04-07 00:49:39 +00:00
{
va_list args ;
int ret ;
va_start ( args , format ) ;
2009-06-18 19:48:55 +00:00
ret = RNA_function_call_direct_va ( C , reports , ptr , func , format , args ) ;
2009-04-07 00:49:39 +00:00
va_end ( args ) ;
return ret ;
}
2009-06-18 19:48:55 +00:00
int RNA_function_call_direct_lookup ( bContext * C , ReportList * reports , PointerRNA * ptr , const char * identifier , const char * format , . . . )
2009-04-07 00:49:39 +00:00
{
FunctionRNA * func ;
func = RNA_struct_find_function ( ptr , identifier ) ;
if ( func ) {
va_list args ;
int ret ;
va_start ( args , format ) ;
2009-06-18 19:48:55 +00:00
ret = RNA_function_call_direct_va ( C , reports , ptr , func , format , args ) ;
2009-04-07 00:49:39 +00:00
va_end ( args ) ;
return ret ;
}
2009-04-11 12:44:01 +00:00
return - 1 ;
2009-04-07 00:49:39 +00:00
}
2009-04-11 15:46:35 +00:00
static int rna_function_format_array_length ( const char * format , int ofs , int flen )
{
char lenbuf [ 16 ] ;
int idx = 0 ;
if ( format [ ofs + + ] = = ' [ ' )
for ( ; ofs < flen & & format [ ofs ] ! = ' ] ' & & idx < sizeof ( * lenbuf ) - 1 ; idx + + , ofs + + )
lenbuf [ idx ] = format [ ofs ] ;
if ( ofs < flen & & format [ ofs + + ] = = ' ] ' ) {
/* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
lenbuf [ idx ] = ' \0 ' ;
return atoi ( lenbuf ) ;
}
return 0 ;
}
static int rna_function_parameter_parse ( PointerRNA * ptr , PropertyRNA * prop , PropertyType type , char ftype , int len , void * dest , void * src , StructRNA * srna , const char * tid , const char * fid , const char * pid )
{
/* ptr is always a function pointer, prop always a parameter */
switch ( type ) {
case PROP_BOOLEAN :
{
if ( ftype ! = ' b ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, a boolean was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
if ( len = = 0 )
* ( ( int * ) dest ) = * ( ( int * ) src ) ;
else
memcpy ( dest , src , len * sizeof ( int ) ) ;
break ;
}
case PROP_INT :
{
if ( ftype ! = ' i ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, an integer was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
if ( len = = 0 )
* ( ( int * ) dest ) = * ( ( int * ) src ) ;
else
memcpy ( dest , src , len * sizeof ( int ) ) ;
break ;
}
case PROP_FLOAT :
{
if ( ftype ! = ' f ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, a float was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
if ( len = = 0 )
* ( ( float * ) dest ) = * ( ( float * ) src ) ;
else
memcpy ( dest , src , len * sizeof ( float ) ) ;
break ;
}
case PROP_STRING :
{
if ( ftype ! = ' s ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, a string was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
* ( ( char * * ) dest ) = * ( ( char * * ) src ) ;
break ;
}
case PROP_ENUM :
{
if ( ftype ! = ' e ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, an enum was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
* ( ( int * ) dest ) = * ( ( int * ) src ) ;
break ;
}
case PROP_POINTER :
{
StructRNA * ptype ;
if ( ftype ! = ' O ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, an object was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
2009-06-07 13:09:18 +00:00
ptype = RNA_property_pointer_type ( ptr , prop ) ;
2009-04-11 15:46:35 +00:00
2009-06-16 00:52:21 +00:00
if ( prop - > flag & PROP_RNAPTR ) {
2009-04-11 15:46:35 +00:00
* ( ( PointerRNA * ) dest ) = * ( ( PointerRNA * ) src ) ;
2009-07-01 19:56:50 +00:00
break ;
}
if ( ptype ! = srna & & ! RNA_struct_is_a ( srna , ptype ) ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s \n " , tid , fid , pid , RNA_struct_identifier ( ptype ) , RNA_struct_identifier ( srna ) ) ;
return - 1 ;
2009-04-11 15:46:35 +00:00
}
2009-07-01 19:56:50 +00:00
* ( ( void * * ) dest ) = * ( ( void * * ) src ) ;
2009-04-11 15:46:35 +00:00
break ;
}
case PROP_COLLECTION :
{
2009-07-01 19:56:50 +00:00
StructRNA * ptype ;
ListBase * lb , * clb ;
Link * link ;
CollectionPointerLink * clink ;
if ( ftype ! = ' C ' ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, a collection was expected \n " , tid , fid , pid ) ;
return - 1 ;
}
lb = ( ListBase * ) src ;
clb = ( ListBase * ) dest ;
ptype = RNA_property_pointer_type ( ptr , prop ) ;
if ( ptype ! = srna & & ! RNA_struct_is_a ( srna , ptype ) ) {
fprintf ( stderr , " %s.%s: wrong type for parameter %s, a collection of objects of type %s was expected, passed a collection of objects of type %s \n " , tid , fid , pid , RNA_struct_identifier ( ptype ) , RNA_struct_identifier ( srna ) ) ;
return - 1 ;
}
for ( link = lb - > first ; link ; link = link - > next ) {
clink = MEM_callocN ( sizeof ( CollectionPointerLink ) , " CCollectionPointerLink " ) ;
RNA_pointer_create ( NULL , srna , link , & clink - > ptr ) ;
BLI_addtail ( clb , clink ) ;
}
break ;
2009-04-11 15:46:35 +00:00
}
default :
{
if ( len = = 0 )
fprintf ( stderr , " %s.%s: unknown type for parameter %s \n " , tid , fid , pid ) ;
else
fprintf ( stderr , " %s.%s: unknown array type for parameter %s \n " , tid , fid , pid ) ;
return - 1 ;
}
}
return 0 ;
}
2009-06-18 19:48:55 +00:00
int RNA_function_call_direct_va ( bContext * C , ReportList * reports , PointerRNA * ptr , FunctionRNA * func , const char * format , va_list args )
2009-04-07 00:49:39 +00:00
{
PointerRNA funcptr ;
2009-07-17 02:31:28 +00:00
ParameterList parms ;
2009-04-07 00:49:39 +00:00
ParameterIterator iter ;
PropertyRNA * pret , * parm ;
2009-04-11 12:44:01 +00:00
PropertyType type ;
int i , ofs , flen , flag , len , alen , err = 0 ;
2009-05-11 02:07:40 +00:00
const char * tid , * fid , * pid = NULL ;
2009-04-11 15:46:35 +00:00
char ftype ;
2009-05-11 02:07:40 +00:00
void * * retdata = NULL ;
2009-04-07 00:49:39 +00:00
RNA_pointer_create ( NULL , & RNA_Function , func , & funcptr ) ;
2009-04-19 13:37:59 +00:00
tid = RNA_struct_identifier ( ptr - > type ) ;
fid = RNA_function_identifier ( func ) ;
pret = RNA_function_return ( func ) ;
2009-04-11 12:44:01 +00:00
flen = strlen ( format ) ;
2009-04-07 00:49:39 +00:00
2009-07-17 02:31:28 +00:00
RNA_parameter_list_create ( & parms , ptr , func ) ;
RNA_parameter_list_begin ( & parms , & iter ) ;
2009-04-07 00:49:39 +00:00
2009-04-11 12:44:01 +00:00
for ( i = 0 , ofs = 0 ; iter . valid ; RNA_parameter_list_next ( & iter ) , i + + ) {
2009-04-07 00:49:39 +00:00
parm = iter . parm ;
2009-04-11 12:44:01 +00:00
2009-04-07 00:49:39 +00:00
if ( parm = = pret ) {
retdata = iter . data ;
continue ;
}
2009-04-19 13:37:59 +00:00
pid = RNA_property_identifier ( parm ) ;
flag = RNA_property_flag ( parm ) ;
2009-04-11 12:44:01 +00:00
if ( ofs > = flen | | format [ ofs ] = = ' N ' ) {
if ( flag & PROP_REQUIRED ) {
err = - 1 ;
fprintf ( stderr , " %s.%s: missing required parameter %s \n " , tid , fid , pid ) ;
break ;
}
ofs + + ;
continue ;
}
2009-04-19 13:37:59 +00:00
type = RNA_property_type ( parm ) ;
2009-04-11 12:44:01 +00:00
ftype = format [ ofs + + ] ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
len = RNA_property_array_length ( & funcptr , parm ) ;
2009-04-11 15:46:35 +00:00
alen = rna_function_format_array_length ( format , ofs , flen ) ;
2009-04-11 12:44:01 +00:00
if ( len ! = alen ) {
err = - 1 ;
fprintf ( stderr , " %s.%s: for parameter %s, was expecting an array of %i elements, passed %i elements instead \n " , tid , fid , pid , len , alen ) ;
break ;
}
2009-04-11 15:46:35 +00:00
2009-04-11 12:44:01 +00:00
switch ( type ) {
case PROP_BOOLEAN :
case PROP_INT :
2009-04-11 15:46:35 +00:00
case PROP_ENUM :
2009-04-11 12:44:01 +00:00
{
2009-04-11 15:46:35 +00:00
int arg = va_arg ( args , int ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , & arg , NULL , tid , fid , pid ) ;
2009-04-11 12:44:01 +00:00
break ;
}
case PROP_FLOAT :
{
2009-04-16 13:01:50 +00:00
double arg = va_arg ( args , double ) ;
2009-04-11 15:46:35 +00:00
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , & arg , NULL , tid , fid , pid ) ;
2009-04-11 12:44:01 +00:00
break ;
}
case PROP_STRING :
{
2009-04-11 15:46:35 +00:00
char * arg = va_arg ( args , char * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , & arg , NULL , tid , fid , pid ) ;
2009-04-11 12:44:01 +00:00
break ;
}
case PROP_POINTER :
{
2009-04-11 15:46:35 +00:00
StructRNA * srna = va_arg ( args , StructRNA * ) ;
void * arg = va_arg ( args , void * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , & arg , srna , tid , fid , pid ) ;
2009-04-11 12:44:01 +00:00
break ;
}
2009-07-01 19:56:50 +00:00
case PROP_COLLECTION :
{
StructRNA * srna = va_arg ( args , StructRNA * ) ;
ListBase * arg = va_arg ( args , ListBase * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , & arg , srna , tid , fid , pid ) ;
break ;
}
2009-04-11 15:46:35 +00:00
default :
2009-04-11 12:44:01 +00:00
{
2009-04-11 15:46:35 +00:00
/* handle errors */
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , iter . data , NULL , NULL , tid , fid , pid ) ;
2009-04-11 12:44:01 +00:00
break ;
}
}
2009-04-11 13:24:02 +00:00
if ( err ! = 0 )
break ;
2009-04-11 12:44:01 +00:00
}
2009-04-11 15:46:35 +00:00
if ( err = = 0 )
2009-07-17 02:31:28 +00:00
err = RNA_function_call ( C , reports , ptr , func , & parms ) ;
2009-04-11 15:46:35 +00:00
/* XXX throw error when more parameters than those needed are passed or leave silent? */
if ( err = = 0 & & pret & & ofs < flen & & format [ ofs + + ] = = ' R ' ) {
parm = pret ;
2009-04-19 13:37:59 +00:00
type = RNA_property_type ( parm ) ;
2009-04-11 15:46:35 +00:00
ftype = format [ ofs + + ] ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
len = RNA_property_array_length ( & funcptr , parm ) ;
2009-04-11 15:46:35 +00:00
alen = rna_function_format_array_length ( format , ofs , flen ) ;
if ( len ! = alen ) {
err = - 1 ;
fprintf ( stderr , " %s.%s: for return parameter %s, was expecting an array of %i elements, passed %i elements instead \n " , tid , fid , pid , len , alen ) ;
}
else {
switch ( type ) {
case PROP_BOOLEAN :
case PROP_INT :
case PROP_ENUM :
{
int * arg = va_arg ( args , int * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , arg , retdata , NULL , tid , fid , pid ) ;
break ;
}
case PROP_FLOAT :
{
float * arg = va_arg ( args , float * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , arg , retdata , NULL , tid , fid , pid ) ;
break ;
}
case PROP_STRING :
{
char * * arg = va_arg ( args , char * * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , arg , retdata , NULL , tid , fid , pid ) ;
break ;
}
case PROP_POINTER :
{
StructRNA * srna = va_arg ( args , StructRNA * ) ;
void * * arg = va_arg ( args , void * * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , arg , retdata , srna , tid , fid , pid ) ;
break ;
}
2009-07-01 19:56:50 +00:00
case PROP_COLLECTION :
{
StructRNA * srna = va_arg ( args , StructRNA * ) ;
ListBase * * arg = va_arg ( args , ListBase * * ) ;
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , arg , retdata , srna , tid , fid , pid ) ;
break ;
}
2009-04-11 15:46:35 +00:00
default :
{
/* handle errors */
err = rna_function_parameter_parse ( & funcptr , parm , type , ftype , len , NULL , NULL , NULL , tid , fid , pid ) ;
break ;
}
}
}
2009-04-07 00:49:39 +00:00
}
2009-04-11 12:44:01 +00:00
2009-04-11 15:46:35 +00:00
RNA_parameter_list_end ( & iter ) ;
2009-07-17 02:31:28 +00:00
RNA_parameter_list_free ( & parms ) ;
2009-04-11 15:46:35 +00:00
2009-04-11 12:44:01 +00:00
return err ;
2009-04-07 00:49:39 +00:00
}
2009-06-18 19:48:55 +00:00
int RNA_function_call_direct_va_lookup ( bContext * C , ReportList * reports , PointerRNA * ptr , const char * identifier , const char * format , va_list args )
2009-04-07 00:49:39 +00:00
{
FunctionRNA * func ;
func = RNA_struct_find_function ( ptr , identifier ) ;
if ( func )
2009-06-18 19:48:55 +00:00
return RNA_function_call_direct_va ( C , reports , ptr , func , format , args ) ;
2009-04-07 00:49:39 +00:00
return 0 ;
}
2009-07-01 19:56:50 +00:00