Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/render_result.c
| Show First 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | RenderPass *render_layer_add_pass(RenderResult *rr, | ||||
| RenderLayer *rl, | RenderLayer *rl, | ||||
| int channels, | int channels, | ||||
| const char *name, | const char *name, | ||||
| const char *viewname, | const char *viewname, | ||||
| const char *chan_id) | const char *chan_id) | ||||
| { | { | ||||
| const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name)); | const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name)); | ||||
| RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name); | RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name); | ||||
| size_t rectsize = ((size_t)rr->rectx) * rr->recty * channels; | |||||
| rpass->channels = channels; | rpass->channels = channels; | ||||
| rpass->rectx = rl->rectx; | rpass->rectx = rl->rectx; | ||||
| rpass->recty = rl->recty; | rpass->recty = rl->recty; | ||||
| rpass->view_id = view_id; | rpass->view_id = view_id; | ||||
| BLI_strncpy(rpass->name, name, sizeof(rpass->name)); | BLI_strncpy(rpass->name, name, sizeof(rpass->name)); | ||||
| BLI_strncpy(rpass->chan_id, chan_id, sizeof(rpass->chan_id)); | BLI_strncpy(rpass->chan_id, chan_id, sizeof(rpass->chan_id)); | ||||
| Show All 10 Lines | for (a = 0; a < channels; a++) { | ||||
| viewname, | viewname, | ||||
| 0, | 0, | ||||
| 0, | 0, | ||||
| NULL, | NULL, | ||||
| false); | false); | ||||
| } | } | ||||
| } | } | ||||
| /* Always allocate combined for display, in case of save buffers | |||||
| * other passes are not allocated and only saved to the EXR file. */ | |||||
| if (rl->exrhandle == NULL || STREQ(rpass->name, RE_PASSNAME_COMBINED)) { | |||||
| float *rect; | |||||
| int x; | |||||
| rpass->rect = MEM_callocN(sizeof(float) * rectsize, name); | |||||
| if (rpass->rect == NULL) { | |||||
| MEM_freeN(rpass); | |||||
| return NULL; | |||||
| } | |||||
| if (STREQ(rpass->name, RE_PASSNAME_VECTOR)) { | |||||
| /* initialize to max speed */ | |||||
| rect = rpass->rect; | |||||
| for (x = rectsize - 1; x >= 0; x--) { | |||||
| rect[x] = PASS_VECTOR_MAX; | |||||
| } | |||||
| } | |||||
| else if (STREQ(rpass->name, RE_PASSNAME_Z)) { | |||||
| rect = rpass->rect; | |||||
| for (x = rectsize - 1; x >= 0; x--) { | |||||
| rect[x] = 10e10; | |||||
| } | |||||
| } | |||||
| } | |||||
| BLI_addtail(&rl->passes, rpass); | BLI_addtail(&rl->passes, rpass); | ||||
| return rpass; | return rpass; | ||||
| } | } | ||||
| /* called by main render as well for parts */ | /* called by main render as well for parts */ | ||||
| /* will read info from Render *re to define layers */ | /* will read info from Render *re to define layers */ | ||||
| /* called in threads */ | /* called in threads */ | ||||
| Show All 24 Lines | RenderResult *render_result_new( | ||||
| rr->tilerect.xmax = partrct->xmax - re->disprect.xmin; | rr->tilerect.xmax = partrct->xmax - re->disprect.xmin; | ||||
| rr->tilerect.ymin = partrct->ymin - re->disprect.ymin; | rr->tilerect.ymin = partrct->ymin - re->disprect.ymin; | ||||
| rr->tilerect.ymax = partrct->ymax - re->disprect.ymin; | rr->tilerect.ymax = partrct->ymax - re->disprect.ymin; | ||||
| if (savebuffers) { | if (savebuffers) { | ||||
| rr->do_exr_tile = true; | rr->do_exr_tile = true; | ||||
| } | } | ||||
| rr->passes_allocated = false; | |||||
| render_result_views_new(rr, &re->r); | render_result_views_new(rr, &re->r); | ||||
| /* check renderdata for amount of layers */ | /* check renderdata for amount of layers */ | ||||
| FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer) { | FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer) { | ||||
| if (layername && layername[0]) { | if (layername && layername[0]) { | ||||
| if (!STREQ(view_layer->name, layername)) { | if (!STREQ(view_layer->name, layername)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 152 Lines • ▼ Show 20 Lines | #undef RENDER_LAYER_ADD_PASS_SAFE | ||||
| /* Border render; calculate offset for use in compositor. compo is centralized coords. */ | /* Border render; calculate offset for use in compositor. compo is centralized coords. */ | ||||
| /* XXX(ton): obsolete? I now use it for drawing border render offset. */ | /* XXX(ton): obsolete? I now use it for drawing border render offset. */ | ||||
| rr->xof = re->disprect.xmin + BLI_rcti_cent_x(&re->disprect) - (re->winx / 2); | rr->xof = re->disprect.xmin + BLI_rcti_cent_x(&re->disprect) - (re->winx / 2); | ||||
| rr->yof = re->disprect.ymin + BLI_rcti_cent_y(&re->disprect) - (re->winy / 2); | rr->yof = re->disprect.ymin + BLI_rcti_cent_y(&re->disprect) - (re->winy / 2); | ||||
| return rr; | return rr; | ||||
| } | } | ||||
| void render_result_passes_allocated_ensure(RenderResult *rr) | |||||
| { | |||||
| LISTBASE_FOREACH (RenderLayer *, rl, &rr->layers) { | |||||
| LISTBASE_FOREACH (RenderPass *, rp, &rl->passes) { | |||||
| if (rl->exrhandle != NULL && !STREQ(rp->name, RE_PASSNAME_COMBINED)) { | |||||
| 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; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| rr->passes_allocated = true; | |||||
| } | |||||
| void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname) | void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname) | ||||
| { | { | ||||
| RenderLayer *rl; | RenderLayer *rl; | ||||
| RenderPass *main_rp; | RenderPass *main_rp; | ||||
| for (rl = rr->layers.first; rl; rl = rl->next) { | for (rl = rr->layers.first; rl; rl = rl->next) { | ||||
| RenderLayer *main_rl = BLI_findstring( | RenderLayer *main_rl = BLI_findstring( | ||||
| &re->result->layers, rl->name, offsetof(RenderLayer, name)); | &re->result->layers, rl->name, offsetof(RenderLayer, name)); | ||||
| ▲ Show 20 Lines • Show All 743 Lines • ▼ Show 20 Lines | for (RenderResult *rr = re->result; rr; rr = rr->next) { | ||||
| 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, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS); | re->result = render_result_new(re, &re->disprect, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS); | ||||
| re->result->stamp_data = stamp_data; | re->result->stamp_data = stamp_data; | ||||
| render_result_passes_allocated_ensure(re->result); | |||||
| BLI_rw_mutex_unlock(&re->resultmutex); | BLI_rw_mutex_unlock(&re->resultmutex); | ||||
| LISTBASE_FOREACH (RenderLayer *, rl, &re->result->layers) { | 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 | ||||
| ▲ Show 20 Lines • Show All 417 Lines • Show Last 20 Lines | |||||