[Bf-blender-cvs] [e862bcd6c8c] blender2.8: Workbench: World based studio lighting

Jeroen Bakker noreply at git.blender.org
Wed May 16 16:44:53 CEST 2018


Commit: e862bcd6c8cb218c2213ac4a05a11dd13dbdecbf
Author: Jeroen Bakker
Date:   Wed May 16 16:42:30 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe862bcd6c8cb218c2213ac4a05a11dd13dbdecbf

Workbench: World based studio lighting

Disabled shadows for now as the calculation of the light direction is
still to bogus.

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

A	release/datafiles/studiolights/camera/camera01.hdr
A	release/datafiles/studiolights/camera/camera02.jpg
D	release/datafiles/studiolights/sl01.jpg
R100	release/datafiles/studiolights/sl02.jpg	release/datafiles/studiolights/world/sl02.jpg
M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/BKE_studiolight.h
M	source/blender/blenkernel/intern/studiolight.c
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/datafiles/studiolights/camera/camera01.hdr b/release/datafiles/studiolights/camera/camera01.hdr
new file mode 100644
index 00000000000..341b15524c5
Binary files /dev/null and b/release/datafiles/studiolights/camera/camera01.hdr differ
diff --git a/release/datafiles/studiolights/camera/camera02.jpg b/release/datafiles/studiolights/camera/camera02.jpg
new file mode 100644
index 00000000000..37be86325df
Binary files /dev/null and b/release/datafiles/studiolights/camera/camera02.jpg differ
diff --git a/release/datafiles/studiolights/sl01.jpg b/release/datafiles/studiolights/sl01.jpg
deleted file mode 100644
index cd007bade68..00000000000
Binary files a/release/datafiles/studiolights/sl01.jpg and /dev/null differ
diff --git a/release/datafiles/studiolights/sl02.jpg b/release/datafiles/studiolights/world/sl02.jpg
similarity index 100%
rename from release/datafiles/studiolights/sl02.jpg
rename to release/datafiles/studiolights/world/sl02.jpg
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index f053a326ef1..53dea7ad2e8 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3510,14 +3510,17 @@ class VIEW3D_PT_shading(Panel):
             col.row().prop(shading, "light", expand=True)
             if shading.light == 'STUDIO':
                 col.row().template_icon_view(shading, "studio_light")
+                if shading.studio_light_orientation == 'WORLD':
+                    col.row().prop(shading, "studiolight_rot_z")
 
             col.separator()
 
-            row = col.row()
-            row.prop(shading, "show_shadows")
-            sub = row.row()
-            sub.active = shading.show_shadows
-            sub.prop(shading, "shadow_intensity", text="")
+            if not(shading.light == 'STUDIO' and shading.studio_light_orientation == 'WORLD'):
+                row = col.row()
+                row.prop(shading, "show_shadows")
+                sub = row.row()
+                sub.active = shading.show_shadows
+                sub.prop(shading, "shadow_intensity", text="")
 
             col.prop(shading, "show_object_outline")
 
diff --git a/source/blender/blenkernel/BKE_studiolight.h b/source/blender/blenkernel/BKE_studiolight.h
index c65e9050157..33c2af668b2 100644
--- a/source/blender/blenkernel/BKE_studiolight.h
+++ b/source/blender/blenkernel/BKE_studiolight.h
@@ -38,6 +38,11 @@
 
 #include "DNA_space_types.h"
 
+/*
+ * These defines are the indexes in the StudioLight.diffuse_light
+ * X_POS means the light that is traveling towards the positive X
+ * So Light direction.
+ */
 #define STUDIOLIGHT_X_POS 0
 #define STUDIOLIGHT_X_NEG 1
 #define STUDIOLIGHT_Y_POS 2
@@ -47,8 +52,11 @@
 
 enum StudioLightFlag
 {
-	STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED = (1 << 0),
-	STUDIOLIGHT_EXTERNAL_FILE            = (1 << 1),
+	STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED   = (1 << 0),
+	STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED = (1 << 1),
+	STUDIOLIGHT_EXTERNAL_FILE              = (1 << 2),
+	STUDIOLIGHT_ORIENTATION_CAMERA         = (1 << 3),
+	STUDIOLIGHT_ORIENTATION_WORLD          = (1 << 4),
 } StudioLightFlag;
 
 typedef struct StudioLight
