diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-11-16 17:40:46 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-11-16 17:40:46 +0300 |
commit | 1e245cc58928ad40c9e665f3aede685a9485ea21 (patch) | |
tree | f64cfe137212f0bb93aeb6a545c14c49e6c9b338 /source/blender/render | |
parent | 2153c663be809eca6b30fa042c88751692175dc7 (diff) |
option to write images to a files on single frame renders, this isn't accessed by the UI at the moment, but could eventually be used for saving test-renders.
The main reason to have this is so renders can be scripted to write to a specific file without having to do annoying tricks like set a dummy start/end frame range, render an animation and work out the current frame image will be written to, then rename after rendering.
Also made some 'char *' args into 'const char *'
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 34 |
2 files changed, 28 insertions, 10 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 696e52700cb..e3f49025bbc 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -212,14 +212,14 @@ void RE_init_threadcount(Render *re); void RE_TileProcessor(struct Render *re); /* only RE_NewRender() needed, main Blender render calls */ -void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame); +void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still); void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports); /* main preview render call */ void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); -void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress); +void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress); struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty); /* do a full sample buffer compo */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0c2e1c8dcea..5cd0e09fdf4 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -120,6 +120,7 @@ Render R; /* ********* alloc and free ******** */ +static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override); static volatile int g_break= 0; static int thread_break(void *UNUSED(arg)) @@ -807,7 +808,7 @@ static char *make_pass_name(RenderPass *rpass, int chan) /* filename already made absolute */ /* called from within UI, saves both rendered result as a file-read result */ -void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress) +void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress) { RenderLayer *rl; RenderPass *rpass; @@ -2844,7 +2845,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc } /* general Blender frame render call */ -void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame) +void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still) { /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ G.rendering= 1; @@ -2855,12 +2856,26 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr MEM_reset_peak_memory(); do_render_all_options(re); } - + + if(write_still) { + if(BKE_imtype_is_movie(scene->r.imtype)) { + /* operator checks this but incase its called from elsewhere */ + printf("Error: cant write single images with a movie format!\n"); + } + else { + char name[FILE_MAX]; + BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE); + + /* reports only used for Movie */ + do_write_image_or_movie(re, scene, NULL, NULL, name); + } + } + /* UGLY WARNING */ G.rendering= 0; } -static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports) +static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override) { char name[FILE_MAX]; RenderResult rres; @@ -2884,7 +2899,10 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R printf("Append frame %d", scene->r.cfra); } else { - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION); + if(name_override) + BLI_strncpy(name, name_override, sizeof(name)); + else + BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); if(re->r.imtype==R_MULTILAYER) { if(re->result) { @@ -2974,7 +2992,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int do_render_all_options(re); if(re->test_break(re->tbh) == 0) { - if(!do_write_image_or_movie(re, scene, mh, reports)) + if(!do_write_image_or_movie(re, scene, mh, reports, NULL)) G.afbreek= 1; } } else { @@ -3011,7 +3029,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int /* Touch/NoOverwrite options are only valid for image's */ if(BKE_imtype_is_movie(scene->r.imtype) == 0) { if(scene->r.mode & (R_NO_OVERWRITE | R_TOUCH)) - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION); + BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE); if(scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) { printf("skipping existing frame \"%s\"\n", name); @@ -3029,7 +3047,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int if(re->test_break(re->tbh) == 0) { if(!G.afbreek) - if(!do_write_image_or_movie(re, scene, mh, reports)) + if(!do_write_image_or_movie(re, scene, mh, reports, NULL)) G.afbreek= 1; } else |