Commit: a3428131b61f84976e304c035c8d46b5efdffae1
Author: Jeroen Bakker
Date:   Wed Jun 20 16:07:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa3428131b61f84976e304c035c8d46b5efdffae1

Studiolight: Spherical harmonics

Compile time option to reduce the level of the SH

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

M       source/blender/blenkernel/BKE_studiolight.h
M       source/blender/blenkernel/intern/studiolight.c
M       source/blender/draw/engines/workbench/shaders/workbench_data_lib.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/draw/engines/workbench/workbench_private.h
M       source/blender/draw/engines/workbench/workbench_studiolight.c

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

diff --git a/source/blender/blenkernel/BKE_studiolight.h 
b/source/blender/blenkernel/BKE_studiolight.h
index f9d679b1b1a..af7ef9a383e 100644
--- a/source/blender/blenkernel/BKE_studiolight.h
+++ b/source/blender/blenkernel/BKE_studiolight.h
@@ -61,6 +61,22 @@
 
 #define STUDIOLIGHT_ICON_SIZE 96
 
+#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 2
+#define STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS 9
+
+
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 0
+#define STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS 1
+#endif
+
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 1
+#define STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS 4
+#endif
+
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 2
+#define STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS 9
+#endif
+
 struct GPUTexture;
 struct StudioLight;
 
@@ -97,12 +113,12 @@ typedef struct StudioLight {
        char name[FILE_MAXFILE];
        char path[FILE_MAX];
        char *path_irr_cache;
-       char *path_sh2_cache;
+       char *path_sh_cache;
        int icon_id_irradiance;
        int icon_id_radiance;
        int icon_id_matcap;
        int icon_id_matcap_flipped;
-       float spherical_harmonics_coefs[9][3];
+       float 
spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS][3];
        float light_direction[3];
        ImBuf *equirectangular_radiance_buffer;
        ImBuf *equirectangular_irradiance_buffer;
diff --git a/source/blender/blenkernel/intern/studiolight.c 
b/source/blender/blenkernel/intern/studiolight.c
index 121100570a2..62361917f2f 100644
--- a/source/blender/blenkernel/intern/studiolight.c
+++ b/source/blender/blenkernel/intern/studiolight.c
@@ -110,7 +110,7 @@ static void studiolight_free(struct StudioLight *sl)
        IMB_SAFE_FREE(sl->equirectangular_radiance_buffer);
        IMB_SAFE_FREE(sl->equirectangular_irradiance_buffer);
        MEM_SAFE_FREE(sl->path_irr_cache);
-       MEM_SAFE_FREE(sl->path_sh2_cache);
+       MEM_SAFE_FREE(sl->path_sh_cache);
        MEM_SAFE_FREE(sl->gpu_matcap_3components);
        MEM_SAFE_FREE(sl);
 }
@@ -121,7 +121,7 @@ static struct StudioLight *studiolight_create(int flag)
        sl->path[0] = 0x00;
        sl->name[0] = 0x00;
        sl->path_irr_cache = NULL;
-       sl->path_sh2_cache = NULL;
+       sl->path_sh_cache = NULL;
        sl->free_function = NULL;
        sl->flag = flag;
        sl->index = BLI_listbase_count(&studiolights);
