[Bf-blender-cvs] [17b029d80ef] blender2.8: T55406: Flip Matcap

Jeroen Bakker noreply at git.blender.org
Thu Jun 14 11:45:23 CEST 2018


Commit: 17b029d80efaf51df55cd1133718d1cf69aa244f
Author: Jeroen Bakker
Date:   Thu Jun 14 10:38:17 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB17b029d80efaf51df55cd1133718d1cf69aa244f

T55406: Flip Matcap

- Icon represent the flipped matcap in the shading menu
- Added template_icon to display any icon in scale.

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/blenkernel/BKE_studiolight.h
M	source/blender/blenkernel/intern/studiolight.c
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_icons.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/makesrna/intern/rna_ui_api.c
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index a480fa433e1..4f07bbb43f0 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -1609,7 +1609,7 @@ class StudioLightPanelMixin():
         box = layout.box()
         row = box.row()
 
-        row.template_icon_view(studio_light, "icon_id")
+        row.template_icon(layout.icon(studio_light), scale=6.0)
         op = row.operator('wm.studiolight_uninstall', text="", icon='ZOOMOUT')
         op.index = studio_light.index
 
diff --git a/source/blender/blenkernel/BKE_studiolight.h b/source/blender/blenkernel/BKE_studiolight.h
index 50cc3d9734f..e4c4fd87ecd 100644
--- a/source/blender/blenkernel/BKE_studiolight.h
+++ b/source/blender/blenkernel/BKE_studiolight.h
@@ -51,8 +51,11 @@
 #define STUDIOLIGHT_Y_NEG 3
 #define STUDIOLIGHT_Z_POS 4
 #define STUDIOLIGHT_Z_NEG 5
-#define STUDIOLIGHT_ICON_ID_TYPE_RADIANCE 0
-#define STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE 1
+
+#define STUDIOLIGHT_ICON_ID_TYPE_RADIANCE       0
+#define STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE     1
+#define STUDIOLIGHT_ICON_ID_TYPE_MATCAP         2
+#define STUDIOLIGHT_ICON_ID_TYPE_MATCAP_FLIPPED 3
 
 struct GPUTexture;
 
@@ -83,8 +86,10 @@ typedef struct StudioLight {
 	char name[FILE_MAXFILE];
 	char path[FILE_MAX];
 	char *path_irr;
-	int irradiance_icon_id;
-	int radiance_icon_id;
+	int icon_id_irradiance;
+	int icon_id_radiance;
+	int icon_id_matcap;
+	int icon_id_matcap_flipped;
 	int index;
 	float diffuse_light[6][3];
 	float light_direction[3];
diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index a90ae6d5c6f..52dc706637c 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -99,16 +99,23 @@ static void studiolight_free(struct StudioLight *sl)
 	MEM_freeN(sl);
 }
 
