Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/source/pipeline.c
| Show First 20 Lines • Show All 301 Lines • ▼ Show 20 Lines | Render *RE_GetRender(const char *name) | ||||
| /* search for existing renders */ | /* search for existing renders */ | ||||
| for (re = RenderGlobal.renderlist.first; re; re = re->next) | for (re = RenderGlobal.renderlist.first; re; re = re->next) | ||||
| if (STREQLEN(re->name, name, RE_MAXNAME)) | if (STREQLEN(re->name, name, RE_MAXNAME)) | ||||
| break; | break; | ||||
| return re; | return re; | ||||
| } | } | ||||
| /* if you want to know exactly what has been done */ | /* if you want to know exactly what has been done */ | ||||
| RenderResult *RE_AcquireResultRead(Render *re) | RenderResult *RE_AcquireResultRead(Render *re) | ||||
| { | { | ||||
| if (re) { | if (re) { | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_READ); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_READ); | ||||
| return re->result; | return re->result; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 190 Lines • ▼ Show 20 Lines | Render *RE_NewRender(const char *name) | ||||
| RE_InitRenderCB(re); | RE_InitRenderCB(re); | ||||
| /* init some variables */ | /* init some variables */ | ||||
| re->ycor = 1.0f; | re->ycor = 1.0f; | ||||
| return re; | return re; | ||||
| } | } | ||||
| /* MAX_ID_NAME + sizeof(Library->name) + space + null-terminator. */ | |||||
| #define MAX_SCENE_RENDER_NAME (MAX_ID_NAME + 1024 + 2) | |||||
| static void scene_render_name_get(const Scene *scene, | |||||
| const size_t max_size, | |||||
| char *render_name) | |||||
| { | |||||
| if (ID_IS_LINKED_DATABLOCK(scene)) { | |||||
| BLI_snprintf(render_name, max_size, "%s %s", | |||||
| scene->id.lib->id.name, scene->id.name); | |||||
campbellbarton: Picky - the name is the relative path from `lib->parent`, it could be better to use `filepath`… | |||||
| } | |||||
| else { | |||||
| BLI_snprintf(render_name, max_size, "%s", scene->id.name); | |||||
| } | |||||
| } | |||||
| Render *RE_GetSceneRender(const Scene *scene) | |||||
| { | |||||
| char render_name[MAX_SCENE_RENDER_NAME]; | |||||
| scene_render_name_get(scene, sizeof(render_name), render_name); | |||||
| return RE_GetRender(render_name); | |||||
| } | |||||
| Render *RE_NewSceneRender(const Scene *scene) | |||||
| { | |||||
| char render_name[MAX_SCENE_RENDER_NAME]; | |||||
| scene_render_name_get(scene, sizeof(render_name), render_name); | |||||
| return RE_NewRender(render_name); | |||||
| } | |||||
| /* called for new renders and when finishing rendering so | /* called for new renders and when finishing rendering so | ||||
| * we always have valid callbacks on a render */ | * we always have valid callbacks on a render */ | ||||
| void RE_InitRenderCB(Render *re) | void RE_InitRenderCB(Render *re) | ||||
| { | { | ||||
| /* set default empty callbacks */ | /* set default empty callbacks */ | ||||
| re->display_init = result_nothing; | re->display_init = result_nothing; | ||||
| re->display_clear = result_nothing; | re->display_clear = result_nothing; | ||||
| re->display_update = result_rcti_nothing; | re->display_update = result_rcti_nothing; | ||||
| ▲ Show 20 Lines • Show All 1,383 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /* within context of current Render *re, render another scene. | /* within context of current Render *re, render another scene. | ||||
| * it uses current render image size and disprect, but doesn't execute composite | * it uses current render image size and disprect, but doesn't execute composite | ||||
| */ | */ | ||||
| static void render_scene(Render *re, Scene *sce, int cfra) | static void render_scene(Render *re, Scene *sce, int cfra) | ||||
| { | { | ||||
| Render *resc = RE_NewRender(sce->id.name); | Render *resc = RE_NewSceneRender(sce); | ||||
| int winx = re->winx, winy = re->winy; | int winx = re->winx, winy = re->winy; | ||||
| sce->r.cfra = cfra; | sce->r.cfra = cfra; | ||||
| BKE_scene_camera_switch_update(sce); | BKE_scene_camera_switch_update(sce); | ||||
| /* exception: scene uses own size (unfinished code) */ | /* exception: scene uses own size (unfinished code) */ | ||||
| if (0) { | if (0) { | ||||
| ▲ Show 20 Lines • Show All 418 Lines • ▼ Show 20 Lines | for (sample = 0; sample < re->r.osa; sample++) { | ||||
| R.i.curfsa = sample + 1; | R.i.curfsa = sample + 1; | ||||
| /* set all involved renders on the samplebuffers (first was done by render itself, but needs tagged) */ | /* set all involved renders on the samplebuffers (first was done by render itself, but needs tagged) */ | ||||
| /* also function below assumes this */ | /* also function below assumes this */ | ||||
| tag_scenes_for_render(re); | tag_scenes_for_render(re); | ||||
| for (sce = re->main->scene.first; sce; sce = sce->id.next) { | for (sce = re->main->scene.first; sce; sce = sce->id.next) { | ||||
| if (sce->id.tag & LIB_TAG_DOIT) { | if (sce->id.tag & LIB_TAG_DOIT) { | ||||
| re1 = RE_GetRender(sce->id.name); | re1 = RE_GetSceneRender(sce); | ||||
| if (re1 && (re1->r.scemode & R_FULL_SAMPLE)) { | if (re1 && (re1->r.scemode & R_FULL_SAMPLE)) { | ||||
| if (sample) { | if (sample) { | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | ||||
| render_result_exr_file_read_sample(re1, sample); | render_result_exr_file_read_sample(re1, sample); | ||||
| #ifdef WITH_FREESTYLE | #ifdef WITH_FREESTYLE | ||||
| if (re1->r.mode & R_EDGE_FRS) | if (re1->r.mode & R_EDGE_FRS) | ||||
| composite_freestyle_renders(re1, sample); | composite_freestyle_renders(re1, sample); | ||||
| ▲ Show 20 Lines • Show All 1,493 Lines • ▼ Show 20 Lines | else { | ||||
| disprect.xmax = winx; | disprect.xmax = winx; | ||||
| disprect.ymax = winy; | disprect.ymax = winy; | ||||
| } | } | ||||
| if (scenode) | if (scenode) | ||||
| scene = scenode; | scene = scenode; | ||||
| /* get render: it can be called from UI with draw callbacks */ | /* get render: it can be called from UI with draw callbacks */ | ||||
| re = RE_GetRender(scene->id.name); | re = RE_GetSceneRender(scene); | ||||
| if (re == NULL) | if (re == NULL) | ||||
| re = RE_NewRender(scene->id.name); | re = RE_NewSceneRender(scene); | ||||
| RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect); | RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect); | ||||
| re->scene = scene; | re->scene = scene; | ||||
| re->scene_color_manage = BKE_scene_check_color_management_enabled(scene); | re->scene_color_manage = BKE_scene_check_color_management_enabled(scene); | ||||
| BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); | ||||
| success = render_result_exr_file_cache_read(re); | success = render_result_exr_file_cache_read(re); | ||||
| BLI_rw_mutex_unlock(&re->resultmutex); | BLI_rw_mutex_unlock(&re->resultmutex); | ||||
| ▲ Show 20 Lines • Show All 232 Lines • Show Last 20 Lines | |||||
Picky - the name is the relative path from lib->parent, it could be better to use filepath - the absolute path, or lib->id.name which is shorter and going to be unique (within the session), although current they're all named "Lib" prefix.
Does this impact the name used for temporary files? if so this might hit filename length limits.