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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-09-15 04:15:24 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-09-15 04:15:24 +0400
commit41729976753523ee08a0afaf6a26b6caf3dee1d6 (patch)
treeba264fba22084f44eb50b952f375715f501acff9 /source/blender/render
parenta5f8298ea5d13d7707bc0cbf0722013276bab9d6 (diff)
parenta425790065fedb2ae49f1b79770945d8528790d9 (diff)
Merged changes in the trunk up to revision 50607.
Conflicts resolved: source/blender/blenloader/intern/readfile.c
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_engine.h9
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h5
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h2
-rw-r--r--source/blender/render/intern/include/initrender.h2
-rw-r--r--source/blender/render/intern/include/pixelshading.h6
-rw-r--r--source/blender/render/intern/include/render_result.h8
-rw-r--r--source/blender/render/intern/include/render_types.h1
-rw-r--r--source/blender/render/intern/include/sunsky.h4
-rw-r--r--source/blender/render/intern/include/volumetric.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c34
-rw-r--r--source/blender/render/intern/source/external_engine.c72
-rw-r--r--source/blender/render/intern/source/imagetexture.c2
-rw-r--r--source/blender/render/intern/source/initrender.c4
-rw-r--r--source/blender/render/intern/source/pipeline.c50
-rw-r--r--source/blender/render/intern/source/render_result.c200
-rw-r--r--source/blender/render/intern/source/render_texture.c6
-rw-r--r--source/blender/render/intern/source/texture_ocean.c1
17 files changed, 250 insertions, 159 deletions
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 5afdb2a29ce..2376aeca55e 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -86,9 +86,14 @@ typedef struct RenderEngine {
int flag;
struct Object *camera_override;
+ int tile_x;
+ int tile_y;
+
struct Render *re;
ListBase fullresult;
char *text;
+
+ int resolution_x, resolution_y;
} RenderEngine;
RenderEngine *RE_engine_create(RenderEngineType *type);
@@ -97,9 +102,9 @@ 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);
-struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
+struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername);
void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
-void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
+void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result, int cancel);
int RE_engine_test_break(RenderEngine *engine);
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info);
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 4695f2ba44f..1510d9adb10 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -92,6 +92,9 @@ typedef struct RenderLayer {
float *acolrect; /* 4 float, optional transparent buffer, needs storage for display updates */
float *scolrect; /* 4 float, optional strand buffer, needs storage for display updates */
int rectx, recty;
+
+ /* optional saved endresult on disk */
+ void *exrhandle;
ListBase passes;
@@ -124,7 +127,7 @@ typedef struct RenderResult {
volatile RenderLayer *renlay;
/* optional saved endresult on disk */
- void *exrhandle;
+ int do_exr_tile;
/* for render results in Image, verify validity for sequences */
int framenr;
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 604cd940fab..c07ed42332f 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -65,7 +65,7 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove);
struct Material *RE_init_sample_material(struct Material *orig_mat, struct Scene *scene);
void RE_free_sample_material(struct Material *mat);
void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3],
- int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob);
+ int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob);
#endif /* __RE_RENDER_EXT_H__ */
diff --git a/source/blender/render/intern/include/initrender.h b/source/blender/render/intern/include/initrender.h
index 7917fd66cfa..43ab9552194 100644
--- a/source/blender/render/intern/include/initrender.h
+++ b/source/blender/render/intern/include/initrender.h
@@ -40,7 +40,7 @@ struct Object;
void free_sample_tables(Render *re);
void make_sample_tables(Render *re);
-void initparts(Render *re);
+void initparts(Render *re, int do_crop);
void freeparts(Render *re);
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index 00d731912b6..30d574694b2 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -44,9 +44,9 @@
* \return pointer to the object
*/
int shadeHaloFloat(HaloRen *har,
- float *col, int zz,
- float dist, float xn,
- float yn, short flarec);
+ float *col, int zz,
+ float dist, float xn,
+ float yn, short flarec);
/**
* Render the sky at pixel (x, y).
diff --git a/source/blender/render/intern/include/render_result.h b/source/blender/render/intern/include/render_result.h
index 3d73ee1e912..303d4094f8e 100644
--- a/source/blender/render/intern/include/render_result.h
+++ b/source/blender/render/intern/include/render_result.h
@@ -37,6 +37,8 @@
#define RR_USE_MEM 0
#define RR_USE_EXR 1
+#define RR_ALL_LAYERS NULL
+
struct ImBuf;
struct ListBase;
struct Render;
@@ -49,7 +51,7 @@ struct rcti;
/* New */
struct RenderResult *render_result_new(struct Render *re,
- struct rcti *partrct, int crop, int savebuffers);
+ struct rcti *partrct, int crop, int savebuffers, const char *layername);
struct RenderResult *render_result_new_full_sample(struct Render *re,
struct ListBase *lb, struct rcti *partrct, int crop, int savebuffers);
@@ -76,9 +78,9 @@ void render_result_exr_file_end(struct Render *re);
void render_result_exr_file_merge(struct RenderResult *rr, struct RenderResult *rrpart);
-void render_result_exr_file_path(struct Scene *scene, int sample, char *filepath);
+void render_result_exr_file_path(struct Scene *scene, const char *layname, int sample, char *filepath);
int render_result_exr_file_read(struct Render *re, int sample);
-int render_result_exr_file_read_path(struct RenderResult *rr, const char *filepath);
+int render_result_exr_file_read_path(struct RenderResult *rr, struct RenderLayer *rl_single, const char *filepath);
/* Combined Pixel Rect */
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index c8c8eb1fc06..60f3ced5652 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -63,7 +63,6 @@ struct ReportList;
struct Main;
#define TABLEINITSIZE 1024
-#define LAMPINITSIZE 256
typedef struct SampleTables {
float centLut[16];
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
index 4bb7d99ba16..74e42109be5 100644
--- a/source/blender/render/intern/include/sunsky.h
+++ b/source/blender/render/intern/include/sunsky.h
@@ -27,9 +27,7 @@
#ifndef __SUNSKY_H__
#define __SUNSKY_H__
-#define SPECTRUM_MAX_COMPONENTS 100
-#define SPECTRUM_START 350.0
-#define SPECTRUM_END 800.0
+// #define SPECTRUM_MAX_COMPONENTS 100
typedef struct SunSky {
short effect_type, skyblendtype, sky_colorspace;
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
index 7f63bcbbecc..3805478fed0 100644
--- a/source/blender/render/intern/include/volumetric.h
+++ b/source/blender/render/intern/include/volumetric.h
@@ -41,9 +41,6 @@ void shade_volume_outside(ShadeInput *shi, ShadeResult *shr);
void shade_volume_inside(ShadeInput *shi, ShadeResult *shr);
void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct Isect *last_is);
-#define STEPSIZE_VIEW 0
-#define STEPSIZE_SHADE 1
-
#define VOL_IS_BACKFACE 1
#define VOL_IS_SAMEMATERIAL 2
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 03f00418af9..e0864533fed 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -247,32 +247,24 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
done++;
}
else {
- mul_m4_v3(re->viewmat, vec);
+ if (re)
+ mul_m4_v3(re->viewmat, vec);
/* in vec are global coordinates
* calculate distance to camera
* and using that, define the alpha
*/
-
- {
- float tx, ty, tz;
-
- tx = vec[0];
- ty = vec[1];
- tz = vec[2];
-
- alpha = sqrt(tx * tx + ty * ty + tz * tz);
-
- if (alpha >= clipend) alpha = 0.0;
- else if (alpha <= starmindist) alpha = 0.0;
- else if (alpha <= 2.0f * starmindist) {
- alpha = (alpha - starmindist) / starmindist;
- }
- else {
- alpha -= 2.0f * starmindist;
- alpha /= (clipend - 2.0f * starmindist);
- alpha = 1.0f - alpha;
- }
+ alpha = len_v3(vec);
+
+ if (alpha >= clipend) alpha = 0.0;
+ else if (alpha <= starmindist) alpha = 0.0;
+ else if (alpha <= 2.0f * starmindist) {
+ alpha = (alpha - starmindist) / starmindist;
+ }
+ else {
+ alpha -= 2.0f * starmindist;
+ alpha /= (clipend - 2.0f * starmindist);
+ alpha = 1.0f - alpha;
}
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 487271ea1f7..636b3205b23 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -55,6 +55,7 @@
#include "RE_engine.h"
#include "RE_pipeline.h"
+#include "initrender.h"
#include "render_types.h"
#include "render_result.h"
@@ -149,7 +150,7 @@ void RE_engine_free(RenderEngine *engine)
/* Render Results */
-RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h)
+RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername)
{
Render *re = engine->re;
RenderResult *result;
@@ -172,7 +173,9 @@ RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w,
disprect.ymin = y;
disprect.ymax = y + h;
- result = render_result_new(re, &disprect, 0, RR_USE_MEM);
+ result = render_result_new(re, &disprect, 0, RR_USE_MEM, layername);
+
+ /* todo: make this thread safe */
/* can be NULL if we CLAMP the width or height to 0 */
if (result) {
@@ -197,25 +200,43 @@ void RE_engine_update_result(RenderEngine *engine, RenderResult *result)
}
}
-void RE_engine_end_result(RenderEngine *engine, RenderResult *result)
+void RE_engine_end_result(RenderEngine *engine, RenderResult *result, int cancel)
{
Render *re = engine->re;
+ RenderPart *pa;
- if (!result)
+ if (!result) {
return;
+ }
/* merge. on break, don't merge in result for preview renders, looks nicer */
- if (!(re->test_break(re->tbh) && (re->r.scemode & R_PREVIEWBUTS)))
- render_result_merge(re->result, result);
+ if (!cancel) {
+ /* for exr tile render, detect tiles that are done */
+ for (pa = re->parts.first; pa; pa = pa->next) {
+ if (result->tilerect.xmin == pa->disprect.xmin &&
+ result->tilerect.ymin == pa->disprect.ymin &&
+ result->tilerect.xmax == pa->disprect.xmax &&
+ result->tilerect.ymax == pa->disprect.ymax)
+ {
+ pa->ready = 1;
+ }
+ }
- /* draw */
- if (!re->test_break(re->tbh)) {
- result->renlay = result->layers.first; /* weak, draws first layer always */
- re->display_draw(re->ddh, result, NULL);
+ if (re->result->do_exr_tile)
+ render_result_exr_file_merge(re->result, result);
+ else if (!(re->test_break(re->tbh) && (re->r.scemode & R_PREVIEWBUTS)))
+ render_result_merge(re->result, result);
+
+ /* draw */
+ if (!re->test_break(re->tbh)) {
+ result->renlay = result->layers.first; /* weak, draws first layer always */
+ re->display_draw(re->ddh, result, NULL);
+ }
}
/* free */
- render_result_free_list(&engine->fullresult, result);
+ BLI_remlink(&engine->fullresult, result);
+ render_result_free(result);
}
/* Cancel */
@@ -294,12 +315,16 @@ int RE_engine_render(Render *re, int do_all)
/* create render result */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
if (re->result == NULL || !(re->r.scemode & R_PREVIEWBUTS)) {
+ int savebuffers;
+
if (re->result)
render_result_free(re->result);
- re->result = render_result_new(re, &re->disprect, 0, 0);
+
+ savebuffers = (re->r.scemode & R_EXR_TILE_FILE) ? RR_USE_EXR : RR_USE_MEM;
+ re->result = render_result_new(re, &re->disprect, 0, savebuffers, RR_ALL_LAYERS);
}
BLI_rw_mutex_unlock(&re->resultmutex);
-
+
if (re->result == NULL)
return 1;
@@ -318,14 +343,35 @@ int RE_engine_render(Render *re, int do_all)
engine->flag |= RE_ENGINE_PREVIEW;
engine->camera_override = re->camera_override;
+ engine->resolution_x = re->winx;
+ engine->resolution_y = re->winy;
+
if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_PREVIEWBUTS)) == 0)
BKE_scene_update_for_newframe(re->main, re->scene, re->lay);
+ initparts(re, FALSE);
+ engine->tile_x = re->partx;
+ engine->tile_y = re->party;
+
+ if (re->result->do_exr_tile)
+ render_result_exr_file_begin(re);
+
if (type->update)
type->update(engine, re->main, re->scene);
+
if (type->render)
type->render(engine, re->scene);
+ if (re->result->do_exr_tile) {
+ BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
+ render_result_exr_file_end(re);
+ BLI_rw_mutex_unlock(&re->resultmutex);
+ }
+
+ engine->tile_x = 0;
+ engine->tile_y = 0;
+ freeparts(re);
+
render_result_free_list(&engine->fullresult, engine->fullresult.first);
RE_engine_free(engine);
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index e4fb87e8e4f..7f0484c8ee6 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -1054,6 +1054,8 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
if ((ibuf == NULL) || ((ibuf->rect == NULL) && (ibuf->rect_float == NULL))) return retval;
+ ima->flag |= IMA_USED_FOR_RENDER;
+
/* mipmap test */
image_mipmap_test(tex, ibuf);
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 7efdba77943..66f230a40f5 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -537,7 +537,7 @@ void freeparts(Render *re)
BLI_freelistN(&re->parts);
}
-void initparts(Render *re)
+void initparts(Render *re, int do_crop)
{
int nr, xd, yd, partx, party, xparts, yparts;
int xminb, xmaxb, yminb, ymaxb;
@@ -618,7 +618,7 @@ void initparts(Render *re)
RenderPart *pa = MEM_callocN(sizeof(RenderPart), "new part");
/* Non-box filters need 2 pixels extra to work */
- if ((re->r.filtertype || (re->r.mode & R_EDGE))) {
+ if (do_crop && (re->r.filtertype || (re->r.mode & R_EDGE))) {
pa->crop = 2;
disprect.xmin -= pa->crop;
disprect.ymin -= pa->crop;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 14c9df2da4e..720287510d0 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -56,7 +56,6 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h"
#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
#include "BLI_math.h"
@@ -198,14 +197,12 @@ float *RE_RenderLayerGetPass(RenderLayer *rl, int passtype)
RenderLayer *RE_GetRenderLayer(RenderResult *rr, const char *name)
{
- RenderLayer *rl;
-
- if (rr == NULL) return NULL;
-
- for (rl = rr->layers.first; rl; rl = rl->next)
- if (strncmp(rl->name, name, RE_MAXNAME) == 0)
- return rl;
- return NULL;
+ if (rr == NULL) {
+ return NULL;
+ }
+ else {
+ return BLI_findstring(&rr->layers, name, offsetof(RenderLayer, name));
+ }
}
RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty)
@@ -644,7 +641,7 @@ static void *do_part_thread(void *pa_v)
if (!R.sss_points && (R.r.scemode & R_FULL_SAMPLE))
pa->result = render_result_new_full_sample(&R, &pa->fullresult, &pa->disprect, pa->crop, RR_USE_MEM);
else
- pa->result = render_result_new(&R, &pa->disprect, pa->crop, RR_USE_MEM);
+ pa->result = render_result_new(&R, &pa->disprect, pa->crop, RR_USE_MEM, RR_ALL_LAYERS);
if (R.sss_points)
zbufshade_sss_tile(pa);
@@ -654,7 +651,7 @@ static void *do_part_thread(void *pa_v)
zbufshade_tile(pa);
/* merge too on break! */
- if (R.result->exrhandle) {
+ if (R.result->do_exr_tile) {
render_result_exr_file_merge(R.result, pa->result);
}
else if (render_display_draw_enabled(&R)) {
@@ -798,12 +795,12 @@ static void threaded_tile_processor(Render *re)
render_result_free(re->result);
if (re->sss_points && render_display_draw_enabled(re))
- re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
else if (re->r.scemode & R_FULL_SAMPLE)
re->result = render_result_new_full_sample(re, &re->fullresult, &re->disprect, 0, RR_USE_EXR);
else
re->result = render_result_new(re, &re->disprect, 0,
- (re->r.scemode & R_EXR_TILE_FILE) ? RR_USE_EXR : RR_USE_MEM);
+ (re->r.scemode & R_EXR_TILE_FILE) ? RR_USE_EXR : RR_USE_MEM, RR_ALL_LAYERS);
}
BLI_rw_mutex_unlock(&re->resultmutex);
@@ -813,9 +810,9 @@ static void threaded_tile_processor(Render *re)
/* warning; no return here without closing exr file */
- initparts(re);
+ initparts(re, TRUE);
- if (re->result->exrhandle)
+ if (re->result->do_exr_tile)
render_result_exr_file_begin(re);
BLI_init_threads(&threads, do_part_thread, re->r.threads);
@@ -895,7 +892,7 @@ static void threaded_tile_processor(Render *re)
}
- if (re->result->exrhandle) {
+ if (re->result->do_exr_tile) {
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_exr_file_end(re);
BLI_rw_mutex_unlock(&re->resultmutex);
@@ -1055,7 +1052,7 @@ static void do_render_blur_3d(Render *re)
int blur = re->r.mblur_samples;
/* create accumulation render result */
- rres = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ rres = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
/* do the blur steps */
while (blur--) {
@@ -1119,7 +1116,10 @@ static void merge_renderresult_fields(RenderResult *rr, RenderResult *rr1, Rende
/* passes are allocated in sync */
rpass1 = rl1->passes.first;
rpass2 = rl2->passes.first;
- for (rpass = rl->passes.first; rpass && rpass1 && rpass2; rpass = rpass->next, rpass1 = rpass1->next, rpass2 = rpass2->next) {
+ for (rpass = rl->passes.first;
+ rpass && rpass1 && rpass2;
+ rpass = rpass->next, rpass1 = rpass1->next, rpass2 = rpass2->next)
+ {
interleave_rect(rr, rpass->rect, rpass1->rect, rpass2->rect, rpass->channels);
}
}
@@ -1180,7 +1180,7 @@ static void do_render_fields_3d(Render *re)
re->disprect.ymax *= 2;
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
- re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
if (rr2) {
if (re->r.mode & R_ODDFIELD)
@@ -1243,7 +1243,7 @@ static void do_render_fields_blur_3d(Render *re)
re->rectx = re->winx;
re->recty = re->winy;
- rres = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ rres = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
render_result_merge(rres, re->result);
render_result_free(re->result);
@@ -1632,7 +1632,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_free(re->result);
- re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
BLI_rw_mutex_unlock(&re->resultmutex);
@@ -1770,7 +1770,7 @@ static void do_render_seq(Render *re)
if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
Editing *ed = re->scene->ed;
if (ed)
- BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, TRUE, TRUE);
+ BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, TRUE);
}
IMB_freeImBuf(ibuf);
}
@@ -1929,7 +1929,7 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
if (scene->r.scemode & (R_EXR_TILE_FILE | R_FULL_SAMPLE)) {
char str[FILE_MAX];
- render_result_exr_file_path(scene, 0, str);
+ render_result_exr_file_path(scene, "", 0, str);
if (BLI_file_is_writable(str) == 0) {
BKE_report(reports, RPT_ERROR, "Can not save render buffers, check the temp default path");
@@ -2013,7 +2013,7 @@ static void validate_render_settings(Render *re)
if (RE_engine_is_external(re)) {
/* not supported yet */
- re->r.scemode &= ~(R_EXR_TILE_FILE | R_FULL_SAMPLE);
+ re->r.scemode &= ~(R_FULL_SAMPLE);
re->r.mode &= ~(R_FIELDS | R_MBLUR);
}
}
@@ -2512,7 +2512,7 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char
void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename)
{
- if (!render_result_exr_file_read_path(result, filename)) {
+ if (!render_result_exr_file_read_path(result, NULL, filename)) {
BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
return;
}
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 83bbaa7edbe..fb1a7885390 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -30,6 +30,7 @@
*/
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include "MEM_guardedalloc.h"
@@ -38,7 +39,6 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
#include "BLI_fileops.h"
#include "BLI_listbase.h"
@@ -387,10 +387,10 @@ static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channel
rpass->recty = rl->recty;
BLI_strncpy(rpass->name, get_pass_name(rpass->passtype, -1), sizeof(rpass->name));
- if (rr->exrhandle) {
+ if (rl->exrhandle) {
int a;
for (a = 0; a < channels; a++)
- IMB_exr_add_channel(rr->exrhandle, rl->name, get_pass_name(passtype, a), 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, get_pass_name(passtype, a), 0, 0, NULL);
}
else {
float *rect;
@@ -416,7 +416,7 @@ static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channel
/* will read info from Render *re to define layers */
/* called in threads */
/* re->winx,winy is coordinate space of entire image, partrct the part within */
-RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuffers)
+RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuffers, const char *layername)
{
RenderResult *rr;
RenderLayer *rl;
@@ -438,17 +438,21 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
/* tilerect is relative coordinates within render disprect. do not subtract crop yet */
rr->tilerect.xmin = partrct->xmin - re->disprect.xmin;
- rr->tilerect.xmax = partrct->xmax - re->disprect.xmax;
+ rr->tilerect.xmax = partrct->xmax - re->disprect.xmin;
rr->tilerect.ymin = partrct->ymin - re->disprect.ymin;
- rr->tilerect.ymax = partrct->ymax - re->disprect.ymax;
+ rr->tilerect.ymax = partrct->ymax - re->disprect.ymin;
if (savebuffers) {
- rr->exrhandle = IMB_exr_get_handle();
+ rr->do_exr_tile = TRUE;
}
-
+
/* check renderdata for amount of layers */
for (nr = 0, srl = re->r.layers.first; srl; srl = srl->next, nr++) {
-
+
+ if (layername && layername[0])
+ if (strcmp(srl->name, layername) != 0)
+ continue;
+
if ((re->r.scemode & R_SINGLE_LAYER) && nr != re->r.actlay)
continue;
if (srl->layflag & SCE_LAY_DISABLE)
@@ -469,11 +473,13 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
rl->rectx = rectx;
rl->recty = recty;
- if (rr->exrhandle) {
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
+ if (rr->do_exr_tile) {
+ rl->exrhandle = IMB_exr_get_handle();
+
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
}
else
rl->rectf = MEM_mapallocN(rectx * recty * sizeof(float) * 4, "Combined rgba");
@@ -535,7 +541,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
}
/* sss, previewrender and envmap don't do layers, so we make a default one */
- if (rr->layers.first == NULL) {
+ if (rr->layers.first == NULL && !(layername && layername[0])) {
rl = MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
@@ -543,14 +549,17 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf
rl->recty = recty;
/* duplicate code... */
- if (rr->exrhandle) {
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
- IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
+ if (rr->do_exr_tile) {
+ rl->exrhandle = IMB_exr_get_handle();
+
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
+ IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
}
- else
+ else {
rl->rectf = MEM_mapallocN(rectx * recty * sizeof(float) * 4, "Combined rgba");
+ }
/* note, this has to be in sync with scene.c */
rl->lay = (1 << 20) - 1;
@@ -574,10 +583,10 @@ RenderResult *render_result_new_full_sample(Render *re, ListBase *lb, rcti *part
int a;
if (re->osa == 0)
- return render_result_new(re, partrct, crop, savebuffers);
+ return render_result_new(re, partrct, crop, savebuffers, RR_ALL_LAYERS);
for (a = 0; a < re->osa; a++) {
- RenderResult *rr = render_result_new(re, partrct, crop, savebuffers);
+ RenderResult *rr = render_result_new(re, partrct, crop, savebuffers, RR_ALL_LAYERS);
BLI_addtail(lb, rr);
rr->sample_nr = a;
}
@@ -686,15 +695,20 @@ void render_result_merge(RenderResult *rr, RenderResult *rrpart)
RenderLayer *rl, *rlp;
RenderPass *rpass, *rpassp;
- for (rl = rr->layers.first, rlp = rrpart->layers.first; rl && rlp; rl = rl->next, rlp = rlp->next) {
-
- /* combined */
- if (rl->rectf && rlp->rectf)
- do_merge_tile(rr, rrpart, rl->rectf, rlp->rectf, 4);
-
- /* passes are allocated in sync */
- for (rpass = rl->passes.first, rpassp = rlp->passes.first; rpass && rpassp; rpass = rpass->next, rpassp = rpassp->next) {
- do_merge_tile(rr, rrpart, rpass->rect, rpassp->rect, rpass->channels);
+ for (rl = rr->layers.first; rl; rl = rl->next) {
+ rlp = RE_GetRenderLayer(rrpart, rl->name);
+ if (rlp) {
+ /* combined */
+ if (rl->rectf && rlp->rectf)
+ do_merge_tile(rr, rrpart, rl->rectf, rlp->rectf, 4);
+
+ /* passes are allocated in sync */
+ for (rpass = rl->passes.first, rpassp = rlp->passes.first;
+ rpass && rpassp;
+ rpass = rpass->next, rpassp = rpassp->next)
+ {
+ do_merge_tile(rr, rrpart, rpass->rect, rpassp->rect, rpass->channels);
+ }
}
}
}
@@ -739,21 +753,24 @@ int RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *file
/* combined */
if (rl->rectf) {
int a, xstride = 4;
- for (a = 0; a < xstride; a++)
- IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(SCE_PASS_COMBINED, a),
+ for (a = 0; a < xstride; a++) {
+ IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(SCE_PASS_COMBINED, a),
xstride, xstride * rr->rectx, rl->rectf + a);
+ }
}
/* passes are allocated in sync */
for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
int a, xstride = rpass->channels;
for (a = 0; a < xstride; a++) {
- if (rpass->passtype)
- IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(rpass->passtype, a),
+ if (rpass->passtype) {
+ IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(rpass->passtype, a),
xstride, xstride * rr->rectx, rpass->rect + a);
- else
- IMB_exr_add_channel(exrhandle, rl->name, make_pass_name(rpass, a),
+ }
+ else {
+ IMB_exr_add_channel(exrhandle, rl->name, make_pass_name(rpass, a),
xstride, xstride * rr->rectx, rpass->rect + a);
+ }
}
}
}
@@ -811,8 +828,9 @@ void render_result_single_layer_end(Render *re)
/* reconstruct render result layers */
for (nr = 0, srl = re->scene->r.layers.first; srl; srl = srl->next, nr++) {
- if (nr == re->r.actlay)
+ if (nr == re->r.actlay) {
BLI_addtail(&re->result->layers, rl);
+ }
else {
rlpush = RE_GetRenderLayer(re->pushedresult, srl->name);
if (rlpush) {
@@ -831,14 +849,21 @@ void render_result_single_layer_end(Render *re)
static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart)
{
- RenderLayer *rlp;
+ RenderLayer *rlp, *rl;
RenderPass *rpassp;
int offs, partx, party;
BLI_lock_thread(LOCK_IMAGE);
for (rlp = rrpart->layers.first; rlp; rlp = rlp->next) {
-
+ rl = RE_GetRenderLayer(rr, rlp->name);
+
+ /* should never happen but prevents crash if it does */
+ BLI_assert(rl);
+ if (UNLIKELY(rl == NULL)) {
+ continue;
+ }
+
if (rrpart->crop) { /* filters add pixel extra */
offs = (rrpart->crop + rrpart->crop * rrpart->rectx);
}
@@ -849,24 +874,37 @@ static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart)
/* combined */
if (rlp->rectf) {
int a, xstride = 4;
- for (a = 0; a < xstride; a++)
- IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
+ for (a = 0; a < xstride; a++) {
+ IMB_exr_set_channel(rl->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
xstride, xstride * rrpart->rectx, rlp->rectf + a + xstride * offs);
+ }
}
/* passes are allocated in sync */
for (rpassp = rlp->passes.first; rpassp; rpassp = rpassp->next) {
int a, xstride = rpassp->channels;
- for (a = 0; a < xstride; a++)
- IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
+ for (a = 0; a < xstride; a++) {
+ IMB_exr_set_channel(rl->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
xstride, xstride * rrpart->rectx, rpassp->rect + a + xstride * offs);
+ }
}
}
party = rrpart->tilerect.ymin + rrpart->crop;
partx = rrpart->tilerect.xmin + rrpart->crop;
- IMB_exrtile_write_channels(rr->exrhandle, partx, party, 0);
+
+ for (rlp = rrpart->layers.first; rlp; rlp = rlp->next) {
+ rl = RE_GetRenderLayer(rr, rlp->name);
+
+ /* should never happen but prevents crash if it does */
+ BLI_assert(rl);
+ if (UNLIKELY(rl == NULL)) {
+ continue;
+ }
+
+ IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0);
+ }
BLI_unlock_thread(LOCK_IMAGE);
}
@@ -875,15 +913,18 @@ static void save_empty_result_tiles(Render *re)
{
RenderPart *pa;
RenderResult *rr;
+ RenderLayer *rl;
for (rr = re->result; rr; rr = rr->next) {
- IMB_exrtile_clear_channels(rr->exrhandle);
+ for (rl = rr->layers.first; rl; rl = rl->next) {
+ IMB_exrtile_clear_channels(rl->exrhandle);
- for (pa = re->parts.first; pa; pa = pa->next) {
- if (pa->ready == 0) {
- int party = pa->disprect.ymin - re->disprect.ymin + pa->crop;
- int partx = pa->disprect.xmin - re->disprect.xmin + pa->crop;
- IMB_exrtile_write_channels(rr->exrhandle, partx, party, 0);
+ for (pa = re->parts.first; pa; pa = pa->next) {
+ if (pa->ready == 0) {
+ int party = pa->disprect.ymin - re->disprect.ymin + pa->crop;
+ int partx = pa->disprect.xmin - re->disprect.xmin + pa->crop;
+ IMB_exrtile_write_channels(rl->exrhandle, partx, party, 0);
+ }
}
}
}
@@ -893,13 +934,15 @@ static void save_empty_result_tiles(Render *re)
void render_result_exr_file_begin(Render *re)
{
RenderResult *rr;
+ RenderLayer *rl;
char str[FILE_MAX];
-
+
for (rr = re->result; rr; rr = rr->next) {
- render_result_exr_file_path(re->scene, rr->sample_nr, str);
-
- printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
- IMB_exrtile_begin_write(rr->exrhandle, str, 0, rr->rectx, rr->recty, re->partx, re->party);
+ for (rl = rr->layers.first; rl; rl = rl->next) {
+ render_result_exr_file_path(re->scene, rl->name, rr->sample_nr, str);
+ printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
+ IMB_exrtile_begin_write(rl->exrhandle, str, 0, rr->rectx, rr->recty, re->partx, re->party);
+ }
}
}
@@ -907,12 +950,17 @@ void render_result_exr_file_begin(Render *re)
void render_result_exr_file_end(Render *re)
{
RenderResult *rr;
+ RenderLayer *rl;
save_empty_result_tiles(re);
for (rr = re->result; rr; rr = rr->next) {
- IMB_exr_close(rr->exrhandle);
- rr->exrhandle = NULL;
+ for (rl = rr->layers.first; rl; rl = rl->next) {
+ IMB_exr_close(rl->exrhandle);
+ rl->exrhandle = NULL;
+ }
+
+ rr->do_exr_tile = FALSE;
}
render_result_free_list(&re->fullresult, re->result);
@@ -929,17 +977,17 @@ void render_result_exr_file_merge(RenderResult *rr, RenderResult *rrpart)
}
/* path to temporary exr file */
-void render_result_exr_file_path(Scene *scene, int sample, char *filepath)
+void render_result_exr_file_path(Scene *scene, const char *layname, int sample, char *filepath)
{
- char di[FILE_MAX], name[FILE_MAXFILE + MAX_ID_NAME + 100], fi[FILE_MAXFILE];
+ char di[FILE_MAX], name[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100], fi[FILE_MAXFILE];
BLI_strncpy(di, G.main->name, FILE_MAX);
BLI_splitdirstring(di, fi);
if (sample == 0)
- BLI_snprintf(name, sizeof(name), "%s_%s.exr", fi, scene->id.name + 2);
+ BLI_snprintf(name, sizeof(name), "%s_%s_%s.exr", fi, scene->id.name + 2, layname);
else
- BLI_snprintf(name, sizeof(name), "%s_%s%d.exr", fi, scene->id.name + 2, sample);
+ BLI_snprintf(name, sizeof(name), "%s_%s_%s%d.exr", fi, scene->id.name + 2, layname, sample);
BLI_make_file_string("/", filepath, BLI_temporary_dir(), name);
}
@@ -947,29 +995,30 @@ void render_result_exr_file_path(Scene *scene, int sample, char *filepath)
/* only for temp buffer files, makes exact copy of render result */
int render_result_exr_file_read(Render *re, int sample)
{
+ RenderLayer *rl;
char str[FILE_MAX];
- int success;
+ int success = TRUE;
RE_FreeRenderResult(re->result);
- re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM);
+ re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS);
- render_result_exr_file_path(re->scene, sample, str);
- printf("read exr tmp file: %s\n", str);
+ for (rl = re->result->layers.first; rl; rl = rl->next) {
- if (render_result_exr_file_read_path(re->result, str)) {
- success = TRUE;
- }
- else {
- printf("cannot read: %s\n", str);
- success = FALSE;
+ render_result_exr_file_path(re->scene, rl->name, sample, str);
+ printf("read exr tmp file: %s\n", str);
+
+ if (!render_result_exr_file_read_path(re->result, rl, str)) {
+ printf("cannot read: %s\n", str);
+ success = FALSE;
+ }
}
return success;
}
/* called for reading temp files, and for external engines */
-int render_result_exr_file_read_path(RenderResult *rr, const char *filepath)
+int render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, const char *filepath)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -992,6 +1041,9 @@ int render_result_exr_file_read_path(RenderResult *rr, const char *filepath)
}
for (rl = rr->layers.first; rl; rl = rl->next) {
+ if (rl_single && rl_single != rl)
+ continue;
+
/* combined */
if (rl->rectf) {
int a, xstride = 4;
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index 14c178c10f9..cbe8cc81451 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -93,13 +93,9 @@ extern struct Render R;
static void init_render_texture(Render *re, Tex *tex)
{
- int cfra= re->scene->r.cfra;
-
- if (re) cfra= re->r.cfra;
-
/* imap test */
if (tex->ima && ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
- BKE_image_user_frame_calc(&tex->iuser, cfra, re?re->flag & R_SEC_FIELD:0);
+ BKE_image_user_frame_calc(&tex->iuser, re->r.cfra, re?re->flag & R_SEC_FIELD:0);
}
else if (tex->type==TEX_ENVMAP) {
diff --git a/source/blender/render/intern/source/texture_ocean.c b/source/blender/render/intern/source/texture_ocean.c
index b842cab1d29..8c9df496dd6 100644
--- a/source/blender/render/intern/source/texture_ocean.c
+++ b/source/blender/render/intern/source/texture_ocean.c
@@ -36,7 +36,6 @@
#include "BKE_modifier.h"
#include "BKE_ocean.h"
-#include "BKE_utildefines.h"
#include "render_types.h"
#include "RE_shader_ext.h"