@@ -60,6 +68,7 @@ typedef struct StudioLight
 	int icon_id;
 	int index;
 	float diffuse_light[6][3];
+	float light_direction[3];
 } StudioLight;
 
 void BKE_studiolight_init(void);
diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c
index 24dc274cf20..baecbd90bc5 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -40,6 +40,7 @@
 #include "BLI_listbase.h"
 #include "BLI_math.h"
 #include "BLI_path_util.h"
+#include "BLI_rand.h"
 #include "BLI_string.h"
 
 #include "DNA_listBase.h"
@@ -54,7 +55,8 @@
 static ListBase studiolights;
 #define STUDIO_LIGHT_EXTENSIONS ".jpg", ".hdr"
 #define STUDIO_LIGHT_DIFFUSE_SAMPLE_STEP 64
-static const char *STUDIO_LIGHT_FOLDER = "studiolights/";
+static const char *STUDIO_LIGHT_CAMERA_FOLDER = "studiolights/camera/";
+static const char *STUDIO_LIGHT_WORLD_FOLDER = "studiolights/world/";
 
 /* FUNCTIONS */
 static void studiolight_free(struct StudioLight *sl)
@@ -79,6 +81,16 @@ static void direction_to_equirectangular(float r[2], const float dir[3])
 	r[1] = (acosf(dir[2] / 1.0) - M_PI) / -M_PI;
 }
 
+static void equirectangular_to_direction(float r[3], float u, float v)
+{
+	float phi = (-(M_PI * 2))*u + M_PI;
+	float theta = -M_PI*v + M_PI;
+	float sin_theta = sinf(theta);
+	r[0] = sin_theta*cosf(phi);
+	r[1] = sin_theta*sinf(phi);
+	r[2] = cosf(theta);
+}
+
 static void studiolight_calculate_directional_diffuse_light(ImBuf *ibuf, float color[4], const float start[3], const float v1[3], const float v2[3])
 {
 	const int steps = STUDIO_LIGHT_DIFFUSE_SAMPLE_STEP;
@@ -125,18 +137,18 @@ static void studiolight_calculate_diffuse_light(StudioLight *sl)
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Z_POS], 0.0f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Z_NEG], 0.0f);
 
-	if (sl->flag &= STUDIOLIGHT_EXTERNAL_FILE) {
+	if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) {
 		ImBuf* ibuf = NULL;
 		ibuf = IMB_loadiffname(sl->path, 0, NULL);
 		if (ibuf) {
 			IMB_float_from_rect(ibuf);
-
+			/* XXX: should calculate the same, only rendering should be different */
 			copy_v3_fl3(start, -1.0f, -1.0f, -1.0f);
 			copy_v3_fl3(v1, 0.0f, 2.0f, 0.0f);
 			copy_v3_fl3(v2, 0.0f, 0.0f, 2.0f);
-			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Z_NEG], start, v1, v2);
+			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Y_POS], start, v1, v2);
 			copy_v3_fl3(start, 1.0f, -1.0f, -1.0f);
-			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Z_POS], start, v1, v2);
+			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Y_NEG], start, v1, v2);
 
 			copy_v3_fl3(start, -1.0f, -1.0f, -1.0f);
 			copy_v3_fl3(v1, 2.0f, 0.0f, 0.0f);
@@ -145,19 +157,53 @@ static void studiolight_calculate_diffuse_light(StudioLight *sl)
 			copy_v3_fl3(start, -1.0f, 1.0f, -1.0f);
 			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_X_NEG], start, v1, v2);
 
-			copy_v3_fl3(start, -1.0f, -1.0f, -1.0f);
+			copy_v3_fl3(start, -1.0f, -1.0f, 1.0f);
 			copy_v3_fl3(v1, 2.0f, 0.0f, 0.0f);
 			copy_v3_fl3(v2, 0.0f, 2.0f, 0.0f);
