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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to