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/intern/source/pipeline.c')
-rw-r--r--source/blender/render/intern/source/pipeline.c78
1 files changed, 54 insertions, 24 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index b1b88fc9fd5..85cafa07759 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -244,6 +244,7 @@ Render *RE_GetRender(const char *name)
return re;
}
+
/* if you want to know exactly what has been done */
RenderResult *RE_AcquireResultRead(Render *re)
{
@@ -387,6 +388,9 @@ void RE_InitRenderCB(Render *re)
/* only call this while you know it will remove the link too */
void RE_FreeRender(Render *re)
{
+ if (re->engine)
+ RE_engine_free(re->engine);
+
BLI_rw_mutex_end(&re->resultmutex);
free_renderdata_tables(re);
@@ -421,6 +425,19 @@ void RE_FreeAllRenderResults(void)
}
}
+void RE_FreePersistentData(void)
+{
+ Render *re;
+
+ /* render engines can be kept around for quick re-render, this clears all */
+ for (re = RenderGlobal.renderlist.first; re; re = re->next) {
+ if (re->engine) {
+ RE_engine_free(re->engine);
+ re->engine = NULL;
+ }
+ }
+}
+
/* ********* initialize state ******** */
@@ -499,13 +516,15 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer *
}
/* always call, checks for gamma, gamma tables and jitter too */
- make_sample_tables(re);
+ make_sample_tables(re);
/* if preview render, we try to keep old result */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
if (re->r.scemode & R_PREVIEWBUTS) {
- if (re->result && re->result->rectx == re->rectx && re->result->recty == re->recty) ;
+ if (re->result && re->result->rectx == re->rectx && re->result->recty == re->recty) {
+ /* pass */
+ }
else {
render_result_free(re->result);
re->result = NULL;
@@ -654,8 +673,12 @@ static void *do_part_thread(void *pa_v)
}
else if (render_display_draw_enabled(&R)) {
/* on break, don't merge in result for preview renders, looks nicer */
- if (R.test_break(R.tbh) && (R.r.scemode & R_PREVIEWBUTS)) ;
- else render_result_merge(R.result, pa->result);
+ if (R.test_break(R.tbh) && (R.r.scemode & R_PREVIEWBUTS)) {
+ /* pass */
+ }
+ else {
+ render_result_merge(R.result, pa->result);
+ }
}
}
@@ -671,6 +694,7 @@ float panorama_pixel_rot(Render *re)
{
float psize, phi, xfac;
float borderfac = (float)BLI_rcti_size_x(&re->disprect) / (float)re->winx;
+ int xparts = (re->rectx + re->partx - 1) / re->partx;
/* size of 1 pixel mapped to viewplane coords */
psize = BLI_rctf_size_x(&re->viewplane) / (float)re->winx;
@@ -678,7 +702,7 @@ float panorama_pixel_rot(Render *re)
phi = atan(psize / re->clipsta);
/* correction factor for viewplane shifting, first calculate how much the viewplane angle is */
- xfac = borderfac * BLI_rctf_size_x(&re->viewplane) / (float)re->xparts;
+ xfac = borderfac * BLI_rctf_size_x(&re->viewplane) / (float)xparts;
xfac = atan(0.5f * xfac / re->clipsta);
/* and how much the same viewplane angle is wrapped */
psize = 0.5f * phi * ((float)re->partx);
@@ -978,7 +1002,7 @@ static void addblur_rect_key(RenderResult *rr, float *rectf, float *rectf1, floa
rf[1] = mfac * rf[1] + blurfac * rf1[1];
rf[2] = mfac * rf[2] + blurfac * rf1[2];
rf[3] = mfac * rf[3] + blurfac * rf1[3];
- }
+ }
}
}
rectf += stride;
@@ -1070,7 +1094,7 @@ static void do_render_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay = render_get_active_layer(re, re->result);
- re->display_draw(re->ddh, re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
@@ -1513,6 +1537,7 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
re->main = bmain;
re->scene = sce;
+ re->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
@@ -1560,7 +1585,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntreeFreeCache(ntree);
do_render_fields_blur_3d(re);
- }
+ }
else {
/* ensure new result gets added, like for regular renders */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -1865,7 +1890,7 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
if (scene->r.border.xmax <= scene->r.border.xmin ||
scene->r.border.ymax <= scene->r.border.ymin)
{
- BKE_report(reports, RPT_ERROR, "No border area selected.");
+ BKE_report(reports, RPT_ERROR, "No border area selected");
return 0;
}
}
@@ -1876,13 +1901,13 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
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");
+ BKE_report(reports, RPT_ERROR, "Cannot save render buffers, check the temp default path");
return 0;
}
/* no fullsample and edge */
if ((scene->r.scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) {
- BKE_report(reports, RPT_ERROR, "Full Sample doesn't support Edge Enhance");
+ BKE_report(reports, RPT_ERROR, "Full sample does not support edge enhance");
return 0;
}
@@ -1893,18 +1918,18 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
if (scene->r.scemode & R_DOCOMP) {
if (scene->use_nodes) {
if (!scene->nodetree) {
- BKE_report(reports, RPT_ERROR, "No Nodetree in Scene");
+ BKE_report(reports, RPT_ERROR, "No node tree in scene");
return 0;
}
if (!check_composite_output(scene)) {
- BKE_report(reports, RPT_ERROR, "No Render Output Node in Scene");
+ BKE_report(reports, RPT_ERROR, "No render output node in scene");
return 0;
}
if (scene->r.scemode & R_FULL_SAMPLE) {
if (composite_needs_render(scene, 0) == 0) {
- BKE_report(reports, RPT_ERROR, "Full Sample AA not supported without 3d rendering");
+ BKE_report(reports, RPT_ERROR, "Full sample AA not supported without 3D rendering");
return 0;
}
}
@@ -1923,7 +1948,7 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
/* forbidden combinations */
if (scene->r.mode & R_PANORAMA) {
if (scene->r.mode & R_ORTHO) {
- BKE_report(reports, RPT_ERROR, "No Ortho render possible for Panorama");
+ BKE_report(reports, RPT_ERROR, "No ortho render possible for panorama");
return 0;
}
}
@@ -1939,7 +1964,7 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r
if (!(srl->layflag & SCE_LAY_DISABLE))
break;
if (srl == NULL) {
- BKE_report(reports, RPT_ERROR, "All RenderLayers are disabled");
+ BKE_report(reports, RPT_ERROR, "All render layers are disabled");
return 0;
}
@@ -2008,6 +2033,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
re->main = bmain;
re->scene = scene;
+ re->scene_color_manage = BKE_scene_check_color_management_enabled(scene);
re->camera_override = camera_override;
re->lay = lay;
@@ -2111,6 +2137,7 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
/* note; the way it gets 32 bits rects is weak... */
if (ibuf->rect == NULL) {
ibuf->rect = MEM_mapallocN(sizeof(int) * rres.rectx * rres.recty, "temp 32 bits rect");
+ ibuf->mall |= IB_rect;
RE_ResultGet32(re, ibuf->rect);
do_free = TRUE;
}
@@ -2124,13 +2151,14 @@ static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovie
if (do_free) {
MEM_freeN(ibuf->rect);
ibuf->rect = NULL;
+ ibuf->mall &= ~IB_rect;
}
/* imbuf knows which rects are not part of ibuf */
IMB_freeImBuf(ibuf);
printf("Append frame %d", scene->r.cfra);
- }
+ }
else {
if (name_override)
BLI_strncpy(name, name_override, sizeof(name));
@@ -2344,6 +2372,7 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
re->main = bmain;
re->scene = sce;
+ re->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
re->lay = sce->lay;
camera = RE_GetCamera(re);
@@ -2388,6 +2417,7 @@ int RE_ReadRenderResult(Scene *scene, Scene *scenode)
re = RE_NewRender(scene->id.name);
RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect);
re->scene = scene;
+ re->scene_color_manage = BKE_scene_check_color_management_enabled(scene);
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
success = render_result_exr_file_read(re, 0);
@@ -2448,25 +2478,25 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char
IMB_freeImBuf(ibuf_clip);
}
else {
- BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to allocate clip buffer '%s'\n", filename);
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to allocate clip buffer '%s'", filename);
}
}
else {
- BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: incorrect dimensions for partial copy '%s'\n", filename);
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: incorrect dimensions for partial copy '%s'", filename);
}
}
IMB_freeImBuf(ibuf);
}
else {
- BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'", filename);
}
}
void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *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);
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'", filename);
return;
}
}
@@ -2494,8 +2524,8 @@ int RE_WriteEnvmapResult(struct ReportList *reports, Scene *scene, EnvMap *env,
if (env->type == ENV_CUBE) {
for (i = 0; i < 12; i += 2) {
- maxX = MAX2(maxX, layout[i] + 1);
- maxY = MAX2(maxY, layout[i + 1] + 1);
+ maxX = max_ii(maxX, (int)layout[i] + 1);
+ maxY = max_ii(maxY, (int)layout[i + 1] + 1);
}
ibuf = IMB_allocImBuf(maxX * dx, maxY * dx, 24, IB_rectfloat);
@@ -2527,7 +2557,7 @@ int RE_WriteEnvmapResult(struct ReportList *reports, Scene *scene, EnvMap *env,
return TRUE;
}
else {
- BKE_report(reports, RPT_ERROR, "Error writing environment map.");
+ BKE_report(reports, RPT_ERROR, "Error writing environment map");
return FALSE;
}
}