Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/makesrna/intern/makesrna.c71
-rw-r--r--source/blender/makesrna/intern/rna_internal.h1
2 files changed, 68 insertions, 4 deletions
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 5eceb62f897..c66d938448e 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -1165,7 +1165,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
fprintf(f, "}\n\n");
- dfunc->call= funcname;
+ dfunc->gencall= funcname;
}
static void rna_auto_types()
@@ -1345,6 +1345,65 @@ static void rna_generate_function_prototypes(BlenderRNA *brna, StructRNA *srna,
fprintf(f, "\n");
}
+static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA *srna, FunctionDefRNA *dfunc, FILE *f)
+{
+ FunctionRNA *func;
+ PropertyDefRNA *dparm;
+ StructDefRNA *dsrna;
+
+ dsrna= rna_find_struct_def(srna);
+ func= dfunc->func;
+
+ for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
+ if(dparm->prop==func->ret) {
+ if(dparm->prop->arraylength)
+ fprintf(f, "XXX no array return types yet"); /* XXX not supported */
+ else if(dparm->prop->type == PROP_POINTER)
+ 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;
+ }
+ }
+
+ if(!dparm)
+ fprintf(f, "void ");
+
+ fprintf(f, "%s(", dfunc->call);
+
+ if(dsrna->dnaname) fprintf(f, "struct %s *_self", dsrna->dnaname);
+ else fprintf(f, "struct %s *_self", srna->identifier);
+
+ for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
+ if(dparm->prop==func->ret) ;
+ else 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);
+ else if(dparm->prop->type == PROP_POINTER)
+ fprintf(f, ", %s%s *%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
+ else
+ fprintf(f, ", %s%s %s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
+ }
+
+ 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) {
+ dfunc= rna_find_function_def(func);
+ if(dfunc->call)
+ rna_generate_static_parameter_prototypes(brna, srna, dfunc, f);
+ }
+
+ fprintf(f, "\n");
+}
+
static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, PropertyRNA *prop)
{
char *strnest= "", *errnest= "";
@@ -1580,7 +1639,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
rna_print_c_string(f, func->description); fprintf(f, ",\n");
dfunc= rna_find_function_def(func);
- if(dfunc->call) fprintf(f, "\t%s,\n", dfunc->call);
+ if(dfunc->gencall) fprintf(f, "\t%s,\n", dfunc->gencall);
else fprintf(f, "\tNULL,\n");
if(func->ret) fprintf(f, "\t(PropertyRNA*)&rna_%s_%s_%s\n", srna->identifier, func->identifier, func->ret->identifier);
@@ -1750,11 +1809,15 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename)
for(dp=ds->cont.properties.first; dp; dp=dp->next)
rna_def_property_funcs(f, ds->srna, dp);
- for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
- if(!filename || ds->filename == filename)
+ for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) {
+ if(!filename || ds->filename == filename) {
for(dfunc=ds->functions.first; dfunc; dfunc= dfunc->cont.next)
rna_def_function_funcs(f, ds, dfunc);
+ rna_generate_static_function_prototypes(brna, ds->srna, f);
+ }
+ }
+
for(ds=DefRNA.structs.first; ds; ds=ds->cont.next)
if(!filename || ds->filename == filename)
rna_generate_struct(brna, ds->srna, f);
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index d0aa60dc390..fbdde596a59 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -47,6 +47,7 @@ typedef struct FunctionDefRNA {
FunctionRNA *func;
const char *srna;
const char *call;
+ const char *gencall;
} FunctionDefRNA;
typedef struct PropertyDefRNA {