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:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/RE_pipeline.h3
-rw-r--r--source/blender/render/intern/engine.c11
-rw-r--r--source/blender/render/intern/pipeline.c4
-rw-r--r--source/blender/render/intern/render_result.c100
-rw-r--r--source/blender/render/intern/render_result.h3
-rw-r--r--source/blender/render/intern/texture_image.c12
6 files changed, 78 insertions, 55 deletions
diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h
index 3237772dd80..0d2d93ae026 100644
--- a/source/blender/render/RE_pipeline.h
+++ b/source/blender/render/RE_pipeline.h
@@ -233,7 +233,8 @@ void RE_create_render_pass(struct RenderResult *rr,
int channels,
const char *chan_id,
const char *layername,
- const char *viewname);
+ const char *viewname,
+ const bool allocate);
/* obligatory initialize call, disprect is optional */
void RE_InitState(struct Render *re,
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 389b821ca35..790c46dad0f 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -207,11 +207,10 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
/* Add render passes. */
RenderPass *result_pass = render_layer_add_pass(
- rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
- RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
- RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
-
- render_result_passes_allocated_ensure(rr);
+ rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
+ RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA", true);
+ RenderPass *differential_pass = render_layer_add_pass(
+ rr, rl, 4, "BakeDifferential", "", "RGBA", true);
/* Fill render passes from bake pixel array, to be read by the render engine. */
for (int ty = 0; ty < h; ty++) {
@@ -414,7 +413,7 @@ void RE_engine_add_pass(RenderEngine *engine,
return;
}
- RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL);
+ RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL, false);
}
void RE_engine_end_result(
diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c
index 72ff920561d..7c5259a1c5c 100644
--- a/source/blender/render/intern/pipeline.c
+++ b/source/blender/render/intern/pipeline.c
@@ -1015,10 +1015,10 @@ static void render_result_uncrop(Render *re)
render_result_disprect_to_full_resolution(re);
rres = render_result_new(re, &re->disprect, RR_ALL_LAYERS, RR_ALL_VIEWS);
- render_result_passes_allocated_ensure(rres);
rres->stamp_data = BKE_stamp_data_copy(re->result->stamp_data);
render_result_clone_passes(re, rres, NULL);
+ render_result_passes_allocated_ensure(rres);
render_result_merge(rres, re->result);
render_result_free(re->result);
@@ -2817,7 +2817,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha
BLI_freelinkN(&rl->passes, rp);
}
/* create a totally new pass */
- return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA");
+ return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA", true);
}
bool RE_allow_render_generic_object(Object *ob)
diff --git a/source/blender/render/intern/render_result.c b/source/blender/render/intern/render_result.c
index c308147fc5b..0681bcd9aa5 100644
--- a/source/blender/render/intern/render_result.c
+++ b/source/blender/render/intern/render_result.c
@@ -213,12 +213,37 @@ static void set_pass_full_name(
/********************************** New **************************************/
+static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
+{
+ if (rp->rect != NULL) {
+ return;
+ }
+
+ const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
+ rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
+
+ if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
+ /* initialize to max speed */
+ float *rect = rp->rect;
+ for (int x = rectsize - 1; x >= 0; x--) {
+ rect[x] = PASS_VECTOR_MAX;
+ }
+ }
+ else if (STREQ(rp->name, RE_PASSNAME_Z)) {
+ float *rect = rp->rect;
+ for (int x = rectsize - 1; x >= 0; x--) {
+ rect[x] = 10e10;
+ }
+ }
+}
+
RenderPass *render_layer_add_pass(RenderResult *rr,
RenderLayer *rl,
int channels,
const char *name,
const char *viewname,
- const char *chan_id)
+ const char *chan_id,
+ const bool allocate)
{
const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name));
RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name);
@@ -250,8 +275,13 @@ RenderPass *render_layer_add_pass(RenderResult *rr,
BLI_addtail(&rl->passes, rpass);
- /* The result contains non-allocated pass now, so tag it as such. */
- rr->passes_allocated = false;
+ if (allocate) {
+ render_layer_allocate_pass(rr, rpass);
+ }
+ else {
+ /* The result contains non-allocated pass now, so tag it as such. */
+ rr->passes_allocated = false;
+ }
return rpass;
}
@@ -323,14 +353,14 @@ RenderResult *render_result_new(Render *re,
#define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \
do { \
- if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id) == NULL) { \
+ if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id, false) == NULL) { \
render_result_free(rr); \
return NULL; \
} \
} while (false)
/* A renderlayer should always have a Combined pass. */
- render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA");
+ render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA", false);
if (view_layer->passflag & SCE_PASS_Z) {
RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z");
@@ -427,7 +457,7 @@ RenderResult *render_result_new(Render *re,
}
/* a renderlayer should always have a Combined pass */
- render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA");
+ render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA", false);
}
/* NOTE: this has to be in sync with `scene.c`. */
@@ -453,26 +483,7 @@ void render_result_passes_allocated_ensure(RenderResult *rr)
continue;
}
- if (rp->rect != NULL) {
- continue;
- }
-
- const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
- rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
-
- if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
- /* initialize to max speed */
- float *rect = rp->rect;
- for (int x = rectsize - 1; x >= 0; x--) {
- rect[x] = PASS_VECTOR_MAX;
- }
- }
- else if (STREQ(rp->name, RE_PASSNAME_Z)) {
- float *rect = rp->rect;
- for (int x = rectsize - 1; x >= 0; x--) {
- rect[x] = 10e10;
- }
- }
+ render_layer_allocate_pass(rr, rp);
}
}
@@ -501,7 +512,7 @@ void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewna
&rl->passes, main_rp->fullname, offsetof(RenderPass, fullname));
if (!rp) {
render_layer_add_pass(
- rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id);
+ rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id, false);
}
}
}
@@ -512,7 +523,8 @@ void RE_create_render_pass(RenderResult *rr,
int channels,
const char *chan_id,
const char *layername,
- const char *viewname)
+ const char *viewname,
+ const bool allocate)
{
RenderLayer *rl;
RenderPass *rp;
@@ -542,7 +554,7 @@ void RE_create_render_pass(RenderResult *rr,
}
if (!rp) {
- render_layer_add_pass(rr, rl, channels, name, view, chan_id);
+ render_layer_add_pass(rr, rl, channels, name, view, chan_id, allocate);
}
}
}
@@ -1083,7 +1095,7 @@ int render_result_exr_file_read_path(RenderResult *rr,
void *exrhandle = IMB_exr_get_handle();
int rectx, recty;
- if (IMB_exr_begin_read(exrhandle, filepath, &rectx, &recty) == 0) {
+ if (!IMB_exr_begin_read(exrhandle, filepath, &rectx, &recty, false)) {
printf("failed being read %s\n", filepath);
IMB_exr_close(exrhandle);
return 0;
@@ -1175,20 +1187,32 @@ void render_result_exr_file_cache_write(Render *re)
/* For cache, makes exact copy of render result */
bool render_result_exr_file_cache_read(Render *re)
{
- char str[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100] = "";
+ /* File path to cache. */
+ char filepath[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100] = "";
char *root = U.render_cachedir;
+ render_result_exr_file_cache_path(re->scene, root, filepath);
- RE_FreeRenderResult(re->result);
- re->result = render_result_new(re, &re->disprect, RR_ALL_LAYERS, RR_ALL_VIEWS);
+ printf("read exr cache file: %s\n", filepath);
- /* First try cache. */
- render_result_exr_file_cache_path(re->scene, root, str);
+ /* Try opening the file. */
+ void *exrhandle = IMB_exr_get_handle();
+ int rectx, recty;
- printf("read exr cache file: %s\n", str);
- if (!render_result_exr_file_read_path(re->result, NULL, str)) {
- printf("cannot read: %s\n", str);
+ if (!IMB_exr_begin_read(exrhandle, filepath, &rectx, &recty, true)) {
+ printf("cannot read: %s\n", filepath);
+ IMB_exr_close(exrhandle);
return false;
}
+
+ /* Read file contents into render result. */
+ const char *colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR);
+ RE_FreeRenderResult(re->result);
+
+ IMB_exr_read_channels(exrhandle);
+ re->result = render_result_new_from_exr(exrhandle, colorspace, false, rectx, recty);
+
+ IMB_exr_close(exrhandle);
+
return true;
}
diff --git a/source/blender/render/intern/render_result.h b/source/blender/render/intern/render_result.h
index 4145bb3b8ab..34b8143869c 100644
--- a/source/blender/render/intern/render_result.h
+++ b/source/blender/render/intern/render_result.h
@@ -83,7 +83,8 @@ struct RenderPass *render_layer_add_pass(struct RenderResult *rr,
int channels,
const char *name,
const char *viewname,
- const char *chan_id);
+ const char *chan_id,
+ const bool allocate);
int render_result_exr_file_read_path(struct RenderResult *rr,
struct RenderLayer *rl_single,
diff --git a/source/blender/render/intern/texture_image.c b/source/blender/render/intern/texture_image.c
index 62aee564626..edfa284242c 100644
--- a/source/blender/render/intern/texture_image.c
+++ b/source/blender/render/intern/texture_image.c
@@ -1958,13 +1958,11 @@ int imagewraposa(Tex *tex,
}
if (texres->nor && (tex->imaflag & TEX_NORMALMAP)) {
- /* qdn: normal from color
- * The invert of the red channel is to make
- * the normal map compliant with the outside world.
- * It needs to be done because in Blender
- * the normal used in the renderer points inward. It is generated
- * this way in calc_vertexnormals(). Should this ever change
- * this negate must be removed. */
+ /* Normal from color:
+ * The invert of the red channel is to make the normal map compliant with the outside world.
+ * It needs to be done because in Blender the normal used in the renderer points inward.
+ * It is generated this way in #calc_vertexnormals().
+ * Should this ever change this negate must be removed. */
texres->nor[0] = -2.0f * (texres->tr - 0.5f);
texres->nor[1] = 2.0f * (texres->tg - 0.5f);
texres->nor[2] = 2.0f * (texres->tb - 0.5f);