Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/source/render_result.c
| Show First 20 Lines • Show All 911 Lines • ▼ Show 20 Lines | bool RE_WriteRenderResult(ReportList *reports, | ||||
| /* Write first layer if not multilayer and no layer was specified. */ | /* Write first layer if not multilayer and no layer was specified. */ | ||||
| if (!multi_layer && layer == -1) { | if (!multi_layer && layer == -1) { | ||||
| layer = 0; | layer = 0; | ||||
| } | } | ||||
| /* First add views since IMB_exr_add_channel checks number of views. */ | /* First add views since IMB_exr_add_channel checks number of views. */ | ||||
| if (render_result_has_views(rr)) { | if (render_result_has_views(rr)) { | ||||
| for (RenderView *rview = rr->views.first; rview; rview = rview->next) { | LISTBASE_FOREACH (RenderView *, rview, &rr->views) { | ||||
| if (!view || STREQ(view, rview->name)) { | if (!view || STREQ(view, rview->name)) { | ||||
| IMB_exr_add_view(exrhandle, rview->name); | IMB_exr_add_view(exrhandle, rview->name); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Compositing result. */ | /* Compositing result. */ | ||||
| if (rr->have_combined) { | if (rr->have_combined) { | ||||
| for (RenderView *rview = rr->views.first; rview; rview = rview->next) { | LISTBASE_FOREACH (RenderView *, rview, &rr->views) { | ||||
| if (!rview->rectf) { | if (!rview->rectf) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| const char *viewname = rview->name; | const char *viewname = rview->name; | ||||
| if (view) { | if (view) { | ||||
| if (!STREQ(view, viewname)) { | if (!STREQ(view, viewname)) { | ||||
| continue; | continue; | ||||
| ▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | bool RE_WriteRenderResult(ReportList *reports, | ||||
| /* Other render layers. */ | /* Other render layers. */ | ||||
| int nr = (rr->have_combined) ? 1 : 0; | int nr = (rr->have_combined) ? 1 : 0; | ||||
| for (RenderLayer *rl = rr->layers.first; rl; rl = rl->next, nr++) { | for (RenderLayer *rl = rr->layers.first; rl; rl = rl->next, nr++) { | ||||
| /* Skip other render layers if requested. */ | /* Skip other render layers if requested. */ | ||||
| if (!multi_layer && nr != layer) { | if (!multi_layer && nr != layer) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| for (RenderPass *rp = rl->passes.first; rp; rp = rp->next) { | LISTBASE_FOREACH (RenderPass *, rp, &rl->passes) { | ||||
| /* Skip non-RGBA and Z passes if not using multi layer. */ | /* Skip non-RGBA and Z passes if not using multi layer. */ | ||||
| if (!multi_layer && !(STREQ(rp->name, RE_PASSNAME_COMBINED) || STREQ(rp->name, "") || | if (!multi_layer && !(STREQ(rp->name, RE_PASSNAME_COMBINED) || STREQ(rp->name, "") || | ||||
| (STREQ(rp->name, RE_PASSNAME_Z) && write_z))) { | (STREQ(rp->name, RE_PASSNAME_Z) && write_z))) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* Skip pass if it does not match the requested view(s). */ | /* Skip pass if it does not match the requested view(s). */ | ||||
| const char *viewname = rp->view; | const char *viewname = rp->view; | ||||
| ▲ Show 20 Lines • Show All 237 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /* begin write of exr tile file */ | /* begin write of exr tile file */ | ||||
| void render_result_exr_file_begin(Render *re, RenderEngine *engine) | void render_result_exr_file_begin(Render *re, RenderEngine *engine) | ||||
| { | { | ||||
| char str[FILE_MAX]; | char str[FILE_MAX]; | ||||
| for (RenderResult *rr = re->result; rr; rr = rr->next) { | for (RenderResult *rr = re->result; rr; rr = rr->next) { | ||||
| for (RenderLayer *rl = rr->layers.first; rl; rl = rl->next) { | LISTBASE_FOREACH (RenderLayer *, rl, &rr->layers) { | ||||
| /* Get passes needed by engine. Normally we would wait for the | /* Get passes needed by engine. Normally we would wait for the | ||||
| * engine to create them, but for EXR file we need to know in | * engine to create them, but for EXR file we need to know in | ||||
| * advance. */ | * advance. */ | ||||
| ListBase templates; | ListBase templates; | ||||
| render_result_get_pass_templates(engine, re, rl, &templates); | render_result_get_pass_templates(engine, re, rl, &templates); | ||||
| /* Create render passes requested by engine. Only this part is | /* Create render passes requested by engine. Only this part is | ||||
| * mutex locked to avoid deadlock with Python GIL. */ | * mutex locked to avoid deadlock with Python GIL. */ | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | ||||
| for (RenderPass *pass = templates.first; pass; pass = pass->next) { | LISTBASE_FOREACH (RenderPass *, pass, &templates) { | ||||
| RE_create_render_pass( | RE_create_render_pass( | ||||
| re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL); | re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL); | ||||
| } | } | ||||
| BLI_rw_mutex_unlock(&re->resultmutex); | BLI_rw_mutex_unlock(&re->resultmutex); | ||||
| BLI_freelistN(&templates); | BLI_freelistN(&templates); | ||||
| /* Open EXR file for writing. */ | /* Open EXR file for writing. */ | ||||
| render_result_exr_file_path(re->scene, rl->name, rr->sample_nr, str); | 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); | 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); | IMB_exrtile_begin_write(rl->exrhandle, str, 0, rr->rectx, rr->recty, re->partx, re->party); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* end write of exr tile file, read back first sample */ | /* end write of exr tile file, read back first sample */ | ||||
| void render_result_exr_file_end(Render *re, RenderEngine *engine) | void render_result_exr_file_end(Render *re, RenderEngine *engine) | ||||
| { | { | ||||
| /* Close EXR files. */ | /* Close EXR files. */ | ||||
| for (RenderResult *rr = re->result; rr; rr = rr->next) { | for (RenderResult *rr = re->result; rr; rr = rr->next) { | ||||
| for (RenderLayer *rl = rr->layers.first; rl; rl = rl->next) { | LISTBASE_FOREACH (RenderLayer *, rl, &rr->layers) { | ||||
| IMB_exr_close(rl->exrhandle); | IMB_exr_close(rl->exrhandle); | ||||
| rl->exrhandle = NULL; | rl->exrhandle = NULL; | ||||
| } | } | ||||
| rr->do_exr_tile = false; | rr->do_exr_tile = false; | ||||
| } | } | ||||
| /* Create new render result in memory instead of on disk. */ | /* Create new render result in memory instead of on disk. */ | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | ||||
| render_result_free_list(&re->fullresult, re->result); | render_result_free_list(&re->fullresult, re->result); | ||||
| re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS); | re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS); | ||||
| BLI_rw_mutex_unlock(&re->resultmutex); | BLI_rw_mutex_unlock(&re->resultmutex); | ||||
| for (RenderLayer *rl = re->result->layers.first; rl; rl = rl->next) { | LISTBASE_FOREACH (RenderLayer *, rl, &re->result->layers) { | ||||
| /* Get passes needed by engine. */ | /* Get passes needed by engine. */ | ||||
| ListBase templates; | ListBase templates; | ||||
| render_result_get_pass_templates(engine, re, rl, &templates); | render_result_get_pass_templates(engine, re, rl, &templates); | ||||
| /* Create render passes requested by engine. Only this part is | /* Create render passes requested by engine. Only this part is | ||||
| * mutex locked to avoid deadlock with Python GIL. */ | * mutex locked to avoid deadlock with Python GIL. */ | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | ||||
| for (RenderPass *pass = templates.first; pass; pass = pass->next) { | LISTBASE_FOREACH (RenderPass *, pass, &templates) { | ||||
| RE_create_render_pass(re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL); | RE_create_render_pass(re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL); | ||||
| } | } | ||||
| BLI_freelistN(&templates); | BLI_freelistN(&templates); | ||||
| /* Render passes contents from file. */ | /* Render passes contents from file. */ | ||||
| char str[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100] = ""; | char str[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100] = ""; | ||||
| render_result_exr_file_path(re->scene, rl->name, 0, str); | render_result_exr_file_path(re->scene, rl->name, 0, str); | ||||
| ▲ Show 20 Lines • Show All 406 Lines • Show Last 20 Lines | |||||