Workbench: Specular Highlights
Added specular highlights for: - Solid studio shading - Texture studio shading
This commit is contained in:
parent
29f9a19708
commit
acaf46db0e
|
@ -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):
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue