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:
authorCampbell Barton <ideasman42@gmail.com>2011-10-24 12:45:55 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-10-24 12:45:55 +0400
commit70bf00a74c1688e857e3ca1b143b4d7a57a30655 (patch)
tree8015eb2525a1aeca9c77fcbdf8fe222fff67948d /source/blender/render
parentdbe2fe5043b99f8a5717bbe5b6a9e36a6519f8c7 (diff)
parentf1cea89d99f0c80bdccd2ba1359142b5ff14cdb9 (diff)
svn merge ^/trunk/blender -r41200:41226 .
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt15
-rw-r--r--source/blender/render/SConscript10
-rw-r--r--source/blender/render/extern/include/RE_engine.h15
-rw-r--r--source/blender/render/intern/source/external_engine.c131
-rw-r--r--source/blender/render/intern/source/rayshade.c2
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