@@ -478,14 +478,11 @@ static void 
studiolight_calculate_diffuse_light(StudioLight *sl)
        if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) {
                BKE_studiolight_ensure_flag(sl, 
STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED);
 
-               for (int comp = 0; comp < 9; comp ++) {
+               for (int comp = 0; comp < 
STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS; comp ++) {
                        
studiolight_calculate_spherical_harmonics_coefficient(sl, comp);
-#if 0
-                       print_v3("SH2", sl->spherical_harmonics_coefs[comp]);
-#endif
                }
                if (sl->flag & STUDIOLIGHT_USER_DEFINED) {
-                       FILE *fp = BLI_fopen(sl->path_sh2_cache, "wb");
+                       FILE *fp = BLI_fopen(sl->path_sh_cache, "wb");
                        if (fp) {
                                fwrite(sl->spherical_harmonics_coefs, 
sizeof(sl->spherical_harmonics_coefs), 1, fp);
                                fclose(fp);
@@ -593,7 +590,7 @@ static bool 
studiolight_load_spherical_harmonics_coefficients(StudioLight *sl)
 {
 #ifdef STUDIOLIGHT_LOAD_CACHED_FILES
        if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) {
-               FILE *fp = BLI_fopen(sl->path_sh2_cache, "rb");
+               FILE *fp = BLI_fopen(sl->path_sh_cache, "rb");
                if (fp) {
                        if (fread((void*)(sl->spherical_harmonics_coefs), 
sizeof(sl->spherical_harmonics_coefs), 1, fp))
                        {
@@ -693,7 +690,7 @@ static void studiolight_add_files_from_datafolder(const int 
folder_id, const cha
                                        BLI_strncpy(sl->name, filename, 
FILE_MAXFILE);
                                        BLI_strncpy(sl->path, path, 
FILE_MAXFILE);
                                        sl->path_irr_cache = 
BLI_string_joinN(path, ".irr");
-                                       sl->path_sh2_cache = 
BLI_string_joinN(path, ".sh2");
+                                       sl->path_sh_cache = 
BLI_string_joinN(path, ".sh2");
                                        BLI_addtail(&studiolights, sl);
                                }
                        }
@@ -853,17 +850,21 @@ static void studiolight_irradiance_preview(uint* 
icon_buffer, StudioLight *sl)
                                /* Spherical Harmonics L0 */
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[0], 0.282095f);
 
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 0
                                /* Spherical Harmonics L1 */
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[1], -0.488603f * normal[2]);
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[2],  0.488603f * normal[1]);
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[3], -0.488603f * normal[0]);
+#endif
 
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 1
                                /* Spherical Harmonics L1 */
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[4], 1.092548f * normal[0] * normal[2]);
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[5], -1.092548f * normal[2] * normal[1]);
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[6], 0.315392f * (3.0f * normal[1] * normal[1] - 
1.0f));
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[7], -1.092548 * normal[0] * normal[1]);
                                madd_v3_v3fl(color, 
sl->spherical_harmonics_coefs[8], 0.546274 * (normal[0] * normal[0] - normal[2] 
* normal[2]));
+#endif
                                pixelresult = rgb_to_cpack(
                                        linearrgb_to_srgb(color[0]),
                                        linearrgb_to_srgb(color[1]),
@@ -885,15 +886,20 @@ void BKE_studiolight_init(void)
        sl = studiolight_create(STUDIOLIGHT_INTERNAL | 
STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED | 
STUDIOLIGHT_ORIENTATION_CAMERA);
        BLI_strncpy(sl->name, "Default", FILE_MAXFILE);
 
+
        copy_v3_fl3(sl->spherical_harmonics_coefs[0], 1.03271556f, 1.07163882f, 
1.11193657f);
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 0
        copy_v3_fl3(sl->spherical_harmonics_coefs[1], -0.00480952f, 
0.05290511f, 0.16394117f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[2], -0.29686999f, 
-0.27378261f, -0.24797194f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[3], 0.47932500f, 0.48242140f, 
0.47190312f);
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 1
        copy_v3_fl3(sl->spherical_harmonics_coefs[4], -0.00576984f, 
0.00504886f, 0.01640534f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[5], 0.15500379f, 0.15415503f, 
0.16244425f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[6], -0.02483751f, 
-0.02245096f, -0.00536885f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[7], 0.11155496f, 0.11005443f, 
0.10839636f);
        copy_v3_fl3(sl->spherical_harmonics_coefs[8], 0.01363425f, 0.01278363f, 
-0.00159006f);
+#endif
 
        BLI_addtail(&studiolights, sl);
 
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 2ba6e0e8e55..2d913c63b00 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -4,7 +4,7 @@ struct LightData {
 };
 
 struct WorldData {
-       vec3 spherical_harmonics_coefs[9];
+       vec3 
spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS];
        vec4 background_color_low;
        vec4 background_color_high;
        vec4 object_outline_color;
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
index 71adc751f0a..b13c4f1b43b 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
@@ -1,32 +1,36 @@
 #define BLINN
 
-vec3 spherical_harmonics_L2(vec3 N, vec3 spherical_harmonics_coefs[9])
+vec3 spherical_harmonics(vec3 N, vec3 
spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS])
 {
        vec3 sh = vec3(0.0);
 
        sh += 0.282095 * spherical_harmonics_coefs[0];
 
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 0
        sh += -0.488603 * N.z * spherical_harmonics_coefs[1];
        sh += 0.488603 * N.y * spherical_harmonics_coefs[2];
        sh += -0.488603 * N.x * spherical_harmonics_coefs[3];
+#endif
 
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL > 1
        sh += 1.092548 * N.x * N.z * spherical_harmonics_coefs[4];
        sh += -1.092548 * N.z * N.y * spherical_harmonics_coefs[5];
        sh += 0.315392 * (3.0 * N.y * N.y - 1.0) * spherical_harmonics_coefs[6];
        sh += -1.092548 * N.x * N.y * spherical_harmonics_coefs[7];
        sh += 0.546274 * (N.x * N.x - N.z * N.z) * spherical_harmonics_coefs[8];
+#endif
 
        return sh;
 }
 
 vec3 get_world_diffuse_light(WorldData world_data, vec3 N)
 {
-       return (spherical_harmonics_L2(vec3(N.x, N.y, -N.z), 
world_data.spherical_harmonics_coefs));
+       return (spherical_harmonics(vec3(N.x, N.y, -N.z), 
world_data.spherical_harmonics_coefs));
 }
 
 vec3 get_camera_diffuse_light(WorldData world_data, vec3 N)
 {
-       return (spherical_harmonics_L2(vec3(N.x, -N.z, -N.y), 
world_data.spherical_harmonics_coefs));
+       return (spherical_harmonics(vec3(N.x, -N.z, -N.y), 
world_data.spherical_harmonics_coefs));
 }
 
 /* N And I are in View Space. */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c 
b/source/blender/draw/engines/workbench/workbench_materials.c
index 231d9a9582a..c0857cf74aa 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -95,6 +95,17 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData 
*wpd, int drawtype,
                BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
        }
 
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 0
+       BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 
0\n");
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 1
+       BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 
1\n");
+#endif
+#if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 2
+       BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL 
2\n");
+#endif
+       BLI_dynstr_appendf(ds, "#define 
STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS 9\n");
+
        str = BLI_dynstr_get_cstring(ds);
        BLI_dynstr_free(ds);
        return str;
diff --git a/source/blender/draw/engines/workbench/workbench_private.h 
b/source/blender/draw/engines/workbench/workbench_private.h
index 9e43a5c4a48..68d50a85c35 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -112,7 +112,7 @@ typedef struct WORKBENCH_UBO_Light {
 } WORKBENCH_UBO_Light;
 
 typedef struct WORKBENCH_UBO_World {
-       float spherical_harmonics_coefs[9][4];
+       fl

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