-			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Y_NEG], start, v1, v2);
-			copy_v3_fl3(start, -1.0f, -1.0f, 1.0f);
-			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Y_POS], start, v1, v2);
-
+			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Z_POS], start, v1, v2);
+			copy_v3_fl3(start, -1.0f, -1.0f, -1.0f);
+			studiolight_calculate_directional_diffuse_light(ibuf, sl->diffuse_light[STUDIOLIGHT_Z_NEG], start, v1, v2);
 			IMB_freeImBuf(ibuf);
 		}
 	}
 	sl->flag |= STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED;
 }
 
+static void studiolight_calculate_light_direction(StudioLight *sl)
+{
+	float best_light = 0.0;
+	sl->light_direction[0] = 0.0f;
+	sl->light_direction[1] = 0.0f;
+	sl->light_direction[2] = -1.0f;
+
+	if ((sl->flag & STUDIOLIGHT_EXTERNAL_FILE) && (sl->flag & STUDIOLIGHT_ORIENTATION_WORLD)) {
+		ImBuf* ibuf = NULL;
+		ibuf = IMB_loadiffname(sl->path, 0, NULL);
+		if (ibuf) {
+			IMB_float_from_rect(ibuf);
+			/* go over every pixel, determine light, if higher calc direction off the light */
+			float col[4];
+			float direction[3];
+			float new_light;
+			for (int y = 0; y < ibuf->y; y ++) {
+				for (int x = 0; x < ibuf->x; x ++) {
+					nearest_interpolation_color_wrap(ibuf, NULL, col, x, y);
+					new_light = col[0] + col[1] + col[2];
+					if (new_light > best_light) {
+						equirectangular_to_direction(direction, x, y);
+						sl->light_direction[0] = direction[1];
+						sl->light_direction[1] = direction[2];
+						sl->light_direction[2] = direction[0];
+						best_light = new_light;
+					}
+				}
+			}
+			IMB_freeImBuf(ibuf);
+		}
+	}
+	sl->flag |= STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED;
+}
+
 static void studiolight_add_files_from_datafolder(const int folder_id, const char* subfolder, int flag)
 {
 	StudioLight *sl;
@@ -185,6 +231,34 @@ static void studiolight_add_files_from_datafolder(const int folder_id, const cha
 
 }
 
+static int studiolight_flag_cmp_order(const StudioLight *sl)
+{
+	/* Internal studiolights before external studio lights */
+	if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) {
+		return 1;
+	}
+	return 0;
+}
+
+static int studiolight_cmp(const void *a, const void *b)
+{
+	const StudioLight *sl1 = a;
+	const StudioLight *sl2 = b;
+
+	const int flagorder1 = studiolight_flag_cmp_order(sl1);
+	const int flagorder2 = studiolight_flag_cmp_order(sl2);
+
+	if (flagorder1 < flagorder2){
+		return -1;
+	}
+	else if (flagorder1 > flagorder2)
+	{
+		return 1;
+	}
+	else {
+		return BLI_strcasecmp(sl1->name, sl2->name);
+	}
+}
 /* API */
 void BKE_studiolight_init(void)
 {
@@ -194,18 +268,23 @@ void BKE_studiolight_init(void)
 	/* Also reserve icon space for it. */
 	/* Add default studio light */
 	sl = studiolight_create();
-	BLI_strncpy(sl->name, "INTERNAL_01\0", FILE_MAXFILE);
-	sl->flag = STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED;
+	BLI_strncpy(sl->name, "INTERNAL_01", FILE_MAXFILE);
+	sl->flag = STUDIOLIGHT_DIFFUSE_LIGHT_CALCULATED | STUDIOLIGHT_ORIENTATION_CAMERA;
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_X_POS], 0.0f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_X_NEG], 0.0f);
-	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Y_POS], 0.0f);
+	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Y_POS], 1.0f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Y_NEG], 0.0f);
-	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Z_POS], 1.0f);
+	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Z_POS], 0.0f);
 	copy_v3_fl(sl->diffuse_light[STUDIOLIGHT_Z_NEG], 0.0f);
 	BLI_addtail(&studiolights, sl);
 
-	studiolight_add_files_from_datafolder(BLENDER_SYSTEM_DATAFILES, STUDIO_LIGHT_FOLDER, 0);
-	studiolight_add_files_from_datafolder(BLENDER_USER_DATAFILES,   STUDIO_LIGHT_FOLDER, 0);
+	studiolight_add_files_from_datafolde

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list