diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-07-27 22:50:10 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-07-27 22:50:10 +0400 |
commit | eb40d8ef0f49873a7f262af367decb7e652e7618 (patch) | |
tree | 0e705bf7f8b208360bf420629afb0c5193e32c48 /source/blender/render | |
parent | 324187b61a92c0c02c0e528a3f918ea73345a28e (diff) |
render api utility function to initialize a render layer from an image rather then loading through python.
lay = result.layers[0]
lay.rect_from_file("somefile.png", part.x, part.y)
If the source image is bigger then the render layer x/y offsets can be used to choose the part of the image use.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 3 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 42 |
2 files changed, 45 insertions, 0 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index d96054f5a76..2df3a0a4f8b 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -39,6 +39,7 @@ struct bNodeTree; struct Image; struct NodeBlurData; struct Object; +struct ReportList; struct RenderData; struct RenderEngine; struct RenderEngineType; @@ -265,6 +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); + 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); void RE_engine_end_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 3e50ea92846..4a84b1e78b6 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -45,6 +45,7 @@ #include "BKE_main.h" #include "BKE_node.h" #include "BKE_object.h" +#include "BKE_report.h" #include "BKE_scene.h" #include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */ #include "BKE_pointcache.h" @@ -2876,6 +2877,47 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info) re->i.statstr= NULL; } +/* 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) +{ + ImBuf *ibuf = IMB_loadiffname(filename, IB_rect); + + if(ibuf && (ibuf->rect || ibuf->rect_float)) { + if (ibuf->x == layer->rectx && ibuf->y == layer->recty) { + if(ibuf->rect_float==NULL) + IMB_float_from_rect(ibuf); + + 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)) { + ImBuf *ibuf_clip; + + if(ibuf->rect_float==NULL) + IMB_float_from_rect(ibuf); + + 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); + + memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty); + IMB_freeImBuf(ibuf_clip); + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to allocate clip buffer '%s'\n", filename); + } + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: incorrect dimensions for partial copy '%s'\n", filename); + } + } + + IMB_freeImBuf(ibuf); + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename); + } +} static void external_render_3d(Render *re, RenderEngineType *type) { RenderEngine engine; |