diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-10-24 12:45:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-10-24 12:45:55 +0400 |
commit | 70bf00a74c1688e857e3ca1b143b4d7a57a30655 (patch) | |
tree | 8015eb2525a1aeca9c77fcbdf8fe222fff67948d /source/blender/render | |
parent | dbe2fe5043b99f8a5717bbe5b6a9e36a6519f8c7 (diff) | |
parent | f1cea89d99f0c80bdccd2ba1359142b5ff14cdb9 (diff) |
svn merge ^/trunk/blender -r41200:41226 .
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 15 | ||||
-rw-r--r-- | source/blender/render/SConscript | 10 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_engine.h | 15 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 131 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 2 |
5 files changed, 150 insertions, 23 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index e2222cad2ea..d5b3bd5e311 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -118,6 +118,17 @@ set(SRC intern/raytrace/vbvh.h ) +if(WITH_PYTHON) + add_definitions(-DWITH_PYTHON) + list(APPEND INC + ../python + ) + + list(APPEND INC_SYS + ${PYTHON_INCLUDE_DIRS} + ) +endif() + if(WITH_IMAGE_OPENEXR) add_definitions(-DWITH_OPENEXR) endif() @@ -136,6 +147,10 @@ if(WITH_CODEC_QUICKTIME) add_definitions(-DWITH_QUICKTIME) endif() +if(WITH_GAMEENGINE) + add_definitions(-DWITH_GAMEENGINE) +endif() + if(APPLE) if(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse") diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript index c5e21568220..99ff10d19eb 100644 --- a/source/blender/render/SConscript +++ b/source/blender/render/SConscript @@ -16,6 +16,13 @@ defs_raytrace = [] defs.append('WITH_SMOKE') # TODO, make optional +if env['WITH_BF_PYTHON']: + incs += ' ../python' + incs += ' ' + env['BF_PYTHON_INC'] + defs.append('WITH_PYTHON') + if env['BF_DEBUG']: + defs.append('DEBUG') + if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'): if env['WITH_BF_RAYOPTIMIZATION']: cflags_raytrace = env['CCFLAGS'] + env['BF_RAYOPTIMIZATION_SSE_FLAGS'] @@ -49,6 +56,9 @@ if env['WITH_BF_QUICKTIME']: if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_GAMEENGINE']: + defs.append('WITH_GAMEENGINE') + if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index 23b67854a83..8300582c173 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -48,10 +48,10 @@ struct Scene; /* External Engine */ -#define RE_INTERNAL 1 -#define RE_GAME 2 -#define RE_DO_PREVIEW 4 -#define RE_DO_ALL 8 +#define RE_INTERNAL 1 +#define RE_GAME 2 +#define RE_USE_PREVIEW 4 +#define RE_USE_POSTPROCESS 8 extern ListBase R_engines; @@ -71,10 +71,14 @@ typedef struct RenderEngineType { typedef struct RenderEngine { RenderEngineType *type; + struct Render *re; ListBase fullresult; } RenderEngine; +RenderEngine *RE_engine_create(RenderEngineType *type); +void RE_engine_free(RenderEngine *engine); + void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y); void RE_result_load_from_file(struct RenderResult *result, struct ReportList *reports, const char *filename); @@ -84,6 +88,7 @@ void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result); int RE_engine_test_break(RenderEngine *engine); void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info); +void RE_engine_update_progress(RenderEngine *engine, float progress); void RE_engine_report(RenderEngine *engine, int type, const char *msg); int RE_engine_render(struct Render *re, int do_all); @@ -93,5 +98,7 @@ int RE_engine_render(struct Render *re, int do_all); void RE_engines_init(void); void RE_engines_exit(void); +RenderEngineType *RE_engines_find(const char *idname); + #endif /* RE_ENGINE_H */ diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index b76a3e16513..9470101d455 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -47,13 +47,89 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" +#ifdef WITH_PYTHON +#include "BPY_extern.h" +#endif + #include "RE_engine.h" #include "RE_pipeline.h" #include "render_types.h" #include "renderpipeline.h" -/************************** External Engines ***************************/ +/* Render Engine Types */ + +static RenderEngineType internal_render_type = { + NULL, NULL, + "BLENDER_RENDER", "Blender Render", RE_INTERNAL, + NULL, + {NULL, NULL, NULL}}; + +#ifdef WITH_GAMEENGINE + +static RenderEngineType internal_game_type = { + NULL, NULL, + "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, + NULL, + {NULL, NULL, NULL}}; + +#endif + +ListBase R_engines = {NULL, NULL}; + +void RE_engines_init(void) +{ + BLI_addtail(&R_engines, &internal_render_type); +#ifdef WITH_GAMEENGINE + BLI_addtail(&R_engines, &internal_game_type); +#endif +} + +void RE_engines_exit(void) +{ + RenderEngineType *type, *next; + + for(type=R_engines.first; type; type=next) { + next= type->next; + + BLI_remlink(&R_engines, type); + + if(!(type->flag & RE_INTERNAL)) { + if(type->ext.free) + type->ext.free(type->ext.data); + + MEM_freeN(type); + } + } +} + +RenderEngineType *RE_engines_find(const char *idname) +{ + RenderEngineType *type; + + type= BLI_findstring(&R_engines, idname, offsetof(RenderEngineType, idname)); + if(!type) + type= &internal_render_type; + + return type; +} + +/* Create, Free */ + +RenderEngine *RE_engine_create(RenderEngineType *type) +{ + RenderEngine *engine = MEM_callocN(sizeof(RenderEngine), "RenderEngine"); + engine->type= type; + + return engine; +} + +void RE_engine_free(RenderEngine *engine) +{ + MEM_freeN(engine); +} + +/* Render Results */ RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h) { @@ -133,11 +209,24 @@ void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char { Render *re= engine->re; - re->i.statstr= stats; - re->i.infostr= info; - re->stats_draw(re->sdh, &re->i); - re->i.infostr= NULL; - re->i.statstr= NULL; + /* stats draw callback */ + if(re) { + re->i.statstr= stats; + re->i.infostr= info; + re->stats_draw(re->sdh, &re->i); + re->i.infostr= NULL; + re->i.statstr= NULL; + } +} + +void RE_engine_update_progress(RenderEngine *engine, float progress) +{ + Render *re= engine->re; + + if(re) { + CLAMP(progress, 0.0f, 1.0f); + re->progress(re->prh, progress); + } } void RE_engine_report(RenderEngine *engine, int type, const char *msg) @@ -149,16 +238,17 @@ void RE_engine_report(RenderEngine *engine, int type, const char *msg) int RE_engine_render(Render *re, int do_all) { - RenderEngineType *type= BLI_findstring(&R_engines, re->r.engine, offsetof(RenderEngineType, idname)); - RenderEngine engine; + RenderEngineType *type= RE_engines_find(re->r.engine); + RenderEngine *engine; - if(!(type && type->render)) + /* verify if we can render */ + if(!type->render) return 0; - if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW)) + if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_USE_PREVIEW)) return 0; - if(do_all && !(type->flag & RE_DO_ALL)) + if(do_all && !(type->flag & RE_USE_POSTPROCESS)) return 0; - if(!do_all && (type->flag & RE_DO_ALL)) + if(!do_all && (type->flag & RE_USE_POSTPROCESS)) return 0; /* create render result */ @@ -172,14 +262,19 @@ int RE_engine_render(Render *re, int do_all) if(re->result==NULL) return 1; - /* external */ - memset(&engine, 0, sizeof(engine)); - engine.type= type; - engine.re= re; + /* render */ + engine = RE_engine_create(type); + engine->re= re; + + 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); + - type->render(&engine, re->scene); + free_render_result(&engine->fullresult, engine->fullresult.first); - free_render_result(&engine.fullresult, engine.fullresult.first); + RE_engine_free(engine); return 1; } diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 8fa90a51442..0fc00731d60 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -1526,7 +1526,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr) do_tra= ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f && (shi->depth <= shi->mat->ray_depth_tra)); do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f && (shi->depth <= shi->mat->ray_depth)); - /* raytrace mirror amd refract like to separate the spec color */ + /* raytrace mirror and refract like to separate the spec color */ if(shi->combinedflag & SCE_PASS_SPEC) sub_v3_v3v3(diff, shr->combined, shr->spec); else |