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 <float.h>
|
|
|
|
#include <limits.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "RNA_access.h"
|
|
|
|
#include "RNA_define.h"
|
|
|
|
#include "RNA_types.h"
|
|
|
|
|
|
|
|
#include "rna_internal.h"
|
|
|
|
|
|
|
|
#define RNA_VERSION_DATE "$Id$"
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
#ifndef snprintf
|
|
|
|
#define snprintf _snprintf
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2008-11-26 22:52:01 +00:00
|
|
|
/* Sorting */
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static int cmp_struct(const void *a, const void *b)
|
2008-11-26 22:24:26 +00:00
|
|
|
{
|
|
|
|
const StructRNA *structa= *(const StructRNA**)a;
|
|
|
|
const StructRNA *structb= *(const StructRNA**)b;
|
|
|
|
|
|
|
|
return strcmp(structa->identifier, structb->identifier);
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static int cmp_property(const void *a, const void *b)
|
2008-11-26 22:24:26 +00:00
|
|
|
{
|
|
|
|
const PropertyRNA *propa= *(const PropertyRNA**)a;
|
|
|
|
const PropertyRNA *propb= *(const PropertyRNA**)b;
|
|
|
|
|
|
|
|
if(strcmp(propa->identifier, "rna_type") == 0) return -1;
|
|
|
|
else if(strcmp(propb->identifier, "rna_type") == 0) return 1;
|
|
|
|
|
|
|
|
if(strcmp(propa->identifier, "name") == 0) return -1;
|
|
|
|
else if(strcmp(propb->identifier, "name") == 0) return 1;
|
|
|
|
|
|
|
|
return strcmp(propa->name, propb->name);
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static int cmp_def_struct(const void *a, const void *b)
|
|
|
|
{
|
|
|
|
const StructDefRNA *dsa= *(const StructDefRNA**)a;
|
|
|
|
const StructDefRNA *dsb= *(const StructDefRNA**)b;
|
|
|
|
|
|
|
|
return cmp_struct(&dsa->srna, &dsb->srna);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int cmp_def_property(const void *a, const void *b)
|
|
|
|
{
|
|
|
|
const PropertyDefRNA *dpa= *(const PropertyDefRNA**)a;
|
|
|
|
const PropertyDefRNA *dpb= *(const PropertyDefRNA**)b;
|
|
|
|
|
|
|
|
return cmp_property(&dpa->prop, &dpb->prop);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_sortlist(ListBase *listbase, int(*cmp)(const void*, const void*))
|
2008-11-26 22:24:26 +00:00
|
|
|
{
|
|
|
|
Link *link;
|
|
|
|
void **array;
|
|
|
|
int a, size;
|
|
|
|
|
|
|
|
if(listbase->first == listbase->last)
|
|
|
|
return;
|
|
|
|
|
|
|
|
for(size=0, link=listbase->first; link; link=link->next)
|
|
|
|
size++;
|
|
|
|
|
|
|
|
array= MEM_mallocN(sizeof(void*)*size, "rna_sortlist");
|
|
|
|
for(a=0, link=listbase->first; link; link=link->next, a++)
|
|
|
|
array[a]= link;
|
|
|
|
|
|
|
|
qsort(array, size, sizeof(void*), cmp);
|
|
|
|
|
|
|
|
listbase->first= listbase->last= NULL;
|
|
|
|
for(a=0; a<size; a++) {
|
|
|
|
link= array[a];
|
|
|
|
link->next= link->prev= NULL;
|
|
|
|
rna_addtail(listbase, link);
|
|
|
|
}
|
|
|
|
|
|
|
|
MEM_freeN(array);
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
/* Preprocessing */
|
|
|
|
|
|
|
|
static void rna_print_c_string(FILE *f, const char *str)
|
|
|
|
{
|
|
|
|
static char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
|
|
|
|
int i, j;
|
|
|
|
|
2009-07-10 11:36:02 +00:00
|
|
|
if(!str) {
|
|
|
|
fprintf(f, "NULL");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "\"");
|
|
|
|
for(i=0; str[i]; i++) {
|
|
|
|
for(j=0; escape[j]; j++)
|
|
|
|
if(str[i] == escape[j][0])
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(escape[j]) fprintf(f, "\\%c", escape[j][1]);
|
|
|
|
else fprintf(f, "%c", str[i]);
|
|
|
|
}
|
|
|
|
fprintf(f, "\"");
|
|
|
|
}
|
|
|
|
|
2008-12-02 23:45:11 +00:00
|
|
|
static void rna_print_data_get(FILE *f, PropertyDefRNA *dp)
|
|
|
|
{
|
|
|
|
if(dp->dnastructfromname && dp->dnastructfromprop)
|
|
|
|
fprintf(f, " %s *data= (%s*)(((%s*)ptr->data)->%s);\n", dp->dnastructname, dp->dnastructname, dp->dnastructfromname, dp->dnastructfromprop);
|
|
|
|
else
|
|
|
|
fprintf(f, " %s *data= (%s*)(ptr->data);\n", dp->dnastructname, dp->dnastructname);
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
static char *rna_alloc_function_name(const char *structname, const char *propname, const char *type)
|
|
|
|
{
|
|
|
|
AllocDefRNA *alloc;
|
|
|
|
char buffer[2048];
|
|
|
|
char *result;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
snprintf(buffer, sizeof(buffer), "%s_%s_%s", structname, propname, type);
|
2008-10-31 23:50:02 +00:00
|
|
|
result= MEM_callocN(sizeof(char)*strlen(buffer)+1, "rna_alloc_function_name");
|
|
|
|
strcpy(result, buffer);
|
|
|
|
|
|
|
|
alloc= MEM_callocN(sizeof(AllocDefRNA), "AllocDefRNA");
|
|
|
|
alloc->mem= result;
|
|
|
|
rna_addtail(&DefRNA.allocs, alloc);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2009-05-28 23:23:47 +00:00
|
|
|
static StructRNA *rna_find_struct(const char *identifier)
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
|
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
|
|
|
if(strcmp(ds->srna->identifier, identifier)==0)
|
|
|
|
return ds->srna;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static const char *rna_find_type(const char *type)
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
|
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
|
|
|
if(ds->dnaname && strcmp(ds->dnaname, type)==0)
|
|
|
|
return ds->srna->identifier;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_find_dna_type(const char *type)
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
|
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
|
|
|
if(strcmp(ds->srna->identifier, type)==0)
|
|
|
|
return ds->dnaname;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_type_type_name(PropertyRNA *prop)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_BOOLEAN:
|
|
|
|
case PROP_INT:
|
|
|
|
case PROP_ENUM:
|
|
|
|
return "int";
|
|
|
|
case PROP_FLOAT:
|
|
|
|
return "float";
|
|
|
|
case PROP_STRING:
|
|
|
|
return "char*";
|
|
|
|
default:
|
2009-04-07 00:49:39 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_type_type(PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
const char *type;
|
|
|
|
|
|
|
|
type= rna_type_type_name(prop);
|
|
|
|
|
|
|
|
if(type)
|
|
|
|
return type;
|
|
|
|
|
|
|
|
return "PointerRNA";
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_type_struct(PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
const char *type;
|
|
|
|
|
|
|
|
type= rna_type_type_name(prop);
|
|
|
|
|
|
|
|
if(type)
|
|
|
|
return "";
|
|
|
|
|
|
|
|
return "struct ";
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_parameter_type_name(PropertyRNA *parm)
|
|
|
|
{
|
|
|
|
const char *type;
|
|
|
|
|
|
|
|
type= rna_type_type_name(parm);
|
|
|
|
|
|
|
|
if(type)
|
|
|
|
return type;
|
|
|
|
|
|
|
|
switch(parm->type) {
|
|
|
|
case PROP_POINTER: {
|
|
|
|
PointerPropertyRNA *pparm= (PointerPropertyRNA*)parm;
|
|
|
|
|
2009-06-16 00:52:21 +00:00
|
|
|
if(parm->flag & PROP_RNAPTR)
|
2009-04-07 00:49:39 +00:00
|
|
|
return "PointerRNA";
|
|
|
|
else
|
|
|
|
return rna_find_dna_type((const char *)pparm->type);
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
2009-06-27 01:10:39 +00:00
|
|
|
return "ListBase";
|
2009-04-07 00:49:39 +00:00
|
|
|
}
|
|
|
|
default:
|
|
|
|
return "<error, no type specified>";
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-26 22:52:01 +00:00
|
|
|
static int rna_enum_bitmask(PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
|
|
|
int a, mask= 0;
|
|
|
|
|
2009-05-28 23:23:47 +00:00
|
|
|
if(eprop->item) {
|
|
|
|
for(a=0; a<eprop->totitem; a++)
|
2009-07-10 11:36:02 +00:00
|
|
|
if(eprop->item[a].identifier[0])
|
|
|
|
mask |= eprop->item[a].value;
|
2009-05-28 23:23:47 +00:00
|
|
|
}
|
2008-11-26 22:52:01 +00:00
|
|
|
|
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
2009-01-07 21:05:51 +00:00
|
|
|
static int rna_color_quantize(PropertyRNA *prop, PropertyDefRNA *dp)
|
|
|
|
{
|
|
|
|
if(prop->type == PROP_FLOAT && prop->subtype == PROP_COLOR)
|
|
|
|
if(strcmp(dp->dnatype, "float") != 0 && strcmp(dp->dnatype, "double") != 0)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-01-17 15:28:34 +00:00
|
|
|
static const char *rna_function_string(void *func)
|
|
|
|
{
|
|
|
|
return (func)? (const char*)func: "NULL";
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_float_print(FILE *f, float num)
|
|
|
|
{
|
|
|
|
if(num == -FLT_MAX) fprintf(f, "-FLT_MAX");
|
|
|
|
else if(num == FLT_MAX) fprintf(f, "FLT_MAX");
|
|
|
|
else if((int)num == num) fprintf(f, "%.1ff", num);
|
|
|
|
else fprintf(f, "%.10ff", num);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_int_print(FILE *f, int num)
|
|
|
|
{
|
|
|
|
if(num == INT_MIN) fprintf(f, "INT_MIN");
|
|
|
|
else if(num == INT_MAX) fprintf(f, "INT_MAX");
|
|
|
|
else fprintf(f, "%d", num);
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, const char *manualfunc)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
char *func;
|
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(prop->flag & PROP_IDPROPERTY)
|
|
|
|
return NULL;
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
if(!manualfunc) {
|
|
|
|
if(!dp->dnastructname || !dp->dnaname) {
|
|
|
|
fprintf(stderr, "rna_def_property_get_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "get");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_STRING: {
|
|
|
|
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, char *value)\n", func);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " %s(ptr, value);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
2009-04-19 17:12:16 +00:00
|
|
|
if(sprop->maxlength)
|
|
|
|
fprintf(f, " BLI_strncpy(value, data->%s, %d);\n", dp->dnaname, sprop->maxlength);
|
|
|
|
else
|
|
|
|
fprintf(f, " BLI_strncpy(value, data->%s, sizeof(data->%s));\n", dp->dnaname, dp->dnaname);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
fprintf(f, "PointerRNA %s(PointerRNA *ptr)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " return %s(ptr);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
|
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
if(dp->dnapointerlevel == 0)
|
2009-03-23 13:24:48 +00:00
|
|
|
fprintf(f, " return rna_pointer_inherit_refine(ptr, &RNA_%s, &data->%s);\n", (char*)pprop->type, dp->dnaname);
|
2009-02-02 19:57:57 +00:00
|
|
|
else
|
2009-03-23 13:24:48 +00:00
|
|
|
fprintf(f, " return rna_pointer_inherit_refine(ptr, &RNA_%s, data->%s);\n", (char*)pprop->type, dp->dnaname);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
|
|
|
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
|
|
|
|
|
|
|
|
fprintf(f, "static PointerRNA %s(CollectionPropertyIterator *iter)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
if(manualfunc) {
|
|
|
|
if(strcmp(manualfunc, "rna_iterator_listbase_get") == 0 ||
|
|
|
|
strcmp(manualfunc, "rna_iterator_array_get") == 0 ||
|
|
|
|
strcmp(manualfunc, "rna_iterator_array_dereference_get") == 0)
|
2009-03-23 13:24:48 +00:00
|
|
|
fprintf(f, " return rna_pointer_inherit_refine(&iter->parent, &RNA_%s, %s(iter));\n", (cprop->type)? (char*)cprop->type: "UnknownType", manualfunc);
|
2009-02-02 19:57:57 +00:00
|
|
|
else
|
|
|
|
fprintf(f, " return %s(iter);\n", manualfunc);
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
if(prop->arraylength) {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
if(manualfunc) {
|
2009-03-23 20:19:09 +00:00
|
|
|
fprintf(f, " %s(ptr, values);\n", manualfunc);
|
2008-11-18 10:57:06 +00:00
|
|
|
}
|
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
|
|
|
|
for(i=0; i<prop->arraylength; i++) {
|
|
|
|
if(dp->dnaarraylength == 1) {
|
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit)
|
|
|
|
fprintf(f, " values[%d]= (%s(data->%s & (%d<<%d)) != 0);\n", i, (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit, i);
|
|
|
|
else
|
|
|
|
fprintf(f, " values[%d]= (%s)%s((&data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
|
|
|
|
fprintf(f, " values[%d]= (%s(data->%s[%d] & ", i, (dp->booleannegative)? "!": "", dp->dnaname, i);
|
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ") != 0);\n");
|
|
|
|
}
|
|
|
|
else if(rna_color_quantize(prop, dp))
|
|
|
|
fprintf(f, " values[%d]= (%s)(data->%s[%d]*(1.0f/255.0f));\n", i, rna_type_type(prop), dp->dnaname, i);
|
2009-07-21 01:14:55 +00:00
|
|
|
else if(dp->dnatype)
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, " values[%d]= (%s)%s(((%s*)data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname, i);
|
2009-07-21 01:14:55 +00:00
|
|
|
else
|
|
|
|
fprintf(f, " values[%d]= (%s)%s((data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
2009-01-17 15:28:34 +00:00
|
|
|
}
|
2008-11-18 10:57:06 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
}
|
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "%s %s(PointerRNA *ptr)\n", rna_type_type(prop), func);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " return %s(ptr);\n", manualfunc);
|
2009-01-17 15:28:34 +00:00
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
|
|
|
|
fprintf(f, " return (%s((data->%s) & ", (dp->booleannegative)? "!": "", dp->dnaname);
|
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ") != 0);\n");
|
|
|
|
}
|
|
|
|
else if(prop->type == PROP_ENUM && dp->enumbitflags) {
|
|
|
|
fprintf(f, " return ((data->%s) & ", dp->dnaname);
|
|
|
|
rna_int_print(f, rna_enum_bitmask(prop));
|
|
|
|
fprintf(f, ");\n");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
fprintf(f, " return (%s)%s(data->%s);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
|
2009-01-17 15:28:34 +00:00
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
if(prop->type == PROP_INT) {
|
|
|
|
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
|
|
|
|
|
2008-11-29 14:35:50 +00:00
|
|
|
if(iprop->hardmin != INT_MIN || iprop->hardmax != INT_MAX) {
|
2009-02-02 19:57:57 +00:00
|
|
|
if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
|
|
|
|
else fprintf(f, "CLAMPIS(value, ");
|
2008-11-29 14:35:50 +00:00
|
|
|
rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->hardmax); fprintf(f, ");\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
return;
|
2008-11-29 14:35:50 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
else if(prop->type == PROP_FLOAT) {
|
|
|
|
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
|
|
|
|
|
|
|
|
if(fprop->hardmin != -FLT_MAX || fprop->hardmax != FLT_MAX) {
|
2009-02-02 19:57:57 +00:00
|
|
|
if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
|
|
|
|
else fprintf(f, "CLAMPIS(value, ");
|
2008-10-31 23:50:02 +00:00
|
|
|
rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
|
|
|
|
rna_float_print(f, fprop->hardmax); fprintf(f, ");\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
return;
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
if(array)
|
|
|
|
fprintf(f, "values[%d];\n", i);
|
|
|
|
else
|
|
|
|
fprintf(f, "value;\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
char *func;
|
2009-02-02 19:57:57 +00:00
|
|
|
int i;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(!(prop->flag & PROP_EDITABLE))
|
|
|
|
return NULL;
|
|
|
|
if(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
|
|
|
return NULL;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
if(!manualfunc) {
|
|
|
|
if(!dp->dnastructname || !dp->dnaname) {
|
2009-03-23 13:24:48 +00:00
|
|
|
if(prop->flag & PROP_EDITABLE) {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(stderr, "rna_def_property_set_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
|
|
|
return NULL;
|
2008-11-14 14:34:19 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "set");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_STRING: {
|
|
|
|
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, const char *value)\n", func);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " %s(ptr, value);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
2009-04-19 17:12:16 +00:00
|
|
|
if(sprop->maxlength)
|
|
|
|
fprintf(f, " BLI_strncpy(data->%s, value, %d);\n", dp->dnaname, sprop->maxlength);
|
|
|
|
else
|
|
|
|
fprintf(f, " BLI_strncpy(data->%s, value, sizeof(data->%s));\n", dp->dnaname, dp->dnaname);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, PointerRNA value)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " %s(ptr, value);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
2009-05-28 23:23:47 +00:00
|
|
|
|
2009-05-29 15:12:31 +00:00
|
|
|
if(prop->flag & PROP_ID_REFCOUNT) {
|
2009-05-28 23:23:47 +00:00
|
|
|
fprintf(f, "\n if(data->%s)\n", dp->dnaname);
|
|
|
|
fprintf(f, " id_us_min((ID*)data->%s);\n", dp->dnaname);
|
|
|
|
fprintf(f, " if(value.data)\n");
|
|
|
|
fprintf(f, " id_us_plus((ID*)value.data);\n\n");
|
|
|
|
}
|
2009-05-29 15:12:31 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " data->%s= value.data;\n", dp->dnaname);
|
2009-05-28 23:23:47 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
if(prop->arraylength) {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " %s(ptr, values);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
|
|
|
|
for(i=0; i<prop->arraylength; i++) {
|
|
|
|
if(dp->dnaarraylength == 1) {
|
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
|
|
|
|
fprintf(f, " if(%svalues[%d]) data->%s |= (%d<<%d);\n", (dp->booleannegative)? "!": "", i, dp->dnaname, dp->booleanbit, i);
|
|
|
|
fprintf(f, " else data->%s &= ~(%d<<%d);\n", dp->dnaname, dp->booleanbit, i);
|
|
|
|
}
|
|
|
|
else {
|
2009-02-19 23:53:40 +00:00
|
|
|
fprintf(f, " (&data->%s)[%d]= %s", dp->dnaname, i, (dp->booleannegative)? "!": "");
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_clamp_value(f, prop, 1, i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
|
|
|
|
fprintf(f, " if(%svalues[%d]) data->%s[%d] |= ", (dp->booleannegative)? "!": "", i, dp->dnaname, i);
|
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ";\n");
|
|
|
|
fprintf(f, " else data->%s[%d] &= ~", dp->dnaname, i);
|
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ";\n");
|
|
|
|
}
|
|
|
|
else if(rna_color_quantize(prop, dp)) {
|
|
|
|
fprintf(f, " data->%s[%d]= FTOCHAR(values[%d]);\n", dp->dnaname, i, i);
|
|
|
|
}
|
|
|
|
else {
|
2009-07-21 01:14:55 +00:00
|
|
|
if(dp->dnatype)
|
|
|
|
fprintf(f, " ((%s*)data->%s)[%d]= %s", dp->dnatype, dp->dnaname, i, (dp->booleannegative)? "!": "");
|
|
|
|
else
|
|
|
|
fprintf(f, " (data->%s)[%d]= %s", dp->dnaname, i, (dp->booleannegative)? "!": "");
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_clamp_value(f, prop, 1, i);
|
|
|
|
}
|
|
|
|
}
|
2008-11-18 10:57:06 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fprintf(f, "void %s(PointerRNA *ptr, %s value)\n", func, rna_type_type(prop));
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " %s(ptr, value);\n", manualfunc);
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_print_data_get(f, dp);
|
2008-11-18 10:57:06 +00:00
|
|
|
if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " if(%svalue) data->%s |= ", (dp->booleannegative)? "!": "", dp->dnaname);
|
2009-01-17 15:28:34 +00:00
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ";\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " else data->%s &= ~", dp->dnaname);
|
2009-01-17 15:28:34 +00:00
|
|
|
rna_int_print(f, dp->booleanbit);
|
|
|
|
fprintf(f, ";\n");
|
2008-11-18 10:57:06 +00:00
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
else if(prop->type == PROP_ENUM && dp->enumbitflags) {
|
|
|
|
fprintf(f, " data->%s &= ~", dp->dnaname);
|
|
|
|
rna_int_print(f, rna_enum_bitmask(prop));
|
|
|
|
fprintf(f, ";\n");
|
|
|
|
fprintf(f, " data->%s |= value;\n", dp->dnaname);
|
2009-01-07 21:05:51 +00:00
|
|
|
}
|
2008-11-18 10:57:06 +00:00
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " data->%s= %s", dp->dnaname, (dp->booleannegative)? "!": "");
|
|
|
|
rna_clamp_value(f, prop, 0, 0);
|
2008-11-18 10:57:06 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static char *rna_def_property_length_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
2008-11-07 02:58:25 +00:00
|
|
|
char *func= NULL;
|
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(prop->flag & PROP_IDPROPERTY)
|
|
|
|
return NULL;
|
|
|
|
|
2008-11-07 02:58:25 +00:00
|
|
|
if(prop->type == PROP_STRING) {
|
2009-02-02 19:57:57 +00:00
|
|
|
if(!manualfunc) {
|
|
|
|
if(!dp->dnastructname || !dp->dnaname) {
|
|
|
|
fprintf(stderr, "rna_def_property_length_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
}
|
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "length");
|
2008-11-07 02:58:25 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "int %s(PointerRNA *ptr)\n", func);
|
2008-11-07 02:58:25 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " return %s(ptr);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
fprintf(f, " return strlen(data->%s);\n", dp->dnaname);
|
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
fprintf(f, "}\n\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
else if(prop->type == PROP_COLLECTION) {
|
2009-02-02 19:57:57 +00:00
|
|
|
if(!manualfunc) {
|
|
|
|
if(prop->type == PROP_COLLECTION && (!(dp->dnalengthname || dp->dnalengthfixed)|| !dp->dnaname)) {
|
|
|
|
fprintf(stderr, "rna_def_property_length_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "length");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "int %s(PointerRNA *ptr)\n", func);
|
2008-11-07 02:58:25 +00:00
|
|
|
fprintf(f, "{\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, " return %s(ptr);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_print_data_get(f, dp);
|
|
|
|
if(dp->dnalengthname)
|
|
|
|
fprintf(f, " return (data->%s == NULL)? 0: data->%s;\n", dp->dnaname, dp->dnalengthname);
|
|
|
|
else
|
|
|
|
fprintf(f, " return (data->%s == NULL)? 0: %d;\n", dp->dnaname, dp->dnalengthfixed);
|
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
2009-02-02 19:57:57 +00:00
|
|
|
char *func, *getfunc;
|
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(prop->flag & PROP_IDPROPERTY)
|
|
|
|
return NULL;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
if(!manualfunc) {
|
|
|
|
if(!dp->dnastructname || !dp->dnaname) {
|
|
|
|
fprintf(stderr, "rna_def_property_begin_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "begin");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %s(CollectionPropertyIterator *iter, PointerRNA *ptr)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
|
|
|
|
if(!manualfunc)
|
2008-12-02 23:45:11 +00:00
|
|
|
rna_print_data_get(f, dp);
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
fprintf(f, "\n memset(iter, 0, sizeof(*iter));\n");
|
|
|
|
fprintf(f, " iter->parent= *ptr;\n");
|
|
|
|
fprintf(f, " iter->prop= (PropertyRNA*)&rna_%s_%s;\n", srna->identifier, prop->identifier);
|
|
|
|
|
|
|
|
if(dp->dnalengthname || dp->dnalengthfixed) {
|
|
|
|
if(manualfunc) {
|
|
|
|
fprintf(f, "\n %s(iter, ptr);\n", manualfunc);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(dp->dnalengthname)
|
2009-07-13 19:33:59 +00:00
|
|
|
fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), data->%s, 0, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthname);
|
2009-02-02 19:57:57 +00:00
|
|
|
else
|
2009-07-13 19:33:59 +00:00
|
|
|
fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), %d, 0, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthfixed);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
}
|
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
if(manualfunc)
|
|
|
|
fprintf(f, "\n %s(iter, ptr);\n", manualfunc);
|
2009-06-19 14:56:49 +00:00
|
|
|
else if(dp->dnapointerlevel == 0)
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "\n rna_iterator_listbase_begin(iter, &data->%s, NULL);\n", dp->dnaname);
|
2009-06-19 14:56:49 +00:00
|
|
|
else
|
|
|
|
fprintf(f, "\n rna_iterator_listbase_begin(iter, data->%s, NULL);\n", dp->dnaname);
|
2008-11-07 02:58:25 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
getfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "get");
|
|
|
|
|
|
|
|
fprintf(f, "\n if(iter->valid)\n");
|
|
|
|
fprintf(f, " iter->ptr= %s(iter);\n", getfunc);
|
|
|
|
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
|
|
|
|
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *rna_def_property_next_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
|
|
|
|
{
|
|
|
|
char *func, *getfunc;
|
|
|
|
|
|
|
|
if(prop->flag & PROP_IDPROPERTY)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if(!manualfunc)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "next");
|
|
|
|
|
|
|
|
fprintf(f, "void %s(CollectionPropertyIterator *iter)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
fprintf(f, " %s(iter);\n", manualfunc);
|
|
|
|
|
|
|
|
getfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "get");
|
|
|
|
|
|
|
|
fprintf(f, "\n if(iter->valid)\n");
|
|
|
|
fprintf(f, " iter->ptr= %s(iter);\n", getfunc);
|
|
|
|
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
|
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *rna_def_property_end_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
|
|
|
|
{
|
|
|
|
char *func;
|
|
|
|
|
|
|
|
if(prop->flag & PROP_IDPROPERTY)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "end");
|
|
|
|
|
|
|
|
fprintf(f, "void %s(CollectionPropertyIterator *iter)\n", func);
|
|
|
|
fprintf(f, "{\n");
|
|
|
|
if(manualfunc)
|
|
|
|
fprintf(f, " %s(iter);\n", manualfunc);
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
return func;
|
|
|
|
}
|
|
|
|
|
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 void rna_set_raw_property(PropertyDefRNA *dp, PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
if(dp->dnapointerlevel != 0)
|
|
|
|
return;
|
|
|
|
if(!dp->dnatype || !dp->dnaname || !dp->dnastructname)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(strcmp(dp->dnatype, "char") == 0) {
|
|
|
|
prop->rawtype= PROP_RAW_CHAR;
|
|
|
|
prop->flag |= PROP_RAW_ACCESS;
|
|
|
|
}
|
|
|
|
else if(strcmp(dp->dnatype, "short") == 0) {
|
|
|
|
prop->rawtype= PROP_RAW_SHORT;
|
|
|
|
prop->flag |= PROP_RAW_ACCESS;
|
|
|
|
}
|
|
|
|
else if(strcmp(dp->dnatype, "int") == 0) {
|
|
|
|
prop->rawtype= PROP_RAW_INT;
|
|
|
|
prop->flag |= PROP_RAW_ACCESS;
|
|
|
|
}
|
|
|
|
else if(strcmp(dp->dnatype, "float") == 0) {
|
|
|
|
prop->rawtype= PROP_RAW_FLOAT;
|
|
|
|
prop->flag |= PROP_RAW_ACCESS;
|
|
|
|
}
|
|
|
|
else if(strcmp(dp->dnatype, "double") == 0) {
|
|
|
|
prop->rawtype= PROP_RAW_DOUBLE;
|
|
|
|
prop->flag |= PROP_RAW_ACCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_set_raw_offset(FILE *f, StructRNA *srna, PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
PropertyDefRNA *dp= rna_find_struct_property_def(srna, prop);
|
|
|
|
|
|
|
|
fprintf(f, "\toffsetof(%s, %s), %d", dp->dnastructname, dp->dnaname, prop->rawtype);
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
prop= dp->prop;
|
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_BOOLEAN: {
|
|
|
|
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
|
|
|
|
|
|
|
|
if(!prop->arraylength) {
|
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
|
|
|
if(!bprop->get && !bprop->set && !dp->booleanbit)
|
|
|
|
rna_set_raw_property(dp, prop);
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
bprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)bprop->get);
|
|
|
|
bprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)bprop->set);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
else {
|
2009-02-02 19:57:57 +00:00
|
|
|
bprop->getarray= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)bprop->getarray);
|
|
|
|
bprop->setarray= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)bprop->setarray);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_INT: {
|
|
|
|
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
|
|
|
|
|
|
|
|
if(!prop->arraylength) {
|
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
|
|
|
if(!iprop->get && !iprop->set)
|
|
|
|
rna_set_raw_property(dp, prop);
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
iprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)iprop->get);
|
|
|
|
iprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)iprop->set);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
else {
|
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
|
|
|
if(!iprop->getarray && !iprop->setarray)
|
|
|
|
rna_set_raw_property(dp, prop);
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
iprop->getarray= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)iprop->getarray);
|
|
|
|
iprop->setarray= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)iprop->setarray);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_FLOAT: {
|
|
|
|
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
|
|
|
|
|
|
|
|
if(!prop->arraylength) {
|
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
|
|
|
if(!fprop->get && !fprop->set)
|
|
|
|
rna_set_raw_property(dp, prop);
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)fprop->get);
|
|
|
|
fprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)fprop->set);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
else {
|
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
|
|
|
if(!fprop->getarray && !fprop->setarray)
|
|
|
|
rna_set_raw_property(dp, prop);
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprop->getarray= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)fprop->getarray);
|
|
|
|
fprop->setarray= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)fprop->setarray);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_ENUM: {
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
eprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)eprop->get);
|
|
|
|
eprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)eprop->set);
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_STRING: {
|
|
|
|
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
sprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)sprop->get);
|
|
|
|
sprop->length= (void*)rna_def_property_length_func(f, srna, prop, dp, (char*)sprop->length);
|
|
|
|
sprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)sprop->set);
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
pprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)pprop->get);
|
|
|
|
pprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)pprop->set);
|
2009-03-23 13:24:48 +00:00
|
|
|
if(!pprop->type) {
|
|
|
|
fprintf(stderr, "rna_def_property_funcs: %s.%s, pointer must have a struct type.\n", srna->identifier, prop->identifier);
|
2008-11-07 02:58:25 +00:00
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
|
|
|
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
if(dp->dnatype && strcmp(dp->dnatype, "ListBase")==0);
|
|
|
|
else if(dp->dnalengthname || dp->dnalengthfixed)
|
|
|
|
cprop->length= (void*)rna_def_property_length_func(f, srna, prop, dp, (char*)cprop->length);
|
|
|
|
|
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
|
|
|
/* test if we can allow raw array access, if it is using our standard
|
|
|
|
* array get/next function, we can be sure it is an actual array */
|
|
|
|
if(cprop->next && cprop->get)
|
|
|
|
if(strcmp((char*)cprop->next, "rna_iterator_array_next") == 0 &&
|
|
|
|
strcmp((char*)cprop->get, "rna_iterator_array_get") == 0)
|
|
|
|
prop->flag |= PROP_RAW_ARRAY;
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
cprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)cprop->get);
|
|
|
|
cprop->begin= (void*)rna_def_property_begin_func(f, srna, prop, dp, (char*)cprop->begin);
|
|
|
|
cprop->next= (void*)rna_def_property_next_func(f, srna, prop, dp, (char*)cprop->next);
|
|
|
|
cprop->end= (void*)rna_def_property_end_func(f, srna, prop, dp, (char*)cprop->end);
|
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(!(prop->flag & PROP_IDPROPERTY)) {
|
|
|
|
if(!cprop->begin) {
|
|
|
|
fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a begin function.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
|
|
|
if(!cprop->next) {
|
|
|
|
fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a next function.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
|
|
|
if(!cprop->get) {
|
|
|
|
fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a get function.\n", srna->identifier, prop->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-11-07 02:58:25 +00:00
|
|
|
}
|
2009-03-23 13:24:48 +00:00
|
|
|
if(!cprop->type) {
|
|
|
|
fprintf(stderr, "rna_def_property_funcs: %s.%s, collection must have a struct type.\n", srna->identifier, prop->identifier);
|
2008-11-07 02:58:25 +00:00
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_def_property_funcs_header(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
|
2009-02-02 19:57:57 +00:00
|
|
|
{
|
|
|
|
PropertyRNA *prop;
|
|
|
|
char *func;
|
|
|
|
|
|
|
|
prop= dp->prop;
|
|
|
|
|
|
|
|
if(prop->flag & (PROP_IDPROPERTY|PROP_BUILTIN))
|
|
|
|
return;
|
|
|
|
|
|
|
|
func= rna_alloc_function_name(srna->identifier, prop->identifier, "");
|
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_BOOLEAN:
|
|
|
|
case PROP_INT: {
|
|
|
|
if(!prop->arraylength) {
|
|
|
|
fprintf(f, "int %sget(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, int value);\n", func);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fprintf(f, "void %sget(PointerRNA *ptr, int values[%d]);\n", func, prop->arraylength);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, const int values[%d]);\n", func, prop->arraylength);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_FLOAT: {
|
|
|
|
if(!prop->arraylength) {
|
|
|
|
fprintf(f, "float %sget(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, float value);\n", func);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fprintf(f, "void %sget(PointerRNA *ptr, float values[%d]);\n", func, prop->arraylength);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, const float values[%d]);\n", func, prop->arraylength);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_ENUM: {
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(eprop->item) {
|
|
|
|
fprintf(f, "enum {\n");
|
|
|
|
|
|
|
|
for(i=0; i<eprop->totitem; i++)
|
2009-07-10 11:36:02 +00:00
|
|
|
if(eprop->item[i].identifier[0])
|
|
|
|
fprintf(f, "\t%s_%s_%s = %d,\n", srna->identifier, prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
|
2009-02-02 19:57:57 +00:00
|
|
|
|
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "int %sget(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, int value);\n", func);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_STRING: {
|
2009-02-03 10:14:29 +00:00
|
|
|
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
|
|
|
|
|
|
|
|
if(sprop->maxlength) {
|
|
|
|
fprintf(f, "#define %s_%s_MAX %d\n\n", srna->identifier, prop->identifier, sprop->maxlength);
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "void %sget(PointerRNA *ptr, char *value);\n", func);
|
|
|
|
fprintf(f, "int %slength(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, const char *value);\n", func);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
fprintf(f, "PointerRNA %sget(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %sset(PointerRNA *ptr, PointerRNA value);\n", func);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
|
|
|
fprintf(f, "void %sbegin(CollectionPropertyIterator *iter, PointerRNA *ptr);\n", func);
|
|
|
|
fprintf(f, "void %snext(CollectionPropertyIterator *iter);\n", func);
|
|
|
|
fprintf(f, "void %send(CollectionPropertyIterator *iter);\n", func);
|
|
|
|
//fprintf(f, "int %slength(PointerRNA *ptr);\n", func);
|
|
|
|
//fprintf(f, "void %slookup_int(PointerRNA *ptr, int key, StructRNA **type);\n", func);
|
|
|
|
//fprintf(f, "void %slookup_string(PointerRNA *ptr, const char *key, StructRNA **type);\n", func);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_def_property_funcs_header_cpp(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
|
2009-03-14 23:17:55 +00:00
|
|
|
{
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
prop= dp->prop;
|
|
|
|
|
|
|
|
if(prop->flag & (PROP_IDPROPERTY|PROP_BUILTIN))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(prop->name && prop->description && strcmp(prop->description, "") != 0)
|
|
|
|
fprintf(f, "\t/* %s: %s */\n", prop->name, prop->description);
|
|
|
|
else if(prop->name)
|
|
|
|
fprintf(f, "\t/* %s */\n", prop->name);
|
|
|
|
else
|
|
|
|
fprintf(f, "\t/* */\n");
|
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_BOOLEAN: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tbool %s(void);", prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_INT: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tint %s(void);", prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_FLOAT: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tfloat %s(void);", prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tArray<float, %d> %s(void);", prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_ENUM: {
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if(eprop->item) {
|
|
|
|
fprintf(f, "\tenum %s_enum {\n", prop->identifier);
|
|
|
|
|
|
|
|
for(i=0; i<eprop->totitem; i++)
|
2009-07-10 11:36:02 +00:00
|
|
|
if(eprop->item[i].identifier[0])
|
|
|
|
fprintf(f, "\t\t%s_%s = %d,\n", prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
|
2009-03-14 23:17:55 +00:00
|
|
|
|
|
|
|
fprintf(f, "\t};\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\t%s_enum %s(void);", prop->identifier, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_STRING: {
|
|
|
|
fprintf(f, "\tstd::string %s(void);", prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)dp->prop;
|
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(pprop->type)
|
|
|
|
fprintf(f, "\t%s %s(void);", (char*)pprop->type, prop->identifier);
|
2009-03-14 23:17:55 +00:00
|
|
|
else
|
|
|
|
fprintf(f, "\t%s %s(void);", "UnknownType", prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
|
|
|
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)dp->prop;
|
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(cprop->type)
|
|
|
|
fprintf(f, "\tCOLLECTION_PROPERTY(%s, %s, %s)", (char*)cprop->type, srna->identifier, prop->identifier);
|
2009-03-14 23:17:55 +00:00
|
|
|
else
|
|
|
|
fprintf(f, "\tCOLLECTION_PROPERTY(%s, %s, %s)", "UnknownType", srna->identifier, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_def_property_funcs_impl_cpp(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
|
2009-03-14 23:17:55 +00:00
|
|
|
{
|
|
|
|
PropertyRNA *prop;
|
|
|
|
|
|
|
|
prop= dp->prop;
|
|
|
|
|
|
|
|
if(prop->flag & (PROP_IDPROPERTY|PROP_BUILTIN))
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch(prop->type) {
|
|
|
|
case PROP_BOOLEAN: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tBOOLEAN_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tBOOLEAN_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_INT: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tINT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tINT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_FLOAT: {
|
|
|
|
if(!prop->arraylength)
|
|
|
|
fprintf(f, "\tFLOAT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "\tFLOAT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_ENUM: {
|
|
|
|
fprintf(f, "\tENUM_PROPERTY(%s_enum, %s, %s)", prop->identifier, srna->identifier, prop->identifier);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_STRING: {
|
|
|
|
fprintf(f, "\tSTRING_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_POINTER: {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)dp->prop;
|
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(pprop->type)
|
|
|
|
fprintf(f, "\tPOINTER_PROPERTY(%s, %s, %s)", (char*)pprop->type, srna->identifier, prop->identifier);
|
2009-03-14 23:17:55 +00:00
|
|
|
else
|
|
|
|
fprintf(f, "\tPOINTER_PROPERTY(%s, %s, %s)", "UnknownType", srna->identifier, prop->identifier);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PROP_COLLECTION: {
|
|
|
|
/*CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)dp->prop;
|
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(cprop->type)
|
|
|
|
fprintf(f, "\tCOLLECTION_PROPERTY(%s, %s, %s)", (char*)cprop->type, srna->identifier, prop->identifier);
|
2009-03-14 23:17:55 +00:00
|
|
|
else
|
|
|
|
fprintf(f, "\tCOLLECTION_PROPERTY(%s, %s, %s)", "UnknownType", srna->identifier, prop->identifier);*/
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA *dfunc)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
2009-04-07 00:49:39 +00:00
|
|
|
StructRNA *srna;
|
|
|
|
FunctionRNA *func;
|
|
|
|
PropertyDefRNA *dparm;
|
|
|
|
char *funcname, *ptrstr;
|
2009-06-18 19:48:55 +00:00
|
|
|
int first;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
srna= dsrna->srna;
|
|
|
|
func= dfunc->func;
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
if(func->flag & FUNC_REGISTER)
|
|
|
|
return;
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
funcname= rna_alloc_function_name(srna->identifier, func->identifier, "call");
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* function definition */
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "void %s(bContext *C, ReportList *reports, PointerRNA *_ptr, ParameterList *_parms)", funcname);
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "\n{\n");
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* variable definitions */
|
2009-06-18 19:48:55 +00:00
|
|
|
if((func->flag & FUNC_NO_SELF)==0) {
|
2009-04-07 00:49:39 +00:00
|
|
|
if(dsrna->dnaname) fprintf(f, "\tstruct %s *_self;\n", dsrna->dnaname);
|
|
|
|
else fprintf(f, "\tstruct %s *_self;\n", srna->identifier);
|
|
|
|
}
|
|
|
|
|
|
|
|
dparm= dfunc->cont.properties.first;
|
|
|
|
for(; dparm; dparm= dparm->next) {
|
|
|
|
ptrstr= (dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0)? "*" : "";
|
|
|
|
fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\tchar *_data");
|
|
|
|
if(func->ret) fprintf(f, ", *_retdata");
|
|
|
|
fprintf(f, ";\n");
|
2009-07-11 16:11:26 +00:00
|
|
|
if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) fprintf(f, "\tint _ret_array_length;\n");
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "\t\n");
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* assign self */
|
2009-06-18 19:48:55 +00:00
|
|
|
if((func->flag & FUNC_NO_SELF)==0) {
|
2009-04-07 00:49:39 +00:00
|
|
|
if(dsrna->dnaname) fprintf(f, "\t_self= (struct %s *)_ptr->data;\n", dsrna->dnaname);
|
|
|
|
else fprintf(f, "\t_self= (struct %s *)_ptr->data;\n", srna->identifier);
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\t_data= (char *)_parms->data;\n");
|
|
|
|
|
|
|
|
dparm= dfunc->cont.properties.first;
|
|
|
|
for(; dparm; dparm= dparm->next) {
|
|
|
|
if(dparm->prop==func->ret)
|
|
|
|
fprintf(f, "\t_retdata= _data;\n");
|
2009-04-08 16:40:46 +00:00
|
|
|
else if(dparm->prop->arraylength)
|
|
|
|
fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
|
|
|
else if(dparm->prop->type == PROP_POINTER) {
|
2009-06-16 00:52:21 +00:00
|
|
|
if(dparm->prop->flag & PROP_RNAPTR)
|
2009-04-08 16:40:46 +00:00
|
|
|
fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
|
|
|
else
|
|
|
|
fprintf(f, "\t%s= *((%s%s**)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
|
|
|
}
|
2009-04-07 00:49:39 +00:00
|
|
|
else
|
2009-04-08 16:40:46 +00:00
|
|
|
fprintf(f, "\t%s= *((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
2009-04-07 00:49:39 +00:00
|
|
|
|
|
|
|
if(dparm->next)
|
|
|
|
fprintf(f, "\t_data+= %d;\n", rna_parameter_size(dparm->prop));
|
|
|
|
}
|
|
|
|
|
|
|
|
if(dfunc->call) {
|
|
|
|
fprintf(f, "\t\n");
|
|
|
|
fprintf(f, "\t");
|
|
|
|
if(func->ret) fprintf(f, "%s= ", func->ret->identifier);
|
|
|
|
fprintf(f, "%s(", dfunc->call);
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
first= 1;
|
|
|
|
|
|
|
|
if((func->flag & FUNC_NO_SELF)==0) {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "_self");
|
2009-06-18 19:48:55 +00:00
|
|
|
first= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(func->flag & FUNC_USE_CONTEXT) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "C");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(func->flag & FUNC_USE_REPORTS) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "reports");
|
|
|
|
}
|
2009-04-07 00:49:39 +00:00
|
|
|
|
2009-07-11 16:11:26 +00:00
|
|
|
if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "&_ret_array_length");
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
dparm= dfunc->cont.properties.first;
|
|
|
|
for(; dparm; dparm= dparm->next) {
|
|
|
|
if(dparm->prop==func->ret)
|
|
|
|
continue;
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "%s", dparm->prop->identifier);
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, ");\n");
|
|
|
|
|
|
|
|
if(func->ret) {
|
|
|
|
dparm= rna_find_parameter_def(func->ret);
|
|
|
|
ptrstr= dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0 ? "*" : "";
|
|
|
|
fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->ret->identifier);
|
2009-07-11 16:11:26 +00:00
|
|
|
|
|
|
|
if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
|
|
|
|
fprintf(f, "\t_parms->func->ret->arraylength= _ret_array_length;\n");
|
|
|
|
}
|
2009-04-07 00:49:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "}\n\n");
|
|
|
|
|
2009-04-15 15:12:42 +00:00
|
|
|
dfunc->gencall= funcname;
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_auto_types()
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
PropertyDefRNA *dp;
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
2009-01-15 04:22:23 +00:00
|
|
|
/* DNA name for Screen is patched in 2.5, we do the reverse here .. */
|
|
|
|
if(ds->dnaname && strcmp(ds->dnaname, "Screen") == 0)
|
|
|
|
ds->dnaname= "bScreen";
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next) {
|
2009-01-15 04:22:23 +00:00
|
|
|
if(dp->dnastructname && strcmp(dp->dnastructname, "Screen") == 0)
|
|
|
|
dp->dnastructname= "bScreen";
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
if(dp->dnatype) {
|
|
|
|
if(dp->prop->type == PROP_POINTER) {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)dp->prop;
|
2009-05-29 15:12:31 +00:00
|
|
|
StructRNA *type;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(!pprop->type && !pprop->get)
|
|
|
|
pprop->type= (StructRNA*)rna_find_type(dp->dnatype);
|
2009-05-29 15:12:31 +00:00
|
|
|
|
|
|
|
if(pprop->type) {
|
|
|
|
type= rna_find_struct((char*)pprop->type);
|
|
|
|
if(type && (type->flag & STRUCT_ID_REFCOUNT))
|
|
|
|
pprop->property.flag |= PROP_ID_REFCOUNT;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
else if(dp->prop->type== PROP_COLLECTION) {
|
|
|
|
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)dp->prop;
|
|
|
|
|
2009-03-23 13:24:48 +00:00
|
|
|
if(!cprop->type && !cprop->get && strcmp(dp->dnatype, "ListBase")==0)
|
|
|
|
cprop->type= (StructRNA*)rna_find_type(dp->dnatype);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-26 22:24:26 +00:00
|
|
|
static void rna_sort(BlenderRNA *brna)
|
|
|
|
{
|
2009-02-02 19:57:57 +00:00
|
|
|
StructDefRNA *ds;
|
2008-11-26 22:24:26 +00:00
|
|
|
StructRNA *srna;
|
|
|
|
|
|
|
|
rna_sortlist(&brna->structs, cmp_struct);
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_sortlist(&DefRNA.structs, cmp_def_struct);
|
2008-11-26 22:24:26 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(srna=brna->structs.first; srna; srna=srna->cont.next)
|
|
|
|
rna_sortlist(&srna->cont.properties, cmp_property);
|
2009-02-02 19:57:57 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
|
|
|
rna_sortlist(&ds->cont.properties, cmp_def_property);
|
2008-11-26 22:24:26 +00:00
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
static const char *rna_property_structname(PropertyType type)
|
|
|
|
{
|
|
|
|
switch(type) {
|
|
|
|
case PROP_BOOLEAN: return "BooleanPropertyRNA";
|
|
|
|
case PROP_INT: return "IntPropertyRNA";
|
|
|
|
case PROP_FLOAT: return "FloatPropertyRNA";
|
|
|
|
case PROP_STRING: return "StringPropertyRNA";
|
|
|
|
case PROP_ENUM: return "EnumPropertyRNA";
|
|
|
|
case PROP_POINTER: return "PointerPropertyRNA";
|
|
|
|
case PROP_COLLECTION: return "CollectionPropertyRNA";
|
|
|
|
default: return "UnknownPropertyRNA";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_property_typename(PropertyType type)
|
|
|
|
{
|
|
|
|
switch(type) {
|
|
|
|
case PROP_BOOLEAN: return "PROP_BOOLEAN";
|
|
|
|
case PROP_INT: return "PROP_INT";
|
|
|
|
case PROP_FLOAT: return "PROP_FLOAT";
|
|
|
|
case PROP_STRING: return "PROP_STRING";
|
|
|
|
case PROP_ENUM: return "PROP_ENUM";
|
|
|
|
case PROP_POINTER: return "PROP_POINTER";
|
|
|
|
case PROP_COLLECTION: return "PROP_COLLECTION";
|
|
|
|
default: return "PROP_UNKNOWN";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rna_property_subtypename(PropertyType type)
|
|
|
|
{
|
|
|
|
switch(type) {
|
|
|
|
case PROP_NONE: return "PROP_NONE";
|
|
|
|
case PROP_UNSIGNED: return "PROP_UNSIGNED";
|
|
|
|
case PROP_FILEPATH: return "PROP_FILEPATH";
|
2008-12-15 10:48:04 +00:00
|
|
|
case PROP_DIRPATH: return "PROP_DIRPATH";
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_COLOR: return "PROP_COLOR";
|
|
|
|
case PROP_VECTOR: return "PROP_VECTOR";
|
|
|
|
case PROP_MATRIX: return "PROP_MATRIX";
|
2008-12-02 10:10:07 +00:00
|
|
|
case PROP_ROTATION: return "PROP_ROTATION";
|
2009-01-10 22:57:33 +00:00
|
|
|
case PROP_NEVER_NULL: return "PROP_NEVER_NULL";
|
2009-02-17 21:07:01 +00:00
|
|
|
case PROP_PERCENTAGE: return "PROP_PERCENTAGE";
|
2008-10-31 23:50:02 +00:00
|
|
|
default: return "PROP_UNKNOWN";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_generate_prototypes(BlenderRNA *brna, FILE *f)
|
|
|
|
{
|
2008-11-07 02:58:25 +00:00
|
|
|
StructRNA *srna;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(srna=brna->structs.first; srna; srna=srna->cont.next)
|
2009-01-08 13:57:29 +00:00
|
|
|
fprintf(f, "extern StructRNA RNA_%s;\n", srna->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "\n");
|
2009-01-08 13:57:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_generate_blender(BlenderRNA *brna, FILE *f)
|
|
|
|
{
|
|
|
|
StructRNA *srna;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
fprintf(f, "BlenderRNA BLENDER_RNA = {");
|
|
|
|
|
2008-11-07 02:58:25 +00:00
|
|
|
srna= brna->structs.first;
|
2008-11-14 18:46:57 +00:00
|
|
|
if(srna) fprintf(f, "{&RNA_%s, ", srna->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "{NULL, ");
|
|
|
|
|
2008-11-07 02:58:25 +00:00
|
|
|
srna= brna->structs.last;
|
2008-11-14 18:46:57 +00:00
|
|
|
if(srna) fprintf(f, "&RNA_%s}", srna->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL}");
|
|
|
|
|
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static void rna_generate_property_prototypes(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
|
|
|
PropertyRNA *prop;
|
2009-02-02 19:57:57 +00:00
|
|
|
StructRNA *base;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
base= srna->base;
|
|
|
|
while (base) {
|
|
|
|
fprintf(f, "\n");
|
2009-04-07 00:49:39 +00:00
|
|
|
for(prop=base->cont.properties.first; prop; prop=prop->next)
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "%s%s rna_%s_%s;\n", "extern ", rna_property_structname(prop->type), base->identifier, prop->identifier);
|
|
|
|
base= base->base;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
if(srna->cont.properties.first)
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(prop=srna->cont.properties.first; prop; prop=prop->next)
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "%s%s rna_%s_%s;\n", (prop->flag & PROP_EXPORT)? "": "", rna_property_structname(prop->type), srna->identifier, prop->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_generate_parameter_prototypes(BlenderRNA *brna, StructRNA *srna, FunctionRNA *func, FILE *f)
|
2009-02-02 19:57:57 +00:00
|
|
|
{
|
2009-04-07 00:49:39 +00:00
|
|
|
PropertyRNA *parm;
|
|
|
|
|
|
|
|
for(parm= func->cont.properties.first; parm; parm= parm->next)
|
|
|
|
fprintf(f, "%s%s rna_%s_%s_%s;\n", "extern ", rna_property_structname(parm->type), srna->identifier, func->identifier, parm->identifier);
|
|
|
|
|
|
|
|
if(func->cont.properties.first)
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_generate_function_prototypes(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|
|
|
{
|
|
|
|
FunctionRNA *func;
|
2009-02-02 19:57:57 +00:00
|
|
|
StructRNA *base;
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
base= srna->base;
|
|
|
|
while (base) {
|
|
|
|
for(func= base->functions.first; func; func= func->cont.next) {
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "%s%s rna_%s_%s_func;\n", "extern ", "FunctionRNA", base->identifier, func->identifier);
|
2009-04-07 00:49:39 +00:00
|
|
|
rna_generate_parameter_prototypes(brna, base, func, f);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(base->functions.first)
|
|
|
|
fprintf(f, "\n");
|
|
|
|
|
|
|
|
base= base->base;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(func= srna->functions.first; func; func= func->cont.next) {
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "%s%s rna_%s_%s_func;\n", "extern ", "FunctionRNA", srna->identifier, func->identifier);
|
2009-04-07 00:49:39 +00:00
|
|
|
rna_generate_parameter_prototypes(brna, srna, func, f);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(srna->functions.first)
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
2009-04-15 15:12:42 +00:00
|
|
|
static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA *srna, FunctionDefRNA *dfunc, FILE *f)
|
|
|
|
{
|
|
|
|
FunctionRNA *func;
|
|
|
|
PropertyDefRNA *dparm;
|
|
|
|
StructDefRNA *dsrna;
|
2009-06-18 19:48:55 +00:00
|
|
|
int first;
|
2009-04-15 15:12:42 +00:00
|
|
|
|
|
|
|
dsrna= rna_find_struct_def(srna);
|
|
|
|
func= dfunc->func;
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* return type */
|
2009-04-15 15:12:42 +00:00
|
|
|
for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
|
|
|
|
if(dparm->prop==func->ret) {
|
2009-07-11 16:11:26 +00:00
|
|
|
if(dparm->prop->arraylength && !(dparm->prop->flag & PROP_DYNAMIC_ARRAY))
|
|
|
|
fprintf(f, "\"XXX array return types only allowed with PROP_DYNAMIC_ARRAY flag.\""); /* XXX not supported */
|
|
|
|
else if(dparm->prop->type == PROP_POINTER || (dparm->prop->flag & PROP_DYNAMIC_ARRAY))
|
2009-04-15 15:12:42 +00:00
|
|
|
fprintf(f, "%s%s *", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
|
|
|
else
|
|
|
|
fprintf(f, "%s%s ", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* void if nothing to return */
|
2009-04-15 15:12:42 +00:00
|
|
|
if(!dparm)
|
|
|
|
fprintf(f, "void ");
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* function name */
|
2009-04-15 15:12:42 +00:00
|
|
|
fprintf(f, "%s(", dfunc->call);
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
first= 1;
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* self, context and reports parameters */
|
2009-06-18 19:48:55 +00:00
|
|
|
if((func->flag & FUNC_NO_SELF)==0) {
|
|
|
|
if(dsrna->dnaname) fprintf(f, "struct %s *_self", dsrna->dnaname);
|
|
|
|
else fprintf(f, "struct %s *_self", srna->identifier);
|
|
|
|
first= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(func->flag & FUNC_USE_CONTEXT) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "bContext *C");
|
|
|
|
}
|
|
|
|
|
|
|
|
if(func->flag & FUNC_USE_REPORTS) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "ReportList *reports");
|
|
|
|
}
|
2009-04-15 15:12:42 +00:00
|
|
|
|
2009-07-11 16:11:26 +00:00
|
|
|
/* dynamic array length paramter */
|
|
|
|
if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
fprintf(f, "int *array_length");
|
|
|
|
}
|
|
|
|
|
2009-06-27 01:10:39 +00:00
|
|
|
/* defined parameters */
|
2009-04-15 15:12:42 +00:00
|
|
|
for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
|
2009-06-18 19:48:55 +00:00
|
|
|
if(dparm->prop==func->ret)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if(!first) fprintf(f, ", ");
|
|
|
|
first= 0;
|
|
|
|
|
|
|
|
if(dparm->prop->arraylength)
|
|
|
|
fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->arraylength);
|
2009-04-15 15:12:42 +00:00
|
|
|
else if(dparm->prop->type == PROP_POINTER)
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "%s%s *%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
|
2009-04-15 15:12:42 +00:00
|
|
|
else
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "%s%s %s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
|
2009-04-15 15:12:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, ");\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_generate_static_function_prototypes(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|
|
|
{
|
|
|
|
FunctionRNA *func;
|
|
|
|
FunctionDefRNA *dfunc;
|
|
|
|
|
|
|
|
fprintf(f, "/* Repeated prototypes to detect errors */\n\n");
|
|
|
|
|
|
|
|
for(func= srna->functions.first; func; func= func->cont.next) {
|
2009-04-19 13:37:59 +00:00
|
|
|
if(func->flag & FUNC_REGISTER)
|
|
|
|
continue;
|
|
|
|
|
2009-04-15 15:12:42 +00:00
|
|
|
dfunc= rna_find_function_def(func);
|
|
|
|
if(dfunc->call)
|
|
|
|
rna_generate_static_parameter_prototypes(brna, srna, dfunc, f);
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, PropertyRNA *prop)
|
|
|
|
{
|
|
|
|
char *strnest= "", *errnest= "";
|
|
|
|
int len, freenest= 0;
|
|
|
|
|
|
|
|
if(nest != NULL) {
|
|
|
|
len= strlen(nest);
|
|
|
|
|
2009-06-19 23:05:21 +00:00
|
|
|
strnest= MEM_mallocN(sizeof(char)*(len+2), "rna_generate_property -> strnest");
|
|
|
|
errnest= MEM_mallocN(sizeof(char)*(len+2), "rna_generate_property -> errnest");
|
2009-04-07 00:49:39 +00:00
|
|
|
|
|
|
|
strcpy(strnest, "_"); strcat(strnest, nest);
|
|
|
|
strcpy(errnest, "."); strcat(errnest, nest);
|
|
|
|
|
|
|
|
freenest= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
switch(prop->type) {
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_ENUM: {
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
2009-03-06 10:22:12 +00:00
|
|
|
int i, defaultfound= 0;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
if(eprop->item) {
|
2009-07-03 19:56:19 +00:00
|
|
|
fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {", srna->identifier, strnest, prop->identifier, eprop->totitem+1);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
for(i=0; i<eprop->totitem; i++) {
|
|
|
|
fprintf(f, "{%d, ", eprop->item[i].value);
|
2008-11-14 18:46:57 +00:00
|
|
|
rna_print_c_string(f, eprop->item[i].identifier); fprintf(f, ", ");
|
2009-06-16 00:52:21 +00:00
|
|
|
fprintf(f, "%d, ", eprop->item[i].icon);
|
2008-11-24 12:12:24 +00:00
|
|
|
rna_print_c_string(f, eprop->item[i].name); fprintf(f, ", ");
|
2009-07-03 19:56:19 +00:00
|
|
|
rna_print_c_string(f, eprop->item[i].description); fprintf(f, "}, ");
|
2009-03-06 10:22:12 +00:00
|
|
|
|
2009-07-10 11:36:02 +00:00
|
|
|
if(eprop->item[i].identifier[0])
|
|
|
|
if(eprop->defaultvalue == eprop->item[i].value)
|
|
|
|
defaultfound= 1;
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2009-07-03 19:56:19 +00:00
|
|
|
fprintf(f, "{0, NULL, 0, NULL, NULL}};\n\n");
|
2009-03-06 10:22:12 +00:00
|
|
|
|
|
|
|
if(!defaultfound) {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
|
2009-03-06 10:22:12 +00:00
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
2008-11-14 11:15:53 +00:00
|
|
|
else {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(stderr, "rna_generate_structs: %s%s.%s, enum must have items defined.\n", srna->identifier, errnest, prop->identifier);
|
2008-11-14 11:15:53 +00:00
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_BOOLEAN: {
|
|
|
|
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
|
2008-11-01 00:23:08 +00:00
|
|
|
unsigned int i;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2008-11-18 10:57:06 +00:00
|
|
|
if(prop->arraylength) {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
for(i=0; i<prop->arraylength; i++) {
|
2008-11-18 10:57:06 +00:00
|
|
|
if(bprop->defaultarray)
|
|
|
|
fprintf(f, "%d", bprop->defaultarray[i]);
|
|
|
|
else
|
|
|
|
fprintf(f, "%d", bprop->defaultvalue);
|
2008-10-31 23:50:02 +00:00
|
|
|
if(i != prop->arraylength-1)
|
|
|
|
fprintf(f, ", ");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_INT: {
|
|
|
|
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
|
2008-11-01 00:23:08 +00:00
|
|
|
unsigned int i;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2008-11-18 10:57:06 +00:00
|
|
|
if(prop->arraylength) {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
for(i=0; i<prop->arraylength; i++) {
|
2008-11-18 10:57:06 +00:00
|
|
|
if(iprop->defaultarray)
|
|
|
|
fprintf(f, "%d", iprop->defaultarray[i]);
|
|
|
|
else
|
|
|
|
fprintf(f, "%d", iprop->defaultvalue);
|
2008-10-31 23:50:02 +00:00
|
|
|
if(i != prop->arraylength-1)
|
|
|
|
fprintf(f, ", ");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_FLOAT: {
|
|
|
|
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
|
2008-11-01 00:23:08 +00:00
|
|
|
unsigned int i;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2008-11-18 10:57:06 +00:00
|
|
|
if(prop->arraylength) {
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "static float rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
for(i=0; i<prop->arraylength; i++) {
|
2008-11-18 10:57:06 +00:00
|
|
|
if(fprop->defaultarray)
|
|
|
|
rna_float_print(f, fprop->defaultarray[i]);
|
|
|
|
else
|
|
|
|
rna_float_print(f, fprop->defaultvalue);
|
2008-10-31 23:50:02 +00:00
|
|
|
if(i != prop->arraylength-1)
|
|
|
|
fprintf(f, ", ");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
default:
|
|
|
|
break;
|
2009-04-07 00:49:39 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "%s%s rna_%s%s_%s = {\n", (prop->flag & PROP_EXPORT)? "": "", rna_property_structname(prop->type), srna->identifier, strnest, prop->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
if(prop->next) fprintf(f, "\t{(PropertyRNA*)&rna_%s%s_%s, ", srna->identifier, strnest, prop->next->identifier);
|
|
|
|
else fprintf(f, "\t{NULL, ");
|
|
|
|
if(prop->prev) fprintf(f, "(PropertyRNA*)&rna_%s%s_%s,\n", srna->identifier, strnest, prop->prev->identifier);
|
|
|
|
else fprintf(f, "NULL,\n");
|
|
|
|
fprintf(f, "\t%d, ", prop->magic);
|
|
|
|
rna_print_c_string(f, prop->identifier);
|
|
|
|
fprintf(f, ", %d, ", prop->flag);
|
|
|
|
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
|
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
|
|
|
rna_print_c_string(f, prop->description); fprintf(f, ",\n\t");
|
|
|
|
fprintf(f, "%d,\n", prop->icon);
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "\t%s, %s, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), prop->arraylength);
|
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
|
|
|
fprintf(f, "\t%s, %d, %s,\n", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable));
|
|
|
|
|
|
|
|
if(prop->flag & PROP_RAW_ACCESS) rna_set_raw_offset(f, srna, prop);
|
|
|
|
else fprintf(f, "\t0, 0");
|
|
|
|
fprintf(f, "},\n");
|
2009-04-07 00:49:39 +00:00
|
|
|
|
|
|
|
switch(prop->type) {
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_BOOLEAN: {
|
|
|
|
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
|
|
|
|
fprintf(f, "\t%s, %s, %s, %s, %d, ", rna_function_string(bprop->get), rna_function_string(bprop->set), rna_function_string(bprop->getarray), rna_function_string(bprop->setarray), bprop->defaultvalue);
|
2009-04-07 00:49:39 +00:00
|
|
|
if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL\n");
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_INT: {
|
|
|
|
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
|
2008-11-29 19:08:46 +00:00
|
|
|
fprintf(f, "\t%s, %s, %s, %s, %s,\n\t", rna_function_string(iprop->get), rna_function_string(iprop->set), rna_function_string(iprop->getarray), rna_function_string(iprop->setarray), rna_function_string(iprop->range));
|
2008-11-29 14:35:50 +00:00
|
|
|
rna_int_print(f, iprop->softmin); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->softmax); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->hardmax); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->step); fprintf(f, ", ");
|
|
|
|
rna_int_print(f, iprop->defaultvalue); fprintf(f, ", ");
|
2009-04-07 00:49:39 +00:00
|
|
|
if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL\n");
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_FLOAT: {
|
|
|
|
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
|
2008-11-24 12:12:24 +00:00
|
|
|
fprintf(f, "\t%s, %s, %s, %s, %s, ", rna_function_string(fprop->get), rna_function_string(fprop->set), rna_function_string(fprop->getarray), rna_function_string(fprop->setarray), rna_function_string(fprop->range));
|
2008-10-31 23:50:02 +00:00
|
|
|
rna_float_print(f, fprop->softmin); fprintf(f, ", ");
|
|
|
|
rna_float_print(f, fprop->softmax); fprintf(f, ", ");
|
|
|
|
rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
|
|
|
|
rna_float_print(f, fprop->hardmax); fprintf(f, ", ");
|
|
|
|
rna_float_print(f, fprop->step); fprintf(f, ", ");
|
2008-12-26 02:02:06 +00:00
|
|
|
rna_int_print(f, (int)fprop->precision); fprintf(f, ", ");
|
2008-10-31 23:50:02 +00:00
|
|
|
rna_float_print(f, fprop->defaultvalue); fprintf(f, ", ");
|
2009-04-07 00:49:39 +00:00
|
|
|
if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL\n");
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_STRING: {
|
|
|
|
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
|
|
|
|
fprintf(f, "\t%s, %s, %s, %d, ", rna_function_string(sprop->get), rna_function_string(sprop->length), rna_function_string(sprop->set), sprop->maxlength);
|
|
|
|
rna_print_c_string(f, sprop->defaultvalue); fprintf(f, "\n");
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_ENUM: {
|
|
|
|
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
|
2009-05-28 23:23:47 +00:00
|
|
|
fprintf(f, "\t%s, %s, %s, ", rna_function_string(eprop->get), rna_function_string(eprop->set), rna_function_string(eprop->itemf));
|
|
|
|
if(eprop->item)
|
|
|
|
fprintf(f, "rna_%s%s_%s_items, ", srna->identifier, strnest, prop->identifier);
|
|
|
|
else
|
|
|
|
fprintf(f, "NULL, ");
|
|
|
|
fprintf(f, "%d, %d\n", eprop->totitem, eprop->defaultvalue);
|
2008-10-31 23:50:02 +00:00
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_POINTER: {
|
|
|
|
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
|
2009-06-07 13:09:18 +00:00
|
|
|
fprintf(f, "\t%s, %s, %s, ", rna_function_string(pprop->get), rna_function_string(pprop->set), rna_function_string(pprop->typef));
|
2009-03-23 13:24:48 +00:00
|
|
|
if(pprop->type) fprintf(f, "&RNA_%s\n", (char*)pprop->type);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL\n");
|
|
|
|
break;
|
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
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
case PROP_COLLECTION: {
|
|
|
|
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, ", rna_function_string(cprop->begin), rna_function_string(cprop->next), rna_function_string(cprop->end), rna_function_string(cprop->get), rna_function_string(cprop->length), rna_function_string(cprop->lookupint), rna_function_string(cprop->lookupstring));
|
2009-06-18 19:48:55 +00:00
|
|
|
if(cprop->add) fprintf(f, "&rna_%s_%s_func, ", srna->identifier, (char*)cprop->add);
|
|
|
|
else fprintf(f, "NULL, ");
|
|
|
|
if(cprop->remove) fprintf(f, "&rna_%s_%s_func, ", srna->identifier, (char*)cprop->remove);
|
|
|
|
else fprintf(f, "NULL, ");
|
2009-03-23 13:24:48 +00:00
|
|
|
if(cprop->type) fprintf(f, "&RNA_%s\n", (char*)cprop->type);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL\n");
|
|
|
|
break;
|
2009-06-18 19:48:55 +00:00
|
|
|
}
|
2009-04-07 00:49:39 +00:00
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
|
|
|
|
if(freenest) {
|
|
|
|
MEM_freeN(strnest);
|
|
|
|
MEM_freeN(errnest);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|
|
|
{
|
|
|
|
FunctionRNA *func;
|
|
|
|
FunctionDefRNA *dfunc;
|
|
|
|
PropertyRNA *prop, *parm;
|
|
|
|
StructRNA *base;
|
|
|
|
|
|
|
|
fprintf(f, "/* %s */\n", srna->name);
|
|
|
|
|
|
|
|
for(prop= srna->cont.properties.first; prop; prop= prop->next)
|
|
|
|
rna_generate_property(f, srna, NULL, prop);
|
|
|
|
|
|
|
|
for(func= srna->functions.first; func; func= func->cont.next) {
|
|
|
|
for(parm= func->cont.properties.first; parm; parm= parm->next)
|
|
|
|
rna_generate_property(f, srna, func->identifier, parm);
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "%s%s rna_%s_%s_func = {\n", "", "FunctionRNA", srna->identifier, func->identifier);
|
2009-04-07 00:49:39 +00:00
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
if(func->cont.next) fprintf(f, "\t{(FunctionRNA*)&rna_%s_%s_func, ", srna->identifier, ((FunctionRNA*)func->cont.next)->identifier);
|
2009-04-07 00:49:39 +00:00
|
|
|
else fprintf(f, "\t{NULL, ");
|
2009-06-18 19:48:55 +00:00
|
|
|
if(func->cont.prev) fprintf(f, "(FunctionRNA*)&rna_%s_%s_func,\n", srna->identifier, ((FunctionRNA*)func->cont.prev)->identifier);
|
2009-04-07 00:49:39 +00:00
|
|
|
else fprintf(f, "NULL,\n");
|
|
|
|
|
2009-06-19 23:05:21 +00:00
|
|
|
fprintf(f, "\tNULL,\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
parm= func->cont.properties.first;
|
|
|
|
if(parm) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s_%s, ", srna->identifier, func->identifier, parm->identifier);
|
|
|
|
else fprintf(f, "\t{NULL, ");
|
|
|
|
|
|
|
|
parm= func->cont.properties.last;
|
|
|
|
if(parm) fprintf(f, "(PropertyRNA*)&rna_%s_%s_%s}},\n", srna->identifier, func->identifier, parm->identifier);
|
|
|
|
else fprintf(f, "NULL}},\n");
|
|
|
|
|
|
|
|
fprintf(f, "\t");
|
|
|
|
rna_print_c_string(f, func->identifier);
|
|
|
|
fprintf(f, ", %d, ", func->flag);
|
|
|
|
rna_print_c_string(f, func->description); fprintf(f, ",\n");
|
|
|
|
|
|
|
|
dfunc= rna_find_function_def(func);
|
2009-04-15 15:12:42 +00:00
|
|
|
if(dfunc->gencall) fprintf(f, "\t%s,\n", dfunc->gencall);
|
2009-04-07 00:49:39 +00:00
|
|
|
else fprintf(f, "\tNULL,\n");
|
|
|
|
|
|
|
|
if(func->ret) fprintf(f, "\t(PropertyRNA*)&rna_%s_%s_%s\n", srna->identifier, func->identifier, func->ret->identifier);
|
|
|
|
else fprintf(f, "\tNULL\n");
|
|
|
|
|
|
|
|
fprintf(f, "};\n");
|
|
|
|
fprintf(f, "\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
2008-11-14 18:46:57 +00:00
|
|
|
fprintf(f, "StructRNA RNA_%s = {\n", srna->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
if(srna->cont.next) fprintf(f, "\t{(ContainerRNA *)&RNA_%s, ", ((StructRNA*)srna->cont.next)->identifier);
|
|
|
|
else fprintf(f, "\t{NULL, ");
|
|
|
|
if(srna->cont.prev) fprintf(f, "(ContainerRNA *)&RNA_%s,\n", ((StructRNA*)srna->cont.prev)->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL,\n");
|
2009-04-07 00:49:39 +00:00
|
|
|
|
2009-06-19 23:05:21 +00:00
|
|
|
fprintf(f, "\tNULL,\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
prop= srna->cont.properties.first;
|
|
|
|
if(prop) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s, ", srna->identifier, prop->identifier);
|
|
|
|
else fprintf(f, "\t{NULL, ");
|
|
|
|
|
|
|
|
prop= srna->cont.properties.last;
|
|
|
|
if(prop) fprintf(f, "(PropertyRNA*)&rna_%s_%s}},\n", srna->identifier, prop->identifier);
|
|
|
|
else fprintf(f, "NULL}},\n");
|
|
|
|
|
2009-04-19 13:37:59 +00:00
|
|
|
fprintf(f, "\tNULL,NULL,\n"); /* PyType - Cant initialize here */
|
2009-03-11 17:28:37 +00:00
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "\t");
|
2008-11-14 18:46:57 +00:00
|
|
|
rna_print_c_string(f, srna->identifier);
|
2008-11-07 02:58:25 +00:00
|
|
|
fprintf(f, ", %d, ", srna->flag);
|
|
|
|
rna_print_c_string(f, srna->name);
|
2008-12-19 04:06:24 +00:00
|
|
|
fprintf(f, ", ");
|
|
|
|
rna_print_c_string(f, srna->description);
|
2009-06-03 23:16:51 +00:00
|
|
|
fprintf(f, ",\n %d,\n", srna->icon);
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2008-11-07 02:58:25 +00:00
|
|
|
prop= srna->nameproperty;
|
2009-02-02 19:57:57 +00:00
|
|
|
if(prop) {
|
|
|
|
base= srna;
|
|
|
|
while (base->base && base->base->nameproperty==prop)
|
|
|
|
base= base->base;
|
|
|
|
|
|
|
|
fprintf(f, "\t(PropertyRNA*)&rna_%s_%s, ", base->identifier, prop->identifier);
|
|
|
|
}
|
2008-11-14 14:34:19 +00:00
|
|
|
else fprintf(f, "\tNULL, ");
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
prop= srna->iteratorproperty;
|
|
|
|
base= srna;
|
|
|
|
while (base->base && base->base->iteratorproperty==prop)
|
|
|
|
base= base->base;
|
|
|
|
fprintf(f, "(PropertyRNA*)&rna_%s_rna_properties,\n", base->identifier);
|
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-10 22:57:33 +00:00
|
|
|
if(srna->base) fprintf(f, "\t&RNA_%s,\n", srna->base->identifier);
|
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 fprintf(f, "\tNULL,\n");
|
|
|
|
|
2009-01-10 22:57:33 +00:00
|
|
|
if(srna->nested) fprintf(f, "\t&RNA_%s,\n", srna->nested->identifier);
|
2009-01-09 16:08:47 +00:00
|
|
|
else fprintf(f, "\tNULL,\n");
|
|
|
|
|
2009-01-01 15:52:51 +00:00
|
|
|
fprintf(f, "\t%s,\n", rna_function_string(srna->refine));
|
2009-03-25 20:29:01 +00:00
|
|
|
fprintf(f, "\t%s,\n", rna_function_string(srna->path));
|
2009-04-19 13:37:59 +00:00
|
|
|
fprintf(f, "\t%s,\n", rna_function_string(srna->reg));
|
|
|
|
fprintf(f, "\t%s,\n", rna_function_string(srna->unreg));
|
2009-05-20 09:52:02 +00:00
|
|
|
fprintf(f, "\t%s,\n", rna_function_string(srna->idproperties));
|
2009-04-19 13:37:59 +00:00
|
|
|
|
|
|
|
if(srna->reg && !srna->refine) {
|
|
|
|
fprintf(stderr, "rna_generate_struct: %s has a register function, must also have refine function.\n", srna->identifier);
|
|
|
|
DefRNA.error= 1;
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
func= srna->functions.first;
|
2009-06-18 19:48:55 +00:00
|
|
|
if(func) fprintf(f, "\t{(FunctionRNA*)&rna_%s_%s_func, ", srna->identifier, func->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "\t{NULL, ");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
func= srna->functions.last;
|
2009-06-18 19:48:55 +00:00
|
|
|
if(func) fprintf(f, "(FunctionRNA*)&rna_%s_%s_func}\n", srna->identifier, func->identifier);
|
2008-10-31 23:50:02 +00:00
|
|
|
else fprintf(f, "NULL}\n");
|
|
|
|
|
|
|
|
fprintf(f, "};\n");
|
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct RNAProcessItem {
|
|
|
|
char *filename;
|
2009-06-18 19:48:55 +00:00
|
|
|
char *api_filename;
|
2008-10-31 23:50:02 +00:00
|
|
|
void (*define)(BlenderRNA *brna);
|
|
|
|
} RNAProcessItem;
|
|
|
|
|
|
|
|
RNAProcessItem PROCESS_ITEMS[]= {
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_rna.c", NULL, RNA_def_rna},
|
|
|
|
{"rna_ID.c", NULL, RNA_def_ID},
|
|
|
|
{"rna_texture.c", NULL, RNA_def_texture},
|
2009-07-11 11:58:50 +00:00
|
|
|
{"rna_action.c", "rna_action_api.c", RNA_def_action},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_animation.c", NULL, RNA_def_animation},
|
|
|
|
{"rna_actuator.c", NULL, RNA_def_actuator},
|
|
|
|
{"rna_armature.c", NULL, RNA_def_armature},
|
2009-07-20 23:52:53 +00:00
|
|
|
{"rna_boid.c", NULL, RNA_def_boid},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_brush.c", NULL, RNA_def_brush},
|
|
|
|
{"rna_camera.c", NULL, RNA_def_camera},
|
|
|
|
{"rna_cloth.c", NULL, RNA_def_cloth},
|
|
|
|
{"rna_color.c", NULL, RNA_def_color},
|
|
|
|
{"rna_constraint.c", NULL, RNA_def_constraint},
|
|
|
|
{"rna_context.c", NULL, RNA_def_context},
|
|
|
|
{"rna_controller.c", NULL, RNA_def_controller},
|
|
|
|
{"rna_curve.c", NULL, RNA_def_curve},
|
|
|
|
{"rna_fcurve.c", NULL, RNA_def_fcurve},
|
|
|
|
{"rna_fluidsim.c", NULL, RNA_def_fluidsim},
|
|
|
|
{"rna_group.c", NULL, RNA_def_group},
|
|
|
|
{"rna_image.c", NULL, RNA_def_image},
|
|
|
|
{"rna_key.c", NULL, RNA_def_key},
|
|
|
|
{"rna_lamp.c", NULL, RNA_def_lamp},
|
|
|
|
{"rna_lattice.c", NULL, RNA_def_lattice},
|
|
|
|
{"rna_main.c", "rna_main_api.c", RNA_def_main},
|
2009-07-02 20:46:35 +00:00
|
|
|
{"rna_material.c", "rna_material_api.c", RNA_def_material},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_mesh.c", "rna_mesh_api.c", RNA_def_mesh},
|
|
|
|
{"rna_meta.c", NULL, RNA_def_meta},
|
|
|
|
{"rna_modifier.c", NULL, RNA_def_modifier},
|
2009-06-20 03:58:25 +00:00
|
|
|
{"rna_nla.c", NULL, RNA_def_nla},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_nodetree.c", NULL, RNA_def_nodetree},
|
|
|
|
{"rna_object.c", "rna_object_api.c", RNA_def_object},
|
|
|
|
{"rna_object_force.c", NULL, RNA_def_object_force},
|
|
|
|
{"rna_packedfile.c", NULL, RNA_def_packedfile},
|
|
|
|
{"rna_particle.c", NULL, RNA_def_particle},
|
2009-07-10 14:46:52 +00:00
|
|
|
{"rna_pose.c", "rna_pose_api.c", RNA_def_pose},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_property.c", NULL, RNA_def_gameproperty},
|
2009-06-24 19:23:34 +00:00
|
|
|
{"rna_scene.c", "rna_scene_api.c", RNA_def_scene},
|
2009-06-18 19:48:55 +00:00
|
|
|
{"rna_screen.c", NULL, RNA_def_screen},
|
|
|
|
{"rna_scriptlink.c", NULL, RNA_def_scriptlink},
|
|
|
|
{"rna_sensor.c", NULL, RNA_def_sensor},
|
|
|
|
{"rna_sequence.c", NULL, RNA_def_sequence},
|
|
|
|
{"rna_space.c", NULL, RNA_def_space},
|
|
|
|
{"rna_text.c", NULL, RNA_def_text},
|
|
|
|
{"rna_timeline.c", NULL, RNA_def_timeline_marker},
|
|
|
|
{"rna_sound.c", NULL, RNA_def_sound},
|
|
|
|
{"rna_ui.c", "rna_ui_api.c", RNA_def_ui},
|
|
|
|
{"rna_userdef.c", NULL, RNA_def_userdef},
|
|
|
|
{"rna_vfont.c", NULL, RNA_def_vfont},
|
|
|
|
{"rna_vpaint.c", NULL, RNA_def_vpaint},
|
|
|
|
{"rna_wm.c", "rna_wm_api.c", RNA_def_wm},
|
|
|
|
{"rna_world.c", NULL, RNA_def_world},
|
2008-10-31 23:50:02 +00:00
|
|
|
{NULL, NULL}};
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_filename)
|
2008-10-31 23:50:02 +00:00
|
|
|
{
|
2009-01-08 13:57:29 +00:00
|
|
|
StructDefRNA *ds;
|
|
|
|
PropertyDefRNA *dp;
|
2009-04-07 00:49:39 +00:00
|
|
|
FunctionDefRNA *dfunc;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
fprintf(f, "\n/* Automatically generated struct definitions for the Data API.\n"
|
2009-02-02 19:57:57 +00:00
|
|
|
" Do not edit manually, changes will be overwritten. */\n\n"
|
|
|
|
"#define RNA_RUNTIME\n\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
|
|
|
fprintf(f, "#include <float.h>\n");
|
|
|
|
fprintf(f, "#include <limits.h>\n");
|
|
|
|
fprintf(f, "#include <string.h>\n\n");
|
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
|
|
|
fprintf(f, "#include <stddef.h>\n\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-05-28 23:23:47 +00:00
|
|
|
fprintf(f, "#include \"DNA_ID.h\"\n");
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "#include \"BLI_blenlib.h\"\n\n");
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "#include \"BKE_context.h\"\n");
|
2009-05-28 23:23:47 +00:00
|
|
|
fprintf(f, "#include \"BKE_library.h\"\n");
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "#include \"BKE_report.h\"\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "#include \"BKE_utildefines.h\"\n\n");
|
|
|
|
|
2008-11-14 14:34:19 +00:00
|
|
|
fprintf(f, "#include \"RNA_define.h\"\n");
|
|
|
|
fprintf(f, "#include \"RNA_types.h\"\n");
|
2008-10-31 23:50:02 +00:00
|
|
|
fprintf(f, "#include \"rna_internal.h\"\n\n");
|
|
|
|
|
2009-01-08 13:57:29 +00:00
|
|
|
rna_generate_prototypes(brna, f);
|
|
|
|
|
2009-06-18 19:48:55 +00:00
|
|
|
fprintf(f, "#include \"%s\"\n", filename);
|
|
|
|
if(api_filename)
|
|
|
|
fprintf(f, "#include \"%s\"\n", api_filename);
|
|
|
|
fprintf(f, "\n");
|
2009-01-08 13:57:29 +00:00
|
|
|
|
|
|
|
fprintf(f, "/* Autogenerated Functions */\n\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
|
|
|
if(!filename || ds->filename == filename) {
|
2009-02-02 19:57:57 +00:00
|
|
|
rna_generate_property_prototypes(brna, ds->srna, f);
|
2009-04-07 00:49:39 +00:00
|
|
|
rna_generate_function_prototypes(brna, ds->srna, f);
|
|
|
|
}
|
|
|
|
}
|
2009-02-02 19:57:57 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
2009-01-08 13:57:29 +00:00
|
|
|
if(!filename || ds->filename == filename)
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next)
|
|
|
|
rna_def_property_funcs(f, ds->srna, dp);
|
2009-01-08 13:57:29 +00:00
|
|
|
|
2009-04-15 15:12:42 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
|
|
|
if(!filename || ds->filename == filename) {
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dfunc=ds->functions.first; dfunc; dfunc= dfunc->cont.next)
|
|
|
|
rna_def_function_funcs(f, ds, dfunc);
|
|
|
|
|
2009-04-15 15:12:42 +00:00
|
|
|
rna_generate_static_function_prototypes(brna, ds->srna, f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
2009-01-08 13:57:29 +00:00
|
|
|
if(!filename || ds->filename == filename)
|
|
|
|
rna_generate_struct(brna, ds->srna, f);
|
|
|
|
|
|
|
|
if(strcmp(filename, "rna_ID.c") == 0) {
|
|
|
|
/* this is ugly, but we cannot have c files compiled for both
|
|
|
|
* makesrna and blender with some build systems at the moment */
|
|
|
|
fprintf(f, "#include \"rna_define.c\"\n\n");
|
|
|
|
|
|
|
|
rna_generate_blender(brna, f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
static void rna_generate_header(BlenderRNA *brna, FILE *f)
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
PropertyDefRNA *dp;
|
|
|
|
StructRNA *srna;
|
|
|
|
|
2009-02-03 10:14:29 +00:00
|
|
|
fprintf(f, "\n#ifndef __RNA_BLENDER_H__\n");
|
|
|
|
fprintf(f, "#define __RNA_BLENDER_H__\n\n");
|
|
|
|
|
|
|
|
fprintf(f, "/* Automatically generated function declarations for the Data API.\n"
|
2009-02-02 19:57:57 +00:00
|
|
|
" Do not edit manually, changes will be overwritten. */\n\n");
|
|
|
|
|
|
|
|
fprintf(f, "#include \"RNA_types.h\"\n\n");
|
|
|
|
|
2009-03-14 23:17:55 +00:00
|
|
|
fprintf(f, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
|
|
|
|
|
2009-02-03 10:14:29 +00:00
|
|
|
fprintf(f, "#define FOREACH_BEGIN(property, sptr, itemptr) \\\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " { \\\n");
|
2009-02-03 10:14:29 +00:00
|
|
|
fprintf(f, " CollectionPropertyIterator rna_macro_iter; \\\n");
|
|
|
|
fprintf(f, " for(property##_begin(&rna_macro_iter, sptr); rna_macro_iter.valid; property##_next(&rna_macro_iter)) { \\\n");
|
|
|
|
fprintf(f, " itemptr= rna_macro_iter.ptr;\n\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
|
2009-02-03 10:14:29 +00:00
|
|
|
fprintf(f, "#define FOREACH_END(property) \\\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " } \\\n");
|
2009-02-03 10:14:29 +00:00
|
|
|
fprintf(f, " property##_end(&rna_macro_iter); \\\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
fprintf(f, " }\n\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
2009-02-02 19:57:57 +00:00
|
|
|
srna= ds->srna;
|
|
|
|
|
|
|
|
fprintf(f, "/**************** %s ****************/\n\n", srna->name);
|
|
|
|
|
|
|
|
while(srna) {
|
|
|
|
fprintf(f, "extern StructRNA RNA_%s;\n", srna->identifier);
|
|
|
|
srna= srna->base;
|
|
|
|
}
|
|
|
|
fprintf(f, "\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next)
|
|
|
|
rna_def_property_funcs_header(f, ds->srna, dp);
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
2009-02-03 10:14:29 +00:00
|
|
|
|
2009-03-14 23:17:55 +00:00
|
|
|
fprintf(f, "#ifdef __cplusplus\n}\n#endif\n\n");
|
|
|
|
|
|
|
|
fprintf(f, "#endif /* __RNA_BLENDER_H__ */\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *cpp_classes = ""
|
|
|
|
"\n"
|
|
|
|
"#include <string>\n"
|
|
|
|
"\n"
|
|
|
|
"namespace RNA {\n"
|
|
|
|
"\n"
|
|
|
|
"#define BOOLEAN_PROPERTY(sname, identifier) \\\n"
|
|
|
|
" bool sname::identifier(void) { return (bool)sname##_##identifier##_get(&ptr); }\n"
|
|
|
|
"\n"
|
|
|
|
"#define BOOLEAN_ARRAY_PROPERTY(sname, size, identifier) \\\n"
|
|
|
|
" Array<int,size> sname::identifier(void) \\\n"
|
|
|
|
" { Array<int, size> ar; sname##_##identifier##_get(&ptr, ar.data); return ar; }\n"
|
|
|
|
"\n"
|
|
|
|
"#define INT_PROPERTY(sname, identifier) \\\n"
|
|
|
|
" int sname::identifier(void) { return sname##_##identifier##_get(&ptr); }\n"
|
|
|
|
"\n"
|
|
|
|
"#define INT_ARRAY_PROPERTY(sname, size, identifier) \\\n"
|
|
|
|
" Array<int,size> sname::identifier(void) \\\n"
|
|
|
|
" { Array<int, size> ar; sname##_##identifier##_get(&ptr, ar.data); return ar; }\n"
|
|
|
|
"\n"
|
|
|
|
"#define FLOAT_PROPERTY(sname, identifier) \\\n"
|
|
|
|
" float sname::identifier(void) { return sname##_##identifier##_get(&ptr); }\n"
|
|
|
|
"\n"
|
|
|
|
"#define FLOAT_ARRAY_PROPERTY(sname, size, identifier) \\\n"
|
|
|
|
" Array<float,size> sname::identifier(void) \\\n"
|
|
|
|
" { Array<float, size> ar; sname##_##identifier##_get(&ptr, ar.data); return ar; }\n"
|
|
|
|
"\n"
|
|
|
|
"#define ENUM_PROPERTY(type, sname, identifier) \\\n"
|
|
|
|
" sname::type sname::identifier(void) { return (type)sname##_##identifier##_get(&ptr); }\n"
|
|
|
|
"\n"
|
|
|
|
"#define STRING_PROPERTY(sname, identifier) \\\n"
|
|
|
|
" std::string sname::identifier(void) { \\\n"
|
|
|
|
" int len= sname##_##identifier##_length(&ptr); \\\n"
|
|
|
|
" std::string str; str.resize(len); \\\n"
|
|
|
|
" sname##_##identifier##_get(&ptr, &str[0]); return str; } \\\n"
|
|
|
|
"\n"
|
|
|
|
"#define POINTER_PROPERTY(type, sname, identifier) \\\n"
|
|
|
|
" type sname::identifier(void) { return type(sname##_##identifier##_get(&ptr)); }\n"
|
|
|
|
"\n"
|
|
|
|
"#define COLLECTION_PROPERTY(type, sname, identifier) \\\n"
|
|
|
|
" typedef CollectionIterator<type, sname##_##identifier##_begin, \\\n"
|
|
|
|
" sname##_##identifier##_next, sname##_##identifier##_end> identifier##_iterator; \\\n"
|
|
|
|
" Collection<sname, type, sname##_##identifier##_begin, \\\n"
|
|
|
|
" sname##_##identifier##_next, sname##_##identifier##_end> identifier;\n"
|
|
|
|
"\n"
|
|
|
|
"class Pointer {\n"
|
|
|
|
"public:\n"
|
|
|
|
" Pointer(const PointerRNA& p) : ptr(p) { }\n"
|
|
|
|
" operator const PointerRNA&() { return ptr; }\n"
|
|
|
|
" bool is_a(StructRNA *type) { return RNA_struct_is_a(&ptr, type); }\n"
|
|
|
|
" operator void*() { return ptr.data; }\n"
|
|
|
|
" operator bool() { return ptr.data != NULL; }\n"
|
|
|
|
"\n"
|
|
|
|
" PointerRNA ptr;\n"
|
|
|
|
"};\n"
|
|
|
|
"\n"
|
|
|
|
"\n"
|
|
|
|
"template<typename T, int Tsize>\n"
|
|
|
|
"class Array {\n"
|
|
|
|
"public:\n"
|
|
|
|
" T data[Tsize];\n"
|
|
|
|
" operator T*() { return data; }\n"
|
|
|
|
"};\n"
|
|
|
|
"\n"
|
|
|
|
"typedef void (*TBeginFunc)(CollectionPropertyIterator *iter, PointerRNA *ptr);\n"
|
|
|
|
"typedef void (*TNextFunc)(CollectionPropertyIterator *iter);\n"
|
|
|
|
"typedef void (*TEndFunc)(CollectionPropertyIterator *iter);\n"
|
|
|
|
"\n"
|
|
|
|
"template<typename T, TBeginFunc Tbegin, TNextFunc Tnext, TEndFunc Tend>\n"
|
|
|
|
"class CollectionIterator {\n"
|
|
|
|
"public:\n"
|
|
|
|
" CollectionIterator() : t(iter.ptr), init(false) { iter.valid= false; }\n"
|
|
|
|
" ~CollectionIterator(void) { if(init) Tend(&iter); };\n"
|
|
|
|
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator=(const CollectionIterator<T, Tbegin, Tnext, Tend>& copy)\n"
|
|
|
|
" { if(init) Tend(&iter); iter= copy.iter; if(iter.internal) iter.internal= MEM_dupallocN(iter.internal); t= copy.t; init= copy.init; return *this; }\n"
|
|
|
|
"\n"
|
|
|
|
" operator bool(void)\n"
|
|
|
|
" { return iter.valid != 0; }\n"
|
|
|
|
" const CollectionIterator<T, Tbegin, Tnext, Tend>& operator++() { Tnext(&iter); t = T(iter.ptr); return *this; }\n"
|
|
|
|
" T& operator*(void) { return t; }\n"
|
|
|
|
" T* operator->(void) { return &t; }\n"
|
|
|
|
" bool operator==(const CollectionIterator<T, Tbegin, Tnext, Tend>& other) { return iter.valid == other.iter.valid; }\n"
|
|
|
|
" bool operator!=(const CollectionIterator<T, Tbegin, Tnext, Tend>& other) { return iter.valid != other.iter.valid; }\n"
|
|
|
|
"\n"
|
|
|
|
" void begin(const Pointer& ptr)\n"
|
|
|
|
" { if(init) Tend(&iter); Tbegin(&iter, (PointerRNA*)&ptr.ptr); t = T(iter.ptr); init = true; }\n"
|
|
|
|
"\n"
|
|
|
|
"private:\n"
|
|
|
|
" CollectionPropertyIterator iter;\n"
|
|
|
|
" T t;\n"
|
|
|
|
" bool init;\n"
|
|
|
|
"};\n"
|
|
|
|
"\n"
|
|
|
|
"template<typename Tp, typename T, TBeginFunc Tbegin, TNextFunc Tnext, TEndFunc Tend>\n"
|
|
|
|
"class Collection {\n"
|
|
|
|
"public:\n"
|
|
|
|
" Collection(const PointerRNA& p) : ptr(p) {}\n"
|
|
|
|
"\n"
|
|
|
|
" CollectionIterator<T, Tbegin, Tnext, Tend> begin()\n"
|
|
|
|
" { CollectionIterator<T, Tbegin, Tnext, Tend> iter; iter.begin(ptr); return iter; }\n"
|
|
|
|
" CollectionIterator<T, Tbegin, Tnext, Tend> end()\n"
|
|
|
|
" { return CollectionIterator<T, Tbegin, Tnext, Tend>(); } /* test */ \n"
|
|
|
|
"\n"
|
|
|
|
"private:\n"
|
|
|
|
" PointerRNA ptr;\n"
|
|
|
|
"};\n"
|
|
|
|
"\n";
|
|
|
|
|
|
|
|
static void rna_generate_header_cpp(BlenderRNA *brna, FILE *f)
|
|
|
|
{
|
|
|
|
StructDefRNA *ds;
|
|
|
|
PropertyDefRNA *dp;
|
|
|
|
StructRNA *srna;
|
|
|
|
|
|
|
|
fprintf(f, "\n#ifndef __RNA_BLENDER_CPP_H__\n");
|
|
|
|
fprintf(f, "#define __RNA_BLENDER_CPP_H__\n\n");
|
|
|
|
|
|
|
|
fprintf(f, "/* Automatically generated classes for the Data API.\n"
|
|
|
|
" Do not edit manually, changes will be overwritten. */\n\n");
|
|
|
|
|
|
|
|
fprintf(f, "#include \"RNA_blender.h\"\n");
|
|
|
|
fprintf(f, "#include \"RNA_types.h\"\n");
|
|
|
|
|
|
|
|
fprintf(f, cpp_classes);
|
|
|
|
|
|
|
|
fprintf(f, "/**************** Declarations ****************/\n\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
2009-03-14 23:17:55 +00:00
|
|
|
fprintf(f, "class %s;\n", ds->srna->identifier);
|
|
|
|
fprintf(f, "\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
2009-03-14 23:17:55 +00:00
|
|
|
srna= ds->srna;
|
|
|
|
|
|
|
|
fprintf(f, "/**************** %s ****************/\n\n", srna->name);
|
|
|
|
|
|
|
|
fprintf(f, "class %s : public %s {\n", srna->identifier, (srna->base)? srna->base->identifier: "Pointer");
|
|
|
|
fprintf(f, "public:\n");
|
|
|
|
fprintf(f, "\t%s(const PointerRNA& ptr) :\n\t\t%s(ptr)", srna->identifier, (srna->base)? srna->base->identifier: "Pointer");
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next)
|
2009-03-14 23:17:55 +00:00
|
|
|
if(!(dp->prop->flag & (PROP_IDPROPERTY|PROP_BUILTIN)))
|
|
|
|
if(dp->prop->type == PROP_COLLECTION)
|
|
|
|
fprintf(f, ",\n\t\t%s(ptr)", dp->prop->identifier);
|
|
|
|
fprintf(f, "\n\t\t{}\n\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next)
|
|
|
|
rna_def_property_funcs_header_cpp(f, ds->srna, dp);
|
2009-03-14 23:17:55 +00:00
|
|
|
fprintf(f, "};\n\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fprintf(f, "/**************** Implementation ****************/\n");
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
|
|
|
|
for(dp=ds->cont.properties.first; dp; dp=dp->next)
|
|
|
|
rna_def_property_funcs_impl_cpp(f, ds->srna, dp);
|
2009-03-14 23:17:55 +00:00
|
|
|
|
|
|
|
fprintf(f, "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(f, "}\n\n#endif /* __RNA_BLENDER_CPP_H__ */\n\n");
|
2009-02-02 19:57:57 +00:00
|
|
|
}
|
|
|
|
|
2009-01-08 13:57:29 +00:00
|
|
|
static void make_bad_file(char *file)
|
|
|
|
{
|
|
|
|
FILE *fp= fopen(file, "w");
|
|
|
|
fprintf(fp, "ERROR! Cannot make correct RNA file, STUPID!\n");
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
|
2009-01-15 16:18:32 +00:00
|
|
|
static int rna_preprocess(char *outfile)
|
2009-01-08 13:57:29 +00:00
|
|
|
{
|
|
|
|
BlenderRNA *brna;
|
|
|
|
StructDefRNA *ds;
|
|
|
|
FILE *file;
|
|
|
|
char deffile[4096];
|
2009-02-02 19:57:57 +00:00
|
|
|
int i, status;
|
2009-01-08 13:57:29 +00:00
|
|
|
|
|
|
|
/* define rna */
|
|
|
|
brna= RNA_create();
|
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-08 13:57:29 +00:00
|
|
|
for(i=0; PROCESS_ITEMS[i].filename; i++) {
|
|
|
|
if(PROCESS_ITEMS[i].define) {
|
2008-11-07 02:58:25 +00:00
|
|
|
PROCESS_ITEMS[i].define(brna);
|
2008-11-29 19:08:46 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
|
2009-01-08 13:57:29 +00:00
|
|
|
if(!ds->filename)
|
|
|
|
ds->filename= PROCESS_ITEMS[i].filename;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
rna_auto_types();
|
2009-03-14 23:17:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* create RNA_blender_cpp.h */
|
|
|
|
strcpy(deffile, outfile);
|
|
|
|
strcat(deffile, "RNA_blender_cpp.h");
|
|
|
|
|
2009-03-15 11:30:02 +00:00
|
|
|
status= (DefRNA.error != 0);
|
|
|
|
|
2009-03-14 23:17:55 +00:00
|
|
|
if(status) {
|
|
|
|
make_bad_file(deffile);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
file = fopen(deffile, "w");
|
|
|
|
|
|
|
|
if(!file) {
|
|
|
|
printf ("Unable to open file: %s\n", deffile);
|
|
|
|
status = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_generate_header_cpp(brna, file);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
status= (DefRNA.error != 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-08 14:56:43 +00:00
|
|
|
rna_sort(brna);
|
2008-11-14 14:34:19 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
/* create rna_gen_*.c files */
|
2009-01-08 13:57:29 +00:00
|
|
|
for(i=0; PROCESS_ITEMS[i].filename; i++) {
|
|
|
|
strcpy(deffile, outfile);
|
|
|
|
strcat(deffile, PROCESS_ITEMS[i].filename);
|
|
|
|
deffile[strlen(deffile)-2] = '\0';
|
|
|
|
strcat(deffile, "_gen.c");
|
|
|
|
|
|
|
|
if(status) {
|
|
|
|
make_bad_file(deffile);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
file = fopen(deffile, "w");
|
|
|
|
|
|
|
|
if(!file) {
|
|
|
|
printf ("Unable to open file: %s\n", deffile);
|
|
|
|
status = 1;
|
|
|
|
}
|
|
|
|
else {
|
2009-06-18 19:48:55 +00:00
|
|
|
rna_generate(brna, file, PROCESS_ITEMS[i].filename, PROCESS_ITEMS[i].api_filename);
|
2009-01-08 13:57:29 +00:00
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
status= (DefRNA.error != 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-02-02 19:57:57 +00:00
|
|
|
/* create RNA_blender.h */
|
|
|
|
strcpy(deffile, outfile);
|
|
|
|
strcat(deffile, "RNA_blender.h");
|
|
|
|
|
|
|
|
if(status) {
|
|
|
|
make_bad_file(deffile);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
file = fopen(deffile, "w");
|
|
|
|
|
|
|
|
if(!file) {
|
|
|
|
printf ("Unable to open file: %s\n", deffile);
|
|
|
|
status = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rna_generate_header(brna, file);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
status= (DefRNA.error != 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free RNA */
|
2008-10-31 23:50:02 +00:00
|
|
|
RNA_define_free(brna);
|
|
|
|
RNA_free(brna);
|
|
|
|
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
static void mem_error_cb(char *errorStr)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "%s", errorStr);
|
|
|
|
fflush(stderr);
|
|
|
|
}
|
|
|
|
|
2008-10-31 23:50:02 +00:00
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
Merge of trunk into blender 2.5:
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r12987:17416
Issues:
* GHOST/X11 had conflicting changes. Some code was added in 2.5, which was
later added in trunk also, but reverted partially, specifically revision
16683. I have left out this reversion in the 2.5 branch since I think it is
needed there.
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16683
* Scons had various conflicting changes, I decided to go with trunk version
for everything except priorities and some library renaming.
* In creator.c, there were various fixes and fixes for fixes related to the -w
-W and -p options. In 2.5 -w and -W is not coded yet, and -p is done
differently. Since this is changed so much, and I don't think those fixes
would be needed in 2.5, I've left them out.
* Also in creator.c: there was code for a python bugfix where the screen was not
initialized when running with -P. The code that initializes the screen there
I had to disable, that can't work in 2.5 anymore but left it commented as a
reminder.
Further I had to disable some new function calls. using src/ and python/, as
was done already in this branch, disabled function calls:
* bpath.c: error reporting
* BME_conversions.c: editmesh conversion functions.
* SHD_dynamic: disabled almost completely, there is no python/.
* KX_PythonInit.cpp and Ketsji/ build files: Mathutils is not there, disabled.
* text.c: clipboard copy call.
* object.c: OB_SUPPORT_MATERIAL.
* DerivedMesh.c and subsurf_ccg, stipple_quarttone.
Still to be done:
* Go over files and functions that were moved to a different location but could
still use changes that were done in trunk.
2008-11-12 21:16:53 +00:00
|
|
|
int totblock, return_status = 0;
|
2008-10-31 23:50:02 +00:00
|
|
|
|
2009-04-07 00:49:39 +00:00
|
|
|
if(argc<2) {
|
2009-01-15 16:18:32 +00:00
|
|
|
printf("Usage: %s outdirectory/\n", argv[0]);
|
2008-10-31 23:50:02 +00:00
|
|
|
return_status = 1;
|
|
|
|
}
|
|
|
|
else {
|
2009-01-08 13:57:29 +00:00
|
|
|
printf("Running makesrna, program versions %s\n", RNA_VERSION_DATE);
|
2009-01-15 16:18:32 +00:00
|
|
|
return_status= rna_preprocess(argv[1]);
|
2008-10-31 23:50:02 +00:00
|
|
|
}
|
|
|
|
|
Merge of trunk into blender 2.5:
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r12987:17416
Issues:
* GHOST/X11 had conflicting changes. Some code was added in 2.5, which was
later added in trunk also, but reverted partially, specifically revision
16683. I have left out this reversion in the 2.5 branch since I think it is
needed there.
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16683
* Scons had various conflicting changes, I decided to go with trunk version
for everything except priorities and some library renaming.
* In creator.c, there were various fixes and fixes for fixes related to the -w
-W and -p options. In 2.5 -w and -W is not coded yet, and -p is done
differently. Since this is changed so much, and I don't think those fixes
would be needed in 2.5, I've left them out.
* Also in creator.c: there was code for a python bugfix where the screen was not
initialized when running with -P. The code that initializes the screen there
I had to disable, that can't work in 2.5 anymore but left it commented as a
reminder.
Further I had to disable some new function calls. using src/ and python/, as
was done already in this branch, disabled function calls:
* bpath.c: error reporting
* BME_conversions.c: editmesh conversion functions.
* SHD_dynamic: disabled almost completely, there is no python/.
* KX_PythonInit.cpp and Ketsji/ build files: Mathutils is not there, disabled.
* text.c: clipboard copy call.
* object.c: OB_SUPPORT_MATERIAL.
* DerivedMesh.c and subsurf_ccg, stipple_quarttone.
Still to be done:
* Go over files and functions that were moved to a different location but could
still use changes that were done in trunk.
2008-11-12 21:16:53 +00:00
|
|
|
totblock= MEM_get_memory_blocks_in_use();
|
2008-10-31 23:50:02 +00:00
|
|
|
if(totblock!=0) {
|
|
|
|
printf("Error Totblock: %d\n",totblock);
|
2009-04-07 00:49:39 +00:00
|
|
|
MEM_set_error_callback(mem_error_cb);
|
2008-10-31 23:50:02 +00:00
|
|
|
MEM_printmemlist();
|
|
|
|
}
|
|
|
|
|
|
|
|
return return_status;
|
|
|
|
}
|
|
|
|
|
2008-12-01 21:23:58 +00:00
|
|
|
|