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/rna_render.c62
-rw-r--r--source/blender/render/extern/include/RE_engine.h5
-rw-r--r--source/blender/render/intern/source/external_engine.c32
3 files changed, 88 insertions, 11 deletions
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 9b53b477c52..8f928313840 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -48,12 +48,39 @@
#include "BKE_context.h"
#include "BKE_report.h"
-/* RenderEngine */
+/* RenderEngine Callbacks */
+
+void engine_tag_redraw(RenderEngine *engine)
+{
+ engine->flag |= RE_ENGINE_DO_DRAW;
+}
+
+void engine_tag_update(RenderEngine *engine)
+{
+ engine->flag |= RE_ENGINE_DO_UPDATE;
+}
+
+static void engine_update(RenderEngine *engine, Main *bmain, Scene *scene)
+{
+ extern FunctionRNA rna_RenderEngine_update_func;
+ PointerRNA ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ func= &rna_RenderEngine_update_func;
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "data", &bmain);
+ RNA_parameter_set_lookup(&list, "scene", &scene);
+ engine->type->ext.call(NULL, &ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
static void engine_render(RenderEngine *engine, struct Scene *scene)
{
extern FunctionRNA rna_RenderEngine_render_func;
-
PointerRNA ptr;
ParameterList list;
FunctionRNA *func;
@@ -87,7 +114,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
RenderEngineType *et, dummyet = {NULL};
RenderEngine dummyengine= {NULL};
PointerRNA dummyptr;
- int have_function[1];
+ int have_function[2];
/* setup dummy engine & engine type to store static properties in */
dummyengine.type= &dummyet;
@@ -122,13 +149,20 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
et->ext.free= free;
RNA_struct_blender_type_set(et->ext.srna, et);
- et->render= (have_function[0])? engine_render: NULL;
+ et->update= (have_function[0])? engine_update: NULL;
+ et->render= (have_function[1])? engine_render: NULL;
BLI_addtail(&R_engines, et);
return et->ext.srna;
}
+static void **rna_RenderEngine_instance(PointerRNA *ptr)
+{
+ RenderEngine *engine = ptr->data;
+ return &engine->py_instance;
+}
+
static StructRNA* rna_RenderEngine_refine(PointerRNA *ptr)
{
RenderEngine *engine= (RenderEngine*)ptr->data;
@@ -203,14 +237,28 @@ 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", NULL);
+ RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister", "rna_RenderEngine_instance");
+
+ /* final render callbacks */
+ func= RNA_def_function(srna, "update", NULL);
+ RNA_def_function_ui_description(func, "Export scene data for render");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_pointer(func, "data", "BlendData", "", "");
+ RNA_def_pointer(func, "scene", "Scene", "", "");
- /* render */
func= RNA_def_function(srna, "render", NULL);
RNA_def_function_ui_description(func, "Render scene into an image");
- RNA_def_function_flag(func, FUNC_REGISTER);
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
RNA_def_pointer(func, "scene", "Scene", "", "");
+ /* tag for redraw */
+ RNA_def_function(srna, "tag_redraw", "engine_tag_redraw");
+ RNA_def_function_ui_description(func, "Request redraw for viewport rendering");
+
+ /* tag for update */
+ RNA_def_function(srna, "tag_update", "engine_tag_update");
+ RNA_def_function_ui_description(func, "Request update call for viewport rendering");
+
func= RNA_def_function(srna, "begin_result", "RE_engine_begin_result");
prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "X", "", 0, INT_MAX);
RNA_def_property_flag(prop, PROP_REQUIRED);
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 344ef301f4c..b848dc26681 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -55,6 +55,8 @@ struct Scene;
/* RenderEngine.flag */
#define RE_ENGINE_ANIMATION 1
#define RE_ENGINE_PREVIEW 2
+#define RE_ENGINE_DO_DRAW 4
+#define RE_ENGINE_DO_UPDATE 8
extern ListBase R_engines;
@@ -66,6 +68,7 @@ typedef struct RenderEngineType {
char name[64];
int flag;
+ void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene);
void (*render)(struct RenderEngine *engine, struct Scene *scene);
/* RNA integration */
@@ -74,11 +77,13 @@ typedef struct RenderEngineType {
typedef struct RenderEngine {
RenderEngineType *type;
+ void *py_instance;
int flag;
struct Render *re;
ListBase fullresult;
+ char *text;
} RenderEngine;
RenderEngine *RE_engine_create(RenderEngineType *type);
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index a6214329d0e..9d48e257154 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -61,7 +61,7 @@
static RenderEngineType internal_render_type = {
NULL, NULL,
"BLENDER_RENDER", "Blender Render", RE_INTERNAL,
- NULL,
+ NULL, NULL,
{NULL, NULL, NULL}};
#ifdef WITH_GAMEENGINE
@@ -69,7 +69,7 @@ static RenderEngineType internal_render_type = {
static RenderEngineType internal_game_type = {
NULL, NULL,
"BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME,
- NULL,
+ NULL, NULL,
{NULL, NULL, NULL}};
#endif
@@ -125,6 +125,15 @@ RenderEngine *RE_engine_create(RenderEngineType *type)
void RE_engine_free(RenderEngine *engine)
{
+#ifdef WITH_PYTHON
+ if(engine->py_instance) {
+ BPY_DECREF(engine->py_instance);
+ }
+#endif
+
+ if(engine->text)
+ MEM_freeN(engine->text);
+
MEM_freeN(engine);
}
@@ -216,6 +225,19 @@ void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char
re->i.infostr= NULL;
re->i.statstr= NULL;
}
+
+ /* set engine text */
+ if(engine->text) {
+ MEM_freeN(engine->text);
+ engine->text= NULL;
+ }
+
+ if(stats && stats[0] && info && info[0])
+ engine->text= BLI_sprintfN("%s | %s", stats, info);
+ else if(info && info[0])
+ engine->text= BLI_strdup(info);
+ else if(stats && stats[0])
+ engine->text= BLI_strdup(stats);
}
void RE_engine_update_progress(RenderEngine *engine, float progress)
@@ -273,8 +295,10 @@ int RE_engine_render(Render *re, int do_all)
if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
scene_update_for_newframe(re->main, re->scene, re->lay);
- type->render(engine, re->scene);
-
+ if(type->update)
+ type->update(engine, re->main, re->scene);
+ if(type->render)
+ type->render(engine, re->scene);
free_render_result(&engine->fullresult, engine->fullresult.first);