[Bf-blender-cvs] [f5ea1fc4fba] master: Render: new material preview

William Reynish noreply at git.blender.org
Sun Apr 14 20:26:59 CEST 2019


Commit: f5ea1fc4fbafbac6f648ba0d9d9ef16ca8323041
Author: William Reynish
Date:   Sun Apr 14 18:41:10 2019 +0200
Branches: master
https://developer.blender.org/rBf5ea1fc4fbafbac6f648ba0d9d9ef16ca8323041

Render: new material preview

* EEVEE support through irradiance volume and light probe.
* New shader ball shape (designed by Robin Marin).
* New cloth and liquid shapes, removed monkey.
* Replace world sphere by toggle to use world for any shape.
* Slight bevel on cube.
* More subdivision for displacement preview.
* Fixed and improved UV mapping for all shapes.
* Material icon / asset preview now uses specified shape instead of always
  a sphere. So for example hair material can be displayed as hair.

Ref T57683

===================================================================

A	release/datafiles/preview.blend
D	release/datafiles/preview_cycles.blend
M	source/blender/editors/datafiles/CMakeLists.txt
M	source/blender/editors/include/ED_datafiles.h
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/render/render_preview.c
M	source/blender/makesdna/DNA_material_types.h
M	source/blender/makesrna/intern/rna_material.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_engine.h

===================================================================

diff --git a/release/datafiles/preview.blend b/release/datafiles/preview.blend
new file mode 100644
index 00000000000..f8fafb285c6
Binary files /dev/null and b/release/datafiles/preview.blend differ
diff --git a/release/datafiles/preview_cycles.blend b/release/datafiles/preview_cycles.blend
deleted file mode 100644
index 60c0ed5f763..00000000000
Binary files a/release/datafiles/preview_cycles.blend and /dev/null differ
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index 3a67cd80234..04bd067b146 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -767,7 +767,7 @@ if(WITH_BLENDER)
 		# blender UI only
 
 		# blends
-		data_to_c_simple(../../../../release/datafiles/preview_cycles.blend SRC)
+		data_to_c_simple(../../../../release/datafiles/preview.blend SRC)
 		data_to_c_simple(../../../../release/datafiles/preview_grease_pencil.blend SRC)
 
 		# images
diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h
index fa082e71bf6..43d7117a1b2 100644
--- a/source/blender/editors/include/ED_datafiles.h
+++ b/source/blender/editors/include/ED_datafiles.h
@@ -29,8 +29,8 @@
 extern int datatoc_startup_blend_size;
 extern char datatoc_startup_blend[];
 
