RNA: make mechanism used by operators to keep python instance alive more generic, to be used by render engine later.
This commit is contained in:
parent
178ba76b09
commit
66f51ba5d1
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "DNA_listBase.h"
|
||||
#include "RNA_types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -40,6 +39,7 @@ extern "C" {
|
|||
|
||||
struct bContext;
|
||||
struct ID;
|
||||
struct ListBase;
|
||||
struct Main;
|
||||
struct ReportList;
|
||||
struct Scene;
|
||||
|
@ -611,6 +611,7 @@ int RNA_struct_is_a(StructRNA *type, StructRNA *srna);
|
|||
|
||||
StructRegisterFunc RNA_struct_register(StructRNA *type);
|
||||
StructUnregisterFunc RNA_struct_unregister(StructRNA *type);
|
||||
void **RNA_struct_instance(PointerRNA *ptr);
|
||||
|
||||
void *RNA_struct_py_type_get(StructRNA *srna);
|
||||
void RNA_struct_py_type_set(StructRNA *srna, void *py_type);
|
||||
|
|
|
@ -60,7 +60,7 @@ void RNA_def_struct_flag(StructRNA *srna, int flag);
|
|||
void RNA_def_struct_clear_flag(StructRNA *srna, int flag);
|
||||
void RNA_def_struct_refine_func(StructRNA *srna, const char *refine);
|
||||
void RNA_def_struct_idprops_func(StructRNA *srna, const char *refine);
|
||||
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg);
|
||||
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance);
|
||||
void RNA_def_struct_path_func(StructRNA *srna, const char *path);
|
||||
void RNA_def_struct_identifier(StructRNA *srna, const char *identifier);
|
||||
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description);
|
||||
|
|
|
@ -333,6 +333,7 @@ typedef void (*StructFreeFunc)(void *data);
|
|||
typedef struct StructRNA *(*StructRegisterFunc)(struct Main *bmain, struct ReportList *reports, void *data,
|
||||
const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
|
||||
typedef void (*StructUnregisterFunc)(struct Main *bmain, struct StructRNA *type);
|
||||
typedef void **(*StructInstanceFunc)(PointerRNA *ptr);
|
||||
|
||||
typedef struct StructRNA StructRNA;
|
||||
|
||||
|
|
|
@ -2337,6 +2337,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
|
|||
fprintf(f, "\t%s,\n", rna_function_string(srna->path));
|
||||
fprintf(f, "\t%s,\n", rna_function_string(srna->reg));
|
||||
fprintf(f, "\t%s,\n", rna_function_string(srna->unreg));
|
||||
fprintf(f, "\t%s,\n", rna_function_string(srna->instance));
|
||||
fprintf(f, "\t%s,\n", rna_function_string(srna->idproperties));
|
||||
|
||||
if(srna->reg && !srna->refine) {
|
||||
|
|
|
@ -384,7 +384,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
|
|||
RNA_def_struct_sdna(srna, "IDPropertyGroup");
|
||||
RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties");
|
||||
RNA_def_struct_idprops_func(srna, "rna_PropertyGroup_idprops");
|
||||
RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister", NULL);
|
||||
RNA_def_struct_refine_func(srna, "rna_PropertyGroup_refine");
|
||||
|
||||
/* important so python types can have their name used in list views
|
||||
|
|
|
@ -681,6 +681,18 @@ StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void **RNA_struct_instance(PointerRNA *ptr)
|
||||
{
|
||||
StructRNA *type= ptr->type;
|
||||
|
||||
do {
|
||||
if(type->instance)
|
||||
return type->instance(ptr);
|
||||
} while((type=type->base));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *RNA_struct_py_type_get(StructRNA *srna)
|
||||
{
|
||||
return srna->py_type;
|
||||
|
|
|
@ -509,7 +509,7 @@ static void rna_def_keyingset_info(BlenderRNA *brna)
|
|||
RNA_def_struct_sdna(srna, "KeyingSetInfo");
|
||||
RNA_def_struct_ui_text(srna, "Keying Set Info", "Callback function defines for builtin Keying Sets");
|
||||
RNA_def_struct_refine_func(srna, "rna_KeyingSetInfo_refine");
|
||||
RNA_def_struct_register_funcs(srna, "rna_KeyingSetInfo_register", "rna_KeyingSetInfo_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_KeyingSetInfo_register", "rna_KeyingSetInfo_unregister", NULL);
|
||||
|
||||
/* Properties --------------------- */
|
||||
|
||||
|
|
|
@ -813,7 +813,7 @@ void RNA_def_struct_idprops_func(StructRNA *srna, const char *idproperties)
|
|||
if(idproperties) srna->idproperties= (IDPropertiesFunc)idproperties;
|
||||
}
|
||||
|
||||
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg)
|
||||
void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance)
|
||||
{
|
||||
if(!DefRNA.preprocess) {
|
||||
fprintf(stderr, "RNA_def_struct_register_funcs: only during preprocessing.\n");
|
||||
|
@ -822,6 +822,7 @@ void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char
|
|||
|
||||
if(reg) srna->reg= (StructRegisterFunc)reg;
|
||||
if(unreg) srna->unreg= (StructUnregisterFunc)unreg;
|
||||
if(instance) srna->instance= (StructInstanceFunc)instance;
|
||||
}
|
||||
|
||||
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
|
||||
|
|
|
@ -330,6 +330,7 @@ struct StructRNA {
|
|||
/* function to register/unregister subclasses */
|
||||
StructRegisterFunc reg;
|
||||
StructUnregisterFunc unreg;
|
||||
StructInstanceFunc instance;
|
||||
|
||||
/* callback to get id properties */
|
||||
IDPropertiesFunc idproperties;
|
||||
|
|
|
@ -233,7 +233,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
|
|||
RNA_def_struct_sdna(srna, "RenderEngine");
|
||||
RNA_def_struct_ui_text(srna, "Render Engine", "Render engine");
|
||||
RNA_def_struct_refine_func(srna, "rna_RenderEngine_refine");
|
||||
RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister", NULL);
|
||||
|
||||
/* render */
|
||||
func= RNA_def_function(srna, "render", NULL);
|
||||
|
|
|
@ -611,7 +611,7 @@ static void rna_def_panel(BlenderRNA *brna)
|
|||
RNA_def_struct_ui_text(srna, "Panel", "Panel containing UI elements");
|
||||
RNA_def_struct_sdna(srna, "Panel");
|
||||
RNA_def_struct_refine_func(srna, "rna_Panel_refine");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister", NULL);
|
||||
|
||||
/* poll */
|
||||
func= RNA_def_function(srna, "poll", NULL);
|
||||
|
@ -688,7 +688,7 @@ static void rna_def_header(BlenderRNA *brna)
|
|||
RNA_def_struct_ui_text(srna, "Header", "Editor header containing UI elements.");
|
||||
RNA_def_struct_sdna(srna, "Header");
|
||||
RNA_def_struct_refine_func(srna, "rna_Header_refine");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister", NULL);
|
||||
|
||||
/* draw */
|
||||
func= RNA_def_function(srna, "draw", NULL);
|
||||
|
@ -730,7 +730,7 @@ static void rna_def_menu(BlenderRNA *brna)
|
|||
RNA_def_struct_ui_text(srna, "Menu", "Editor menu containing buttons");
|
||||
RNA_def_struct_sdna(srna, "Menu");
|
||||
RNA_def_struct_refine_func(srna, "rna_Menu_refine");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister", NULL);
|
||||
|
||||
/* poll */
|
||||
func= RNA_def_function(srna, "poll", NULL);
|
||||
|
|
|
@ -961,6 +961,11 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
|
|||
return dummyot.ext.srna;
|
||||
}
|
||||
|
||||
void **rna_Operator_instance(PointerRNA *ptr)
|
||||
{
|
||||
wmOperator *op = ptr->data;
|
||||
return &op->py_instance;
|
||||
}
|
||||
|
||||
static StructRNA *rna_MacroOperator_register(Main *bmain, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
|
||||
{
|
||||
|
@ -1160,7 +1165,7 @@ static void rna_def_operator(BlenderRNA *brna)
|
|||
RNA_def_struct_sdna(srna, "wmOperator");
|
||||
RNA_def_struct_refine_func(srna, "rna_Operator_refine");
|
||||
#ifdef WITH_PYTHON
|
||||
RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister", "rna_Operator_instance");
|
||||
#endif
|
||||
|
||||
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
||||
|
@ -1229,7 +1234,7 @@ static void rna_def_macro_operator(BlenderRNA *brna)
|
|||
RNA_def_struct_sdna(srna, "wmOperator");
|
||||
RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
|
||||
#ifdef WITH_PYTHON
|
||||
RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister");
|
||||
RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister", "rna_Operator_instance");
|
||||
#endif
|
||||
|
||||
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
|
||||
|
|
|
@ -6040,17 +6040,18 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
|||
bpy_context_set(C, &gilstate);
|
||||
|
||||
if (!is_static) {
|
||||
/* exception, operators store their PyObjects for re-use */
|
||||
/* some datatypes (operator, render engine) can store PyObjects for re-use */
|
||||
if(ptr->data) {
|
||||
if(RNA_struct_is_a(ptr->type, &RNA_Operator)) {
|
||||
wmOperator *op= ptr->data;
|
||||
if(op->py_instance) {
|
||||
py_class_instance= op->py_instance;
|
||||
void **instance = RNA_struct_instance(ptr);
|
||||
|
||||
if(instance) {
|
||||
if(*instance) {
|
||||
py_class_instance= *instance;
|
||||
Py_INCREF(py_class_instance);
|
||||
}
|
||||
else {
|
||||
/* store the instance here once its created */
|
||||
py_class_instance_store= &op->py_instance;
|
||||
py_class_instance_store= instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue