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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-08-17 02:53:15 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-08-17 02:53:15 +0400
commitd35a42d3e6de9666380db5ddc2b6ede60438beac (patch)
tree1ef90fe35ff86d2b576d41c7208ab2a8145d5112 /source/blender/render
parent594121016d498757f6d9195d32b001e6bc7501ad (diff)
2.5: Render Api
* Add RenderResult.load_from_file to load whole multilayer exr's at once. * Removed x/y offset from RenderLayer.load_from_file, better to encourage using offset in begin_result() to minimize memory usage. * Added WITH_OPENEXR in some screen/file/image module for scons/make, exr was not working in some places there.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h3
-rw-r--r--source/blender/render/intern/source/pipeline.c57
2 files changed, 40 insertions, 20 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 2df3a0a4f8b..bf02af6ac36 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -266,7 +266,8 @@ typedef struct RenderEngine {
ListBase fullresult;
} RenderEngine;
-void RE_layer_rect_from_file(RenderLayer *layer, struct ReportList *reports, char *filename, int x, int y);
+void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, char *filename);
+void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, char *filename);
struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index e38f2416ca8..a6b089c6029 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -868,33 +868,26 @@ static void renderresult_add_names(RenderResult *rr)
strcpy(rpass->name, get_pass_name(rpass->passtype, -1));
}
-
-/* only for temp buffer files, makes exact copy of render result */
-static void read_render_result(Render *re, int sample)
+/* called for reading temp files, and for external engines */
+static int read_render_result_from_file(char *filename, RenderResult *rr)
{
RenderLayer *rl;
RenderPass *rpass;
void *exrhandle= IMB_exr_get_handle();
int rectx, recty;
- char str[FILE_MAX];
-
- RE_FreeRenderResult(re->result);
- re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
- render_unique_exr_name(re, str, sample);
- if(IMB_exr_begin_read(exrhandle, str, &rectx, &recty)==0) {
+ if(IMB_exr_begin_read(exrhandle, filename, &rectx, &recty)==0) {
IMB_exr_close(exrhandle);
- printf("cannot read: %s\n", str);
- return;
+ return 0;
}
- printf("read exr tmp file: %s\n", str);
-
- if(re->result == NULL || rectx!=re->result->rectx || recty!=re->result->recty) {
+ if(rr == NULL || rectx!=rr->rectx || recty!=rr->recty) {
printf("error in reading render result\n");
+ IMB_exr_close(exrhandle);
+ return 0;
}
else {
- for(rl= re->result->layers.first; rl; rl= rl->next) {
+ for(rl= rr->layers.first; rl; rl= rl->next) {
/* combined */
if(rl->rectf) {
@@ -914,10 +907,27 @@ static void read_render_result(Render *re, int sample)
}
IMB_exr_read_channels(exrhandle);
- renderresult_add_names(re->result);
+ renderresult_add_names(rr);
}
IMB_exr_close(exrhandle);
+
+ return 1;
+}
+
+/* only for temp buffer files, makes exact copy of render result */
+static void read_render_result(Render *re, int sample)
+{
+ char str[FILE_MAX];
+
+ RE_FreeRenderResult(re->result);
+ re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
+
+ render_unique_exr_name(re, str, sample);
+ printf("read exr tmp file: %s\n", str);
+
+ if(!read_render_result_from_file(str, re->result))
+ printf("cannot read: %s\n", str);
}
/* *************************************************** */
@@ -2944,7 +2954,7 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
/* loads in image into a result, size must match
* x/y offsets are only used on a partial copy when dimensions dont match */
-void RE_layer_rect_from_file(RenderLayer *layer, ReportList *reports, char *filename, int x, int y)
+void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *filename)
{
ImBuf *ibuf = IMB_loadiffname(filename, IB_rect);
@@ -2955,7 +2965,7 @@ void RE_layer_rect_from_file(RenderLayer *layer, ReportList *reports, char *file
memcpy(layer->rectf, ibuf->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
} else {
- if ((ibuf->x - x >= layer->rectx) && (ibuf->y - y >= layer->recty)) {
+ if ((ibuf->x >= layer->rectx) && (ibuf->y >= layer->recty)) {
ImBuf *ibuf_clip;
if(ibuf->rect_float==NULL)
@@ -2963,7 +2973,7 @@ void RE_layer_rect_from_file(RenderLayer *layer, ReportList *reports, char *file
ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat, 0);
if(ibuf_clip) {
- IMB_rectcpy(ibuf_clip, ibuf, 0,0, x,y, layer->rectx, layer->recty);
+ IMB_rectcpy(ibuf_clip, ibuf, 0,0, 0,0, layer->rectx, layer->recty);
memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
IMB_freeImBuf(ibuf_clip);
@@ -2983,6 +2993,15 @@ void RE_layer_rect_from_file(RenderLayer *layer, ReportList *reports, char *file
BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
}
}
+
+void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *filename)
+{
+ if(!read_render_result_from_file(filename, result)) {
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
+ return;
+ }
+}
+
static void external_render_3d(Render *re, RenderEngineType *type)
{
RenderEngine engine;