-static struct StudioLight *studiolight_create(void)
+static struct StudioLight *studiolight_create(int flag)
 {
 	struct StudioLight *sl = MEM_callocN(sizeof(*sl), __func__);
 	sl->path[0] = 0x00;
 	sl->name[0] = 0x00;
 	sl->path_irr = NULL;
-	sl->flag = 0;
+	sl->flag = flag;
 	sl->index = BLI_listbase_count(&studiolights);
-	sl->radiance_icon_id = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_RADIANCE);
-	sl->irradiance_icon_id = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE);
+	if (flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL)
+	{
+		sl->icon_id_matcap = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_MATCAP);
+		sl->icon_id_matcap_flipped = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_MATCAP_FLIPPED);
+	}
+	else {
+		sl->icon_id_radiance = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_RADIANCE);
+		sl->icon_id_irradiance = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE);
+	}
 
 	for (int index = 0 ; index < 6 ; index ++) {
 		sl->radiance_cubemap_buffers[index] = NULL;
@@ -522,8 +529,7 @@ static void studiolight_add_files_from_datafolder(const int folder_id, const cha
 				const char *filename = dir[i].relname;
 				const char *path = dir[i].path;
 				if (BLI_testextensie_array(filename, imb_ext_image)) {
-					sl = studiolight_create();
-					sl->flag = STUDIOLIGHT_EXTERNAL_FILE | flag;
+					sl = studiolight_create(STUDIOLIGHT_EXTERNAL_FILE | flag);
 					BLI_strncpy(sl->name, filename, FILE_MAXFILE);
 					BLI_strncpy(sl->path, path, FILE_MAXFILE);
 					sl->path_irr = BLI_string_joinN(path, ".irr");
@@ -620,7 +626,7 @@ static uint *studiolight_radiance_preview(StudioLight *sl, int icon_size)
 	return rect;
 }
 
-static uint *studiolight_matcap_preview(StudioLight *sl, int icon_size)
+static uint *studiolight_matcap_preview(StudioLight *sl, int icon_size, bool flipped)
 {
 	BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED);
 
@@ -630,10 +636,17 @@ static uint *studiolight_matcap_preview(StudioLight *sl, int icon_size)
 	float fx, fy;
 	int offset = 0;
 	ImBuf *ibuf = sl->equirectangular_radiance_buffer;
+
 	for (int y = 0; y < icon_size; y++) {
+		fy = y * ibuf->y / icon_size;
 		for (int x = 0; x < icon_size; x++) {
-			fx = x * ibuf->x / icon_size;
-			fy = y * ibuf->y / icon_size;
+			if (flipped)
+			{
+				fx = ibuf->x - (x * ibuf->x / icon_size) - 1;
+			}
+			else {
+				fx = x * ibuf->x / icon_size;
+			}
 			nearest_interpolation_color(ibuf, NULL, color, fx, fy);
 			rect[offset++] = rgb_to_cpack(linearrgb_to_srgb(color[0]),
 			                              linearrgb_to_srgb(color[1]),
@@ -763,9 +776,8 @@ void BKE_studiolight_init(void)
 	/* order studio lights by name */
 	/* Also reserve icon space for it. */
 	/* Add default studio light */
-	sl = studiolight_create();
+	sl = studiolight_create(STUDIOLIGHT_INTERNAL | STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED | STUDIOLIGHT_ORIENTATION_CAMERA);
 	BLI_strncpy(sl->name, "INTERNAL_01", FILE_MAXFILE);
-	sl->flag = STUDIOLIGHT_INTERNAL | STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED | STUDIOLIGHT_ORIENTATION_CAMERA;
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_X_POS], 1.5f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_X_NEG], 0.0f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Y_POS], 0.8f);
@@ -838,16 +850,17 @@ struct ListBase *BKE_studiolight_listbase(void)
 
 uint *BKE_studiolight_preview(StudioLight *sl, int icon_size, int icon_id_type)
 {
-	if (icon_id_type == STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE) {
-		if (sl->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL) {
-			return studiolight_matcap_preview(sl, icon_size);
-		}
-		else {
+	switch(icon_id_type)
+	{
+		case STUDIOLIGHT_ICON_ID_TYPE_RADIANCE:
+		default:
+			return studiolight_radiance_preview(sl, icon_size);
+		case STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE:
 			return studiolight_irradiance_preview(sl, icon_size);
-		}
-	}
-	else {
-		return studiolight_radiance_preview(sl, icon_size);
+		case STUDIOLIGHT_ICON_ID_TYPE_MATCAP:
+			return studiolight_matcap_preview(sl, icon_size, false);
+		case STUDIOLIGHT_ICON_ID_TYPE_MATCAP_FLIPPED:
+			return studiolight_matcap_preview(sl, icon_size, true);
 	}
 }
 
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index e90286ed624..876a382bb7c 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1031,6 +1031,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
 void uiTemplatePreview(uiLayout *layout, struct bContext *C, struct ID *id, int show_buttons, struct ID *parent,
                        struct MTex *slot, const char *preview_id);
 void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand);
+void uiTemplateIcon(uiLayout *layout, int icon_value, float icon_scale);
 void uiTemplateIconView(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int show_labels, float icon_scale);
 void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
 void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 9111ece0883..6e0c71c2224 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -1444,6 +1444,19 @@ int UI_rnaptr_icon_get(bContext *C, PointerRNA *ptr, int rnaicon, const bool big
 		else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
 			return ICON_FILE_IMAGE;
 	}
+	else if (RNA_struct_is_a(ptr->type, &RNA_StudioLight)) {
+		StudioLight *sl = (StudioLight *)ptr->data;
+		switch (sl->flag & STUDIOLIGHT_FLAG_ORIENTATIONS)
+		{
+			case STUDIOLIGHT_ORIENTATION_CAMERA:
+				return sl->icon_id_irradiance;
+			case STUDIOLIGHT_ORIENTATION_WORLD:
+			default:
+				return sl->icon_id_radiance;
+			case STUDIOLIGHT_ORIENTATION_VIEWNORMAL:
+				return sl->icon_id_matcap;
+		}
+	}
 
 	/* get icon from ID */
 	if (id) {
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 2aa94591e55..22487f29977 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -2185,6 +2185,19 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname
 	MEM_freeN(cb);
 }
 
+/********************* Icon Template ************************/
+/**
+ * \param icon_scale: Scale of the icon, 1x == button height.
+ */
+void uiTemplateIcon(uiLayout *layout, int icon_value, float icon_scale)
+{
+	uiBlock *block;
+	uiBut *but;
+
+	block = uiLayoutAbsoluteBlock(layout);
+	but = uiDefIconBut(block, UI_BTYPE_LABEL, 0, ICON_X, 0, 0, UI_UNIT_X * icon_scale, UI_UNIT_Y * icon_scale, NULL, 0.0, 0.0, 0.0, 0.0, "");
+	ui_def_but_icon(but, icon_value, UI_HAS_ICON | UI_BUT_ICON_PREVIEW);
+}
 
 /********************* Icon viewer Template ************************/
 typedef struct IconViewMenuArgs {
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 1c752d45228..f6ef3e9efcd 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -594,6 +594,7 @@ extern StructRNA RNA_StretchToConstraint;
 extern StructRNA RNA_StringProperty;
 extern StructRNA RNA_Struct;
 extern StructRNA RNA_StucciTexture;
+extern StructRNA RNA_StudioLight;
 extern StructRNA RNA_SubsurfModifier;
 extern StructRNA RNA_SunLamp;
 extern StructRNA RNA_SurfaceCurve;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index ab1409192c2..14a3b9cbe5a 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -763,7 +763,7 @@ static const EnumPropertyItem *rna_View3DShading_studio_light_itemf(
 		const int flags = (STUDIOLIGHT_EXTERNAL_FILE | STUDIOLIGHT_ORIENTATION_VIEWNORMAL);
 
 		LISTBASE_FOREACH(StudioLight *, sl, BKE_studiolight_listbase()) {
-			int icon_id = sl->irradiance_icon_id;
+			int icon_id = (v3d->shading.flag & V3D_SHADING_MATCAP_FLIP_X) ? sl->icon_id_matcap_flipped: sl->ic

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list