Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/source/render_result.c
| Show First 20 Lines • Show All 258 Lines • ▼ Show 20 Lines | |||||
| /* will read info from Render *re to define layers */ | /* will read info from Render *re to define layers */ | ||||
| /* called in threads */ | /* called in threads */ | ||||
| /* re->winx,winy is coordinate space of entire image, partrct the part within */ | /* 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, const char *layername, const char *viewname) | RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuffers, const char *layername, const char *viewname) | ||||
| { | { | ||||
| RenderResult *rr; | RenderResult *rr; | ||||
| RenderLayer *rl; | RenderLayer *rl; | ||||
| RenderView *rv; | RenderView *rv; | ||||
| SceneLayer *scene_layer; | ViewLayer *view_layer; | ||||
| int rectx, recty; | int rectx, recty; | ||||
| int nr; | int nr; | ||||
| rectx = BLI_rcti_size_x(partrct); | rectx = BLI_rcti_size_x(partrct); | ||||
| recty = BLI_rcti_size_y(partrct); | recty = BLI_rcti_size_y(partrct); | ||||
| if (rectx <= 0 || recty <= 0) | if (rectx <= 0 || recty <= 0) | ||||
| return NULL; | return NULL; | ||||
| Show All 13 Lines | RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuffers, const char *layername, const char *viewname) | ||||
| if (savebuffers) { | if (savebuffers) { | ||||
| rr->do_exr_tile = true; | rr->do_exr_tile = true; | ||||
| } | } | ||||
| 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 */ | ||||
| for (nr = 0, scene_layer = re->render_layers.first; scene_layer; scene_layer = scene_layer->next, nr++) { | for (nr = 0, view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next, nr++) { | ||||
| if (layername && layername[0]) | if (layername && layername[0]) | ||||
| if (!STREQ(scene_layer->name, layername)) | if (!STREQ(view_layer->name, layername)) | ||||
| continue; | continue; | ||||
| if (re->r.scemode & R_SINGLE_LAYER) { | if (re->r.scemode & R_SINGLE_LAYER) { | ||||
| if (nr != re->active_layer) { | if (nr != re->active_view_layer) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| if ((scene_layer->flag & SCENE_LAYER_RENDER) == 0) { | if ((view_layer->flag & VIEW_LAYER_RENDER) == 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); | rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); | ||||
| BLI_addtail(&rr->layers, rl); | BLI_addtail(&rr->layers, rl); | ||||
| BLI_strncpy(rl->name, scene_layer->name, sizeof(rl->name)); | BLI_strncpy(rl->name, view_layer->name, sizeof(rl->name)); | ||||
| rl->layflag = scene_layer->layflag; | rl->layflag = view_layer->layflag; | ||||
| rl->passflag = scene_layer->passflag; /* for debugging: scene_layer->passflag | SCE_PASS_RAYHITS; */ | rl->passflag = view_layer->passflag; /* for debugging: view_layer->passflag | SCE_PASS_RAYHITS; */ | ||||
| rl->pass_xor = scene_layer->pass_xor; | rl->pass_xor = view_layer->pass_xor; | ||||
| rl->rectx = rectx; | rl->rectx = rectx; | ||||
| rl->recty = recty; | rl->recty = recty; | ||||
| if (rr->do_exr_tile) { | if (rr->do_exr_tile) { | ||||
| rl->display_buffer = MEM_mapallocN((size_t)rectx * recty * sizeof(unsigned int), | rl->display_buffer = MEM_mapallocN((size_t)rectx * recty * sizeof(unsigned int), | ||||
| "Combined display space rgba"); | "Combined display space rgba"); | ||||
| if (rl->display_buffer == NULL) { | if (rl->display_buffer == NULL) { | ||||
| render_result_free(rr); | render_result_free(rr); | ||||
| Show All 18 Lines | #define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \ | ||||
| render_result_free(rr); \ | render_result_free(rr); \ | ||||
| return NULL; \ | return NULL; \ | ||||
| } \ | } \ | ||||
| } while (false) | } while (false) | ||||
| /* a renderlayer should always have a Combined pass*/ | /* 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"); | ||||
| if (scene_layer->passflag & SCE_PASS_Z) | if (view_layer->passflag & SCE_PASS_Z) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z"); | ||||
| if (scene_layer->passflag & SCE_PASS_VECTOR) | if (view_layer->passflag & SCE_PASS_VECTOR) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_VECTOR, view, "XYZW"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_VECTOR, view, "XYZW"); | ||||
| if (scene_layer->passflag & SCE_PASS_NORMAL) | if (view_layer->passflag & SCE_PASS_NORMAL) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_NORMAL, view, "XYZ"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_NORMAL, view, "XYZ"); | ||||
| if (scene_layer->passflag & SCE_PASS_UV) | if (view_layer->passflag & SCE_PASS_UV) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_UV, view, "UVA"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_UV, view, "UVA"); | ||||
| if (scene_layer->passflag & SCE_PASS_RGBA) | if (view_layer->passflag & SCE_PASS_RGBA) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_RGBA, view, "RGBA"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_RGBA, view, "RGBA"); | ||||
| if (scene_layer->passflag & SCE_PASS_EMIT) | if (view_layer->passflag & SCE_PASS_EMIT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_EMIT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_EMIT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_DIFFUSE) | if (view_layer->passflag & SCE_PASS_DIFFUSE) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_SPEC) | if (view_layer->passflag & SCE_PASS_SPEC) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SPEC, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SPEC, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_AO) | if (view_layer->passflag & SCE_PASS_AO) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_AO, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_AO, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_ENVIRONMENT) | if (view_layer->passflag & SCE_PASS_ENVIRONMENT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_ENVIRONMENT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_ENVIRONMENT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_INDIRECT) | if (view_layer->passflag & SCE_PASS_INDIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_INDIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_INDIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_SHADOW) | if (view_layer->passflag & SCE_PASS_SHADOW) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SHADOW, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SHADOW, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_REFLECT) | if (view_layer->passflag & SCE_PASS_REFLECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_REFLECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_REFLECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_REFRACT) | if (view_layer->passflag & SCE_PASS_REFRACT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_REFRACT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_REFRACT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_INDEXOB) | if (view_layer->passflag & SCE_PASS_INDEXOB) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXOB, view, "X"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXOB, view, "X"); | ||||
| if (scene_layer->passflag & SCE_PASS_INDEXMA) | if (view_layer->passflag & SCE_PASS_INDEXMA) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXMA, view, "X"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_INDEXMA, view, "X"); | ||||
| if (scene_layer->passflag & SCE_PASS_MIST) | if (view_layer->passflag & SCE_PASS_MIST) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_MIST, view, "Z"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_MIST, view, "Z"); | ||||
| if (rl->passflag & SCE_PASS_RAYHITS) | if (rl->passflag & SCE_PASS_RAYHITS) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_RAYHITS, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 4, RE_PASSNAME_RAYHITS, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_DIFFUSE_DIRECT) | if (view_layer->passflag & SCE_PASS_DIFFUSE_DIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_DIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_DIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_DIFFUSE_INDIRECT) | if (view_layer->passflag & SCE_PASS_DIFFUSE_INDIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_INDIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_INDIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_DIFFUSE_COLOR) | if (view_layer->passflag & SCE_PASS_DIFFUSE_COLOR) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_COLOR, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_DIFFUSE_COLOR, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_GLOSSY_DIRECT) | if (view_layer->passflag & SCE_PASS_GLOSSY_DIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_DIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_DIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_GLOSSY_INDIRECT) | if (view_layer->passflag & SCE_PASS_GLOSSY_INDIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_INDIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_INDIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_GLOSSY_COLOR) | if (view_layer->passflag & SCE_PASS_GLOSSY_COLOR) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_COLOR, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_GLOSSY_COLOR, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_TRANSM_DIRECT) | if (view_layer->passflag & SCE_PASS_TRANSM_DIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_DIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_DIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_TRANSM_INDIRECT) | if (view_layer->passflag & SCE_PASS_TRANSM_INDIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_INDIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_INDIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_TRANSM_COLOR) | if (view_layer->passflag & SCE_PASS_TRANSM_COLOR) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_COLOR, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_TRANSM_COLOR, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_SUBSURFACE_DIRECT) | if (view_layer->passflag & SCE_PASS_SUBSURFACE_DIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_DIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_DIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_SUBSURFACE_INDIRECT) | if (view_layer->passflag & SCE_PASS_SUBSURFACE_INDIRECT) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_INDIRECT, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_INDIRECT, view, "RGB"); | ||||
| if (scene_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) | if (view_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) | ||||
| RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_COLOR, view, "RGB"); | RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_COLOR, view, "RGB"); | ||||
| #undef RENDER_LAYER_ADD_PASS_SAFE | #undef RENDER_LAYER_ADD_PASS_SAFE | ||||
| } | } | ||||
| } | } | ||||
| /* sss, previewrender and envmap don't do layers, so we make a default one */ | /* sss, previewrender and envmap don't do layers, so we make a default one */ | ||||
| if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) { | if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) { | ||||
| rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); | rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); | ||||
| BLI_addtail(&rr->layers, rl); | BLI_addtail(&rr->layers, rl); | ||||
| Show All 20 Lines | for (rv = rr->views.first; rv; rv = rv->next) { | ||||
| /* a renderlayer should always have a Combined pass */ | /* 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"); | ||||
| } | } | ||||
| /* note, this has to be in sync with scene.c */ | /* note, this has to be in sync with scene.c */ | ||||
| rl->layflag = 0x7FFF; /* solid ztra halo strand */ | rl->layflag = 0x7FFF; /* solid ztra halo strand */ | ||||
| rl->passflag = SCE_PASS_COMBINED; | rl->passflag = SCE_PASS_COMBINED; | ||||
| re->active_layer = 0; | re->active_view_layer = 0; | ||||
| } | } | ||||
| /* 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 obsolete? I now use it for drawing border render offset (ton) */ | /* XXX obsolete? I now use it for drawing border render offset (ton) */ | ||||
| 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; | ||||
| ▲ Show 20 Lines • Show All 514 Lines • ▼ Show 20 Lines | void render_result_single_layer_begin(Render *re) | ||||
| re->pushedresult = re->result; | re->pushedresult = re->result; | ||||
| re->result = NULL; | re->result = NULL; | ||||
| } | } | ||||
| /* if scemode is R_SINGLE_LAYER, at end of rendering, merge the both render results */ | /* if scemode is R_SINGLE_LAYER, at end of rendering, merge the both render results */ | ||||
| void render_result_single_layer_end(Render *re) | void render_result_single_layer_end(Render *re) | ||||
| { | { | ||||
| SceneLayer *scene_layer; | ViewLayer *view_layer; | ||||
| RenderLayer *rlpush; | RenderLayer *rlpush; | ||||
| RenderLayer *rl; | RenderLayer *rl; | ||||
| int nr; | int nr; | ||||
| if (re->result == NULL) { | if (re->result == NULL) { | ||||
| printf("pop render result error; no current result!\n"); | printf("pop render result error; no current result!\n"); | ||||
| return; | return; | ||||
| } | } | ||||
| if (!re->pushedresult) | if (!re->pushedresult) | ||||
| return; | return; | ||||
| if (re->pushedresult->rectx == re->result->rectx && re->pushedresult->recty == re->result->recty) { | if (re->pushedresult->rectx == re->result->rectx && re->pushedresult->recty == re->result->recty) { | ||||
| /* find which layer in re->pushedresult should be replaced */ | /* find which layer in re->pushedresult should be replaced */ | ||||
| rl = re->result->layers.first; | rl = re->result->layers.first; | ||||
| /* render result should be empty after this */ | /* render result should be empty after this */ | ||||
| BLI_remlink(&re->result->layers, rl); | BLI_remlink(&re->result->layers, rl); | ||||
| /* reconstruct render result layers */ | /* reconstruct render result layers */ | ||||
| for (nr = 0, scene_layer = re->render_layers.first; scene_layer; scene_layer = scene_layer->next, nr++) { | for (nr = 0, view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next, nr++) { | ||||
| if (nr == re->active_layer) { | if (nr == re->active_view_layer) { | ||||
| BLI_addtail(&re->result->layers, rl); | BLI_addtail(&re->result->layers, rl); | ||||
| } | } | ||||
| else { | else { | ||||
| rlpush = RE_GetRenderLayer(re->pushedresult, scene_layer->name); | rlpush = RE_GetRenderLayer(re->pushedresult, view_layer->name); | ||||
| if (rlpush) { | if (rlpush) { | ||||
| BLI_remlink(&re->pushedresult->layers, rlpush); | BLI_remlink(&re->pushedresult->layers, rlpush); | ||||
| BLI_addtail(&re->result->layers, rlpush); | BLI_addtail(&re->result->layers, rlpush); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 501 Lines • Show Last 20 Lines | |||||