Cleanup Preview rendering: Separate world preparation.

Small cleanup that moves world preparation out of scene preparation.
This commit is contained in:
2021-07-21 09:35:21 +02:00
parent 75e41b1279
commit 9aa0a3f533

View File

@@ -348,6 +348,38 @@ static ID *duplicate_ids(ID *id, const bool allow_failure)
}
}
static World *preview_get_world(Main *pr_main)
{
World *result = NULL;
const char *world_name = "World";
result = BLI_findstring(&pr_main->worlds, world_name, offsetof(ID, name) + 2);
/* No world found return first world. */
if (result == NULL) {
result = pr_main->worlds.first;
}
BLI_assert(result & "Preview file has no world.");
return result;
}
static void preview_sync_exposure(World *dst, const World *src)
{
BLI_assert(dst);
BLI_assert(src);
dst->exp = src->exp;
dst->range = src->range;
}
static World *preview_prepare_world(Main *pr_main, const World *world)
{
World *result = preview_get_world(pr_main);
if (world) {
preview_sync_exposure(result, world);
}
return result;
}
/* call this with a pointer to initialize preview scene */
/* call this with NULL to restore assigned ID pointers in preview scene */
static Scene *preview_prepare_scene(
@@ -368,13 +400,7 @@ static Scene *preview_prepare_scene(
/* this flag tells render to not execute depsgraph or ipos etc */
sce->r.scemode |= R_BUTS_PREVIEW;
/* set world always back, is used now */
sce->world = pr_main->worlds.first;
/* now: exposure copy */
if (scene->world) {
sce->world->exp = scene->world->exp;
sce->world->range = scene->world->range;
}
BLI_strncpy(sce->r.engine, scene->r.engine, sizeof(sce->r.engine));
sce->r.color_mgt_flag = scene->r.color_mgt_flag;
BKE_color_managed_display_settings_copy(&sce->display_settings, &scene->display_settings);
@@ -400,13 +426,13 @@ static Scene *preview_prepare_scene(
sce->r.cfra = scene->r.cfra;
/* Setup the world. */
sce->world = preview_prepare_world(pr_main, scene->world);
if (id_type == ID_TE) {
/* Texture is not actually rendered with engine, just set dummy value. */
BLI_strncpy(sce->r.engine, RE_engine_id_BLENDER_EEVEE, sizeof(sce->r.engine));
}
else {
BLI_strncpy(sce->r.engine, scene->r.engine, sizeof(sce->r.engine));
}
if (id_type == ID_MA) {
Material *mat = NULL, *origmat = (Material *)id;
@@ -689,8 +715,8 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
struct ObjectPreviewData {
/* The main for the preview, not of the current file. */
Main *pr_main;
/* Copy of the object to create the preview for. The copy is for thread safety (and to insert it
* into an own main). */
/* Copy of the object to create the preview for. The copy is for thread safety (and to insert
* it into an own main). */
Object *object;
int sizex;
int sizey;
@@ -1549,8 +1575,8 @@ static void icon_preview_startjob_all_sizes(void *customdata,
/* check_engine_supports_preview() checks whether the engine supports "preview mode" (think:
* Material Preview). This check is only relevant when the render function called below is
* going to use such a mode. Object and Action render functions use Solid mode, though, so they
* can skip this test. */
* going to use such a mode. Object and Action render functions use Solid mode, though, so
* they can skip this test. */
/* TODO: Decouple the ID-type-specific render functions from this function, so that it's not
* necessary to know here what happens inside lower-level functions. */
const bool use_solid_render_mode = (ip->id != NULL) && ELEM(GS(ip->id->name), ID_OB, ID_AC);