[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