-extern int datatoc_preview_cycles_blend_size;
-extern char datatoc_preview_cycles_blend[];
+extern int datatoc_preview_blend_size;
+extern char datatoc_preview_blend[];
 
 extern int datatoc_preview_grease_pencil_blend_size;
 extern char datatoc_preview_grease_pencil_blend[];
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 1591244c9b5..897a07708d0 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -2215,7 +2215,7 @@ void uiTemplatePreview(
 	if (!ui_preview) {
 		ui_preview = MEM_callocN(sizeof(uiPreview), "uiPreview");
 		BLI_strncpy(ui_preview->preview_id, preview_id, sizeof(ui_preview->preview_id));
-		ui_preview->height = (short)(UI_UNIT_Y * 5.6f);
+		ui_preview->height = (short)(UI_UNIT_Y * 7.6f);
 		BLI_addtail(&ar->ui_previews, ui_preview);
 	}
 
@@ -2257,6 +2257,8 @@ void uiTemplatePreview(
 			col = uiLayoutColumn(row, true);
 			uiLayoutSetScaleX(col, 1.5);
 			uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", ICON_NONE);
+			uiItemS(col);
+			uiItemR(col, &material_ptr, "use_preview_world", 0, "", ICON_WORLD);
 		}
 
 		if (pr_texture) {
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 0b0acbffec9..77b24a1b4d9 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -189,7 +189,7 @@ typedef struct IconPreview {
 
 /* *************************** Preview for buttons *********************** */
 
-static Main *G_pr_main_cycles = NULL;
+static Main *G_pr_main = NULL;
 static Main *G_pr_main_grease_pencil = NULL;
 
 #ifndef WITH_HEADLESS
@@ -218,19 +218,13 @@ void ED_preview_ensure_dbase(void)
 	static bool base_initialized = false;
 	BLI_assert(BLI_thread_is_main());
 	if (!base_initialized) {
-		G_pr_main_cycles = load_main_from_memory(datatoc_preview_cycles_blend, datatoc_preview_cycles_blend_size);
+		G_pr_main = load_main_from_memory(datatoc_preview_blend, datatoc_preview_blend_size);
 		G_pr_main_grease_pencil = load_main_from_memory(datatoc_preview_grease_pencil_blend, datatoc_preview_grease_pencil_blend_size);
 		base_initialized = true;
 	}
 #endif
 }
 
-static bool check_engine_supports_textures(Scene *scene)
-{
-	RenderEngineType *type = RE_engines_find(scene->r.engine);
-	return (type->flag & RE_USE_TEXTURE_PREVIEW) != 0;
-}
-
 static bool check_engine_supports_preview(Scene *scene)
 {
 	RenderEngineType *type = RE_engines_find(scene->r.engine);
@@ -239,8 +233,8 @@ static bool check_engine_supports_preview(Scene *scene)
 
 void ED_preview_free_dbase(void)
 {
-	if (G_pr_main_cycles)
-		BKE_main_free(G_pr_main_cycles);
+	if (G_pr_main)
+		BKE_main_free(G_pr_main);
 
 	if (G_pr_main_grease_pencil)
 		BKE_main_free(G_pr_main_grease_pencil);
@@ -262,14 +256,16 @@ static const char *preview_collection_name(const char pr_type)
 			return "Sphere";
 		case MA_CUBE:
 			return "Cube";
-		case MA_MONKEY:
-			return "Monkey";
+		case MA_SHADERBALL:
+			return "Shader Ball";
+		case MA_CLOTH:
+			return "Cloth";
+		case MA_FLUID:
+			return "Fluid";
 		case MA_SPHERE_A:
-			return "World Sphere";
-		case MA_TEXTURE:
-			return "Texture";
+			return "World Shader Ball";
 		case MA_LAMP:
-			return "Light";
+			return "Lamp";
 		case MA_SKY:
 			return "Sky";
 		case MA_HAIR:
@@ -282,8 +278,9 @@ static const char *preview_collection_name(const char pr_type)
 	}
 }
 
-static void set_preview_collection(Scene *scene, ViewLayer *view_layer, char pr_type)
+static void set_preview_visibility(Scene *scene, ViewLayer *view_layer, char pr_type, int pr_method)
 {
+	/* Set appropriate layer as visibile. */
 	LayerCollection *lc = view_layer->layer_collections.first;
 	const char *collection_name = preview_collection_name(pr_type);
 
@@ -296,6 +293,18 @@ static void set_preview_collection(Scene *scene, ViewLayer *view_layer, char pr_
 		}
 	}
 
+	/* Hide floor for icon renders. */
+	for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+		if (STREQ(base->object->id.name + 2, "Floor")) {
+			if (pr_method == PR_ICON_RENDER) {
+				base->object->restrictflag |= OB_RESTRICT_RENDER;
+			}
+			else {
+				base->object->restrictflag &= ~OB_RESTRICT_RENDER;
+			}
+		}
+	}
+
 	BKE_layer_collection_sync(scene, view_layer);
 }
 
@@ -389,11 +398,8 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 
 		sce->r.cfra = scene->r.cfra;
 
