From acaf46db0ea7103aaa3f46092b3582611d37ca0f Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 30 May 2018 14:40:57 +0200 Subject: Workbench: Specular Highlights Added specular highlights for: - Solid studio shading - Texture studio shading --- release/scripts/startup/bl_ui/properties_scene.py | 1 + release/scripts/startup/bl_ui/space_view3d.py | 3 +++ source/blender/blenkernel/intern/studiolight.c | 31 ++++++++++------------ source/blender/blenloader/intern/versioning_280.c | 18 +++++++++++++ source/blender/draw/engines/eevee/eevee_engine.c | 2 +- .../workbench/shaders/workbench_data_lib.glsl | 2 ++ .../shaders/workbench_deferred_composite_frag.glsl | 16 ++++++----- .../workbench_forward_transparent_accum_frag.glsl | 4 ++- .../shaders/workbench_world_light_lib.glsl | 16 +++++++++++ .../draw/engines/workbench/workbench_data.c | 29 ++++++++++++++++++++ .../draw/engines/workbench/workbench_deferred.c | 18 ++----------- .../draw/engines/workbench/workbench_forward.c | 2 ++ .../draw/engines/workbench/workbench_materials.c | 5 +++- .../draw/engines/workbench/workbench_private.h | 6 ++++- source/blender/editors/space_view3d/space_view3d.c | 1 + source/blender/makesdna/DNA_scene_types.h | 3 +++ source/blender/makesdna/DNA_view3d_types.h | 11 ++++---- source/blender/makesrna/intern/rna_scene.c | 9 +++++++ source/blender/makesrna/intern/rna_space.c | 6 +++++ 19 files changed, 134 insertions(+), 49 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py index 545d0d696dc..4f3b293faa3 100644 --- a/release/scripts/startup/bl_ui/properties_scene.py +++ b/release/scripts/startup/bl_ui/properties_scene.py @@ -442,6 +442,7 @@ class SCENE_PT_viewport_display(SceneButtonsPanel, Panel): scene = context.scene layout.prop(scene.display, "light_direction", text="") layout.prop(scene.display, "shadow_shift") + layout.prop(scene.display, "roughness") class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel): diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 0841f914e7e..c2a1037de32 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -3527,6 +3527,9 @@ class VIEW3D_PT_shading(Panel): if shading.studio_light_orientation == 'WORLD': col.row().prop(shading, "studiolight_rot_z") + row = col.row() + row.prop(shading, "show_specular_highlights") + col.separator() row = col.row() diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c index 2cdffb88212..4e7a0b2b9c5 100644 --- a/source/blender/blenkernel/intern/studiolight.c +++ b/source/blender/blenkernel/intern/studiolight.c @@ -57,7 +57,7 @@ static ListBase studiolights; #define STUDIOLIGHT_EXTENSIONS ".jpg", ".hdr" #define STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE 8 -#define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT 64 +#define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT 32 #define STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH (STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT * 2) static const char *STUDIOLIGHT_CAMERA_FOLDER = "studiolights/camera/"; @@ -430,30 +430,27 @@ static void studiolight_calculate_light_direction(StudioLight *sl) 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); + BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_IMAGE_CALCULATED); + ImBuf *ibuf = sl->equirectangular_irradiance_buffer; 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]; + float *color = ibuf->rect_float; + for (int y = 0; y < STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT; y ++) { + for (int x = 0; x < STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH; x ++) { + new_light = color[0] + color[1] + color[2]; if (new_light > best_light) { - float u = x / (float)ibuf->x; - float v = y / (float)ibuf->y; - equirectangular_to_direction(direction, u, v); - sl->light_direction[0] = direction[1]; - sl->light_direction[1] = direction[0]; - sl->light_direction[2] = direction[2]; + float u = x / (float)STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_WIDTH; + float v = y / (float)STUDIOLIGHT_IRRADIANCE_EQUIRECTANGULAR_HEIGHT; + equirectangular_to_direction(sl->light_direction, u, v); + SWAP(float, sl->light_direction[0], sl->light_direction[1]); + normalize_v3(sl->light_direction); + negate_v3(sl->light_direction); best_light = new_light; } + color += 4; } } - IMB_freeImBuf(ibuf); } } sl->flag |= STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED; diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index bdac8067bb5..a4b5f53e0eb 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -1494,4 +1494,22 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) } } } + + { + if (!DNA_struct_elem_find(fd->filesdna, "SceneDisplay", "float", "roughness")) { + for (Scene *scene = main->scene.first; scene; scene = scene->id.next) { + scene->display.roughness = 0.0f; + } + for (bScreen *screen = main->screen.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + v3d->shading.flag |= V3D_SHADING_SPECULAR_HIGHLIGHTS; + } + } + } + } + } + } } diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 9bd240afe3a..0889ce9a334 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -149,7 +149,7 @@ static void eevee_cache_populate(void *vedata, Object *ob) } } else if (!USE_SCENE_LIGHT(draw_ctx->v3d)) { - /* do not add any light sources to the cache */ + /* do not add any scene light sources to the cache */ } else if (ob->type == OB_LIGHTPROBE) { if ((ob->base_flag & BASE_FROMDUPLI) != 0) { 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 d0b1c580e5f..c826a5b82fa 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl @@ -8,4 +8,6 @@ struct WorldData { vec4 background_color_low; vec4 background_color_high; vec4 object_outline_color; + vec4 light_direction_vs; + float specular_sharpness; }; diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl index 35867a566f1..525b934d3be 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl @@ -10,7 +10,6 @@ uniform float lightMultiplier; uniform float shadowShift = 0.1; uniform mat3 normalWorldMatrix; -uniform vec3 lightDirection; /* light direction in view space */ layout(std140) uniform world_block { WorldData world_data; @@ -57,14 +56,17 @@ void main() #ifdef V3D_LIGHTING_STUDIO -#ifdef STUDIOLIGHT_ORIENTATION_CAMERA + #ifdef STUDIOLIGHT_ORIENTATION_CAMERA vec3 diffuse_light = get_camera_diffuse_light(world_data, normal_viewport); -#endif -#ifdef STUDIOLIGHT_ORIENTATION_WORLD + #endif + + #ifdef STUDIOLIGHT_ORIENTATION_WORLD vec3 normal_world = normalWorldMatrix * normal_viewport; vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world); -#endif - vec3 shaded_color = diffuse_light * diffuse_color.rgb; + #endif + + vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0)); + vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color; #else /* V3D_LIGHTING_STUDIO */ vec3 shaded_color = diffuse_color.rgb; @@ -72,7 +74,7 @@ void main() #endif /* V3D_LIGHTING_STUDIO */ #ifdef V3D_SHADING_SHADOW - float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection)); + float shadow_mix = step(-shadowShift, dot(normal_viewport, world_data.light_direction_vs.xyz)); float light_multiplier; light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl index 309ae063284..6585bac9289 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl @@ -36,7 +36,9 @@ void main() vec3 normal_world = normalWorldMatrix * normal_viewport; vec3 diffuse_light = get_world_diffuse_light(world_data, normal_world); #endif - vec3 shaded_color = diffuse_light * diffuse_color.rgb; + + vec3 specular_color = get_world_specular_light(world_data, normal_viewport, vec3(0.0, 0.0, 1.0)); + vec3 shaded_color = diffuse_light * diffuse_color.rgb + specular_color; #else /* V3D_LIGHTING_STUDIO */ vec3 shaded_color = diffuse_color.rgb; 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 6507f1ec707..7e476080b64 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 @@ -18,3 +18,19 @@ vec3 get_camera_diffuse_light(WorldData world_data, vec3 N) result = mix(result, world_data.diffuse_light_y_neg, clamp(-N.z, 0.0, 1.0)); return result.xyz; } + +/* N And I are in View Space. */ +vec3 get_world_specular_light(WorldData world_data, vec3 N, vec3 I) +{ +#ifdef V3D_SHADING_SPECULAR_HIGHLIGHTS + vec3 reflection_vector = reflect(I, N); + vec3 specular_light = vec3(1.0); + /* Simple frontal specular highlights. */ + float specular_influence = pow(max(0.0, dot(world_data.light_direction_vs.xyz, reflection_vector)), world_data.specular_sharpness); + vec3 specular_color = specular_light * specular_influence; + +#else /* V3D_SHADING_SPECULAR_HIGHLIGHTS */ + vec3 specular_color = vec3(0.0); +#endif /* V3D_SHADING_SPECULAR_HIGHLIGHTS */ + return specular_color; +} diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index bbd8c57a5b9..062a5b04988 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -5,6 +5,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd) { const DRWContextState *draw_ctx = DRW_context_state_get(); + Scene *scene = draw_ctx->scene; wpd->material_hash = BLI_ghash_ptr_new(__func__); View3D *v3d = draw_ctx->v3d; @@ -36,10 +37,38 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd) copy_v3_v3(wd->object_outline_color, wpd->shading.object_outline_color); wd->object_outline_color[3] = 1.0f; + wd->specular_sharpness = 100 - sqrtf(scene->display.roughness)* 100; wpd->world_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_World), &wpd->world_data); } +void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, float light_direction[3]) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + Scene *scene = draw_ctx->scene; + +#if 0 + if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) { + BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED); + float rot_matrix[3][3]; + axis_angle_to_mat3_single(rot_matrix, 'Z', wpd->shading.studiolight_rot_z); + mul_v3_m3v3(e_data.display.light_direction, rot_matrix, wpd->studio_light->light_direction); + } + else { +#else + { +#endif + copy_v3_v3(light_direction, scene->display.light_direction); + negate_v3(light_direction); + } + + float view_matrix[4][4]; + DRW_viewport_matrix_get(view_matrix, DRW_MAT_VIEW); + mul_v3_mat3_m4v3(wpd->world_data.light_direction_vs, view_matrix, light_direction); + wpd->world_data.light_direction_vs[3] = 0.0; + DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data); +} + void workbench_private_data_free(WORKBENCH_PrivateData *wpd) { BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN); diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 6a96822984d..f0494325475 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -304,22 +304,10 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) select_deferred_shaders(wpd); /* Deferred Mix Pass */ { - copy_v3_v3(e_data.display.light_direction, scene->display.light_direction); - negate_v3(e_data.display.light_direction); -#if 0 - if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) { - BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED); - float rot_matrix[3][3]; - // float dir[3] = {0.57, 0.57, -0.57}; - axis_angle_to_mat3_single(rot_matrix, 'Z', wpd->shading.studiolight_rot_z); - mul_v3_m3v3(e_data.display.light_direction, rot_matrix, wpd->studio_light->light_direction); - } -#endif - float view_matrix[4][4]; - DRW_viewport_matrix_get(view_matrix, DRW_MAT_VIEW); - mul_v3_mat3_m4v3(e_data.light_direction_vs, view_matrix, e_data.display.light_direction); + workbench_private_data_get_light_direction(wpd, e_data.display.light_direction); e_data.display.shadow_shift = scene->display.shadow_shift; + copy_v3_v3(e_data.light_direction_vs, wpd->world_data.light_direction_vs); if (SHADOW_ENABLED(wpd)) { psl->composite_pass = DRW_pass_create( @@ -327,7 +315,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass); workbench_composite_uniforms(wpd, grp); DRW_shgroup_stencil_mask(grp, 0x00); - DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction_vs, 1); DRW_shgroup_uniform_float(grp, "lightMultiplier", &light_multiplier, 1); DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1); DRW_shgroup_uniform_float(grp, "shadowShift", &scene->display.shadow_shift, 1); @@ -368,7 +355,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_shadow_pass); DRW_shgroup_stencil_mask(grp, 0x00); workbench_composite_uniforms(wpd, grp); - DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction_vs, 1); DRW_shgroup_uniform_float(grp, "lightMultiplier", &wpd->shadow_multiplier, 1); DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1); DRW_shgroup_uniform_float(grp, "shadowShift", &scene->display.shadow_shift, 1); diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index d2c262bc4ac..4ba6ee3fdc9 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -252,6 +252,8 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) } WORKBENCH_PrivateData *wpd = stl->g_data; workbench_private_data_init(wpd); + float light_direction[3]; + workbench_private_data_get_light_direction(wpd, light_direction); if (!e_data.next_object_id) { e_data.next_object_id = 1; diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 6028d3816d4..2dffafbe409 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -52,6 +52,9 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype) if (wpd->shading.flag & V3D_SHADING_SHADOW) { BLI_dynstr_appendf(ds, "#define V3D_SHADING_SHADOW\n"); } + if (wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHTS) { + BLI_dynstr_appendf(ds, "#define V3D_SHADING_SPECULAR_HIGHLIGHTS\n"); + } if (wpd->shading.light & V3D_LIGHTING_STUDIO) { BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n"); if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) { @@ -107,7 +110,7 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template) int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype) { - const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OUTLINE | V3D_SHADING_SHADOW; + const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OUTLINE | V3D_SHADING_SHADOW | V3D_SHADING_SPECULAR_HIGHLIGHTS; int index = (wpd->shading.flag & DRAWOPTIONS_MASK); index = (index << 2) + wpd->shading.light; index = (index << 2); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index bffac99c6d7..918715581d9 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -37,7 +37,7 @@ #define WORKBENCH_ENGINE "BLENDER_WORKBENCH" #define M_GOLDEN_RATION_CONJUGATE 0.618033988749895 -#define MAX_SHADERS 255 +#define MAX_SHADERS 512 #define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE) @@ -106,6 +106,9 @@ typedef struct WORKBENCH_UBO_World { float background_color_low[4]; float background_color_high[4]; float object_outline_color[4]; + float light_direction_vs[4]; + float specular_sharpness; + float pad[3]; } WORKBENCH_UBO_World; BLI_STATIC_ASSERT_ALIGN(WORKBENCH_UBO_World, 16) @@ -209,6 +212,7 @@ bool studiolight_camera_in_object_shadow(WORKBENCH_PrivateData *wpd, Object *ob, /* workbench_data.c */ void workbench_private_data_init(WORKBENCH_PrivateData *wpd); void workbench_private_data_free(WORKBENCH_PrivateData *wpd); +void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, float light_direction[3]); extern DrawEngineType draw_engine_workbench_solid; extern DrawEngineType draw_engine_workbench_transparent; diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index b50eac7e2ed..eec9e310e4c 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -323,6 +323,7 @@ static SpaceLink *view3d_new(const ScrArea *UNUSED(sa), const Scene *scene) v3d->gridlines = 16; v3d->gridsubdiv = 10; v3d->drawtype = OB_SOLID; + v3d->shading.flag = V3D_SHADING_SPECULAR_HIGHLIGHTS; v3d->shading.light = V3D_LIGHTING_STUDIO; v3d->shading.shadow_intensity = 0.5; copy_v3_fl(v3d->shading.single_color, 0.8f); diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index d51c4912c5c..3a7e6d0b4b1 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1371,6 +1371,7 @@ typedef struct DisplaySafeAreas { typedef struct SceneDisplay { float light_direction[3]; /* light direction for shadows/highlight */ float shadow_shift; + float roughness; /* Roughness for the specular highlights */ int matcap_icon; int matcap_type; @@ -1384,6 +1385,8 @@ typedef struct SceneDisplay { float matcap_ssao_factor_edge; float matcap_hair_brightness_randomness; int matcap_ssao_samples; + + int pad; } SceneDisplay; typedef struct SceneEEVEE { diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index b0c7cbb7d1d..a458d053813 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -148,7 +148,7 @@ typedef struct View3DShading { float studiolight_background; float object_outline_color[3]; - float pad3; + float pad2; } View3DShading; /* 3D Viewport Overlay setings */ @@ -337,10 +337,11 @@ enum { /* View3DShading->flag */ enum { - V3D_SHADING_OBJECT_OUTLINE = (1 << 0), - V3D_SHADING_XRAY = (1 << 1), - V3D_SHADING_SHADOW = (1 << 2), - V3D_SHADING_SCENE_LIGHT = (1 << 3), + V3D_SHADING_OBJECT_OUTLINE = (1 << 0), + V3D_SHADING_XRAY = (1 << 1), + V3D_SHADING_SHADOW = (1 << 2), + V3D_SHADING_SCENE_LIGHT = (1 << 3), + V3D_SHADING_SPECULAR_HIGHLIGHTS = (1 << 4), }; /* View3DShading->single_color_type */ diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 1530c7fc483..a8192e8c281 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -5726,6 +5726,15 @@ static void rna_def_scene_display(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_SCENE | NA_EDITED, "rna_Scene_set_update"); + prop = RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "roughness"); + RNA_def_property_float_default(prop, 0.0); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 2); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Roughness", "Roughness for the specular highlights"); + RNA_def_property_update(prop, NC_SCENE | NA_EDITED, "rna_Scene_set_update"); + #ifdef WITH_CLAY_ENGINE /* Matcap. */ prop = RNA_def_property(srna, "matcap_icon", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 94181a1a600..c1096626abb 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2342,6 +2342,12 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Scene Light", "Render lamps and light probes of the scene"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "show_specular_highlights", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "shading.flag", V3D_SHADING_SPECULAR_HIGHLIGHTS); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Specular Highlights", "Render specular highlights"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); + prop = RNA_def_property(srna, "object_outline_color", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "shading.object_outline_color"); RNA_def_property_array(prop, 3); -- cgit v1.2.3