Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2018-06-14 11:38:17 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-06-14 12:44:36 +0300
commit17b029d80efaf51df55cd1133718d1cf69aa244f (patch)
tree639c399913eca1935e20dacc1352e7d71b12db34 /source/blender/blenkernel
parentfecec7dd6889785e4f11aa95f40ad30b225a01c8 (diff)
T55406: Flip Matcap
- Icon represent the flipped matcap in the shading menu - Added template_icon to display any icon in scale.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_studiolight.h13
-rw-r--r--source/blender/blenkernel/intern/studiolight.c53
2 files changed, 42 insertions, 24 deletions
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);
}
}