-		if (id_type == ID_TE && !check_engine_supports_textures(scene)) {
-			/* Force blender internal for texture icons and nodes render,
-			 * seems commonly used render engines does not support
-			 * such kind of rendering.
-			 */
+		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 {
@@ -410,8 +416,8 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 				sp->id_copy = NULL;
 				BLI_addtail(&pr_main->materials, mat);
 
-				/* use current scene world to light sphere */
-				if (mat->pr_type == MA_SPHERE_A && sp->pr_method == PR_BUTS_RENDER) {
+				/* Use current scene world for lighting. */
+				if (mat->pr_flag == MA_PREVIEW_WORLD && sp->pr_method == PR_BUTS_RENDER) {
 					/* Use current scene world to light sphere. */
 					sce->world = preview_get_localized_world(sp, scene->world);
 				}
@@ -419,17 +425,14 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 					/* Use a default world color. Using the current
 					 * scene world can be slow if it has big textures. */
 					sce->world->use_nodes = false;
-					sce->world->horr = 0.5f;
-					sce->world->horg = 0.5f;
-					sce->world->horb = 0.5f;
+					sce->world->horr = 0.05f;
+					sce->world->horg = 0.05f;
+					sce->world->horb = 0.05f;
 				}
 
-				if (sp->pr_method == PR_ICON_RENDER) {
-					set_preview_collection(sce, view_layer, MA_SPHERE_A);
-				}
-				else {
-					set_preview_collection(sce, view_layer, mat->pr_type);
+				set_preview_visibility(sce, view_layer, mat->pr_type, sp->pr_method);
 
+				if (sp->pr_method != PR_ICON_RENDER) {
 					if (mat->nodetree && sp->pr_method == PR_NODE_RENDER) {
 						/* two previews, they get copied by wmJob */
 						BKE_node_preview_init_tree(mat->nodetree, sp->sizex, sp->sizey, true);
@@ -470,7 +473,6 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 				sp->id_copy = NULL;
 				BLI_addtail(&pr_main->textures, tex);
 			}
-			set_preview_collection(sce, view_layer, MA_TEXTURE);
 
 			if (tex && tex->nodetree && sp->pr_method == PR_NODE_RENDER) {
 				/* two previews, they get copied by wmJob */
@@ -490,7 +492,7 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 				BLI_addtail(&pr_main->lights, la);
 			}
 
-			set_preview_collection(sce, view_layer, MA_LAMP);
+			set_preview_visibility(sce, view_layer, MA_LAMP, sp->pr_method);
 
 			if (sce->world) {
 				/* Only use lighting from the light. */
@@ -524,7 +526,7 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
 				BLI_addtail(&pr_main->worlds, wrld);
 			}
 
-			set_preview_collection(sce, view_layer, MA_SKY);
+			set_preview_visibility(sce, view_layer, MA_SKY, sp->pr_method);
 			sce->world = wrld;
 
 			if (wrld && wrld->nodetree && sp->pr_method == PR_NODE_RENDER) {
@@ -1178,7 +1180,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short
 			}
 
 			if ((ma == NULL) || (ma->gp_style == NULL)) {
-				sp->pr_main = G_pr_main_cycles;
+				sp->pr_main = G_pr_main;
 			}
 			else {
 				sp->pr_main = G_pr_main_grease_pencil;
@@ -1359,7 +1361,7 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
 	}
 
 	if ((ma == NULL) || (ma->gp_style == NULL)) {
-		sp->pr_main = G_pr_main_cycles;
+		sp->pr_main = G_pr_main;
 	}
 	else {
 		sp->pr_main = G_pr_main_grease_pencil;
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 718ca4f3b7d..3db8bf92f56 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -147,11 +147,14 @@ typedef struct Material {
 	float gloss_mir  DNA_DEPRECATED;
 	float roughness;
 	float metallic;
-	char _pad0[2];
 
-	/** For buttons and render. */
-	char pr_type, use_nodes;
+	/** Nodes */
+	char use_nodes;
+
+	/** Preview render. */
+	char pr_type;
 	short pr_texture;
+	short pr_flag;
 
 	/** Index for render passes. */
 	short index;
@@ -279,13 +282,18 @@ typedef struct Material {
 #define MA_FLAT			0
 #define MA_SPHERE		1
 #define MA_CUBE			2
-#define MA_MONKEY		3
-#define MA_SPHERE_A		4
+#define MA_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list