diff options
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_materials.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_materials.c | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 55a97b99066..b25938cd0e5 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -12,10 +12,10 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Mate /* When in OB_TEXTURE always uyse V3D_SHADING_MATERIAL_COLOR as fallback when no texture could be determined */ int color_type = wpd->drawtype == OB_SOLID ? wpd->shading.color_type : V3D_SHADING_MATERIAL_COLOR; static float default_diffuse_color[] = {0.8f, 0.8f, 0.8f, 1.0f}; - static float default_specular_color[] = {1.0f, 1.0f, 1.0f, 1.0f}; + static float default_specular_color[] = {0.5f, 0.5f, 0.5f, 0.5f}; copy_v4_v4(data->material_data.diffuse_color, default_diffuse_color); copy_v4_v4(data->material_data.specular_color, default_specular_color); - data->material_data.roughness = 0.25f; + data->material_data.roughness = 0.5f; if (DRW_object_is_paint_mode(ob) || color_type == V3D_SHADING_SINGLE_COLOR) { copy_v3_v3(data->material_data.diffuse_color, wpd->shading.single_color); @@ -40,7 +40,7 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Mate } } -char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype) +char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair) { char *str = NULL; @@ -52,17 +52,29 @@ 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_HIGHLIGHT) { + if (CAVITY_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define V3D_SHADING_CAVITY\n"); + } + if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) { BLI_dynstr_appendf(ds, "#define V3D_SHADING_SPECULAR_HIGHLIGHT\n"); } - if (wpd->shading.light & V3D_LIGHTING_STUDIO) { + if (STUDIOLIGHT_ENABLED(wpd)) { BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n"); - if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) { - BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_WORLD\n"); - } - else { - BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_CAMERA\n"); - } + } + if (FLAT_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_FLAT\n"); + } + if (MATCAP_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_MATCAP\n"); + } + if (STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_WORLD\n"); + } + if (STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_CAMERA\n"); + } + if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) { + BLI_dynstr_appendf(ds, "#define STUDIOLIGHT_ORIENTATION_VIEWNORMAL\n"); } if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) { BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n"); @@ -79,6 +91,9 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype) if (NORMAL_ENCODING_ENABLED()) { BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n"); } + if (is_hair) { + BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n"); + } #ifdef WORKBENCH_REVEALAGE_ENABLED BLI_dynstr_appendf(ds, "#define WORKBENCH_REVEALAGE_ENABLED\n"); @@ -91,7 +106,6 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype) uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template) { - /* TODO: make a C-string with settings and hash the string */ uint input[4]; uint result; float *color = material_template->material_data.diffuse_color; @@ -115,19 +129,24 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template) return result; } -int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype) +int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair) { - const int DRAWOPTIONS_MASK = V3D_SHADING_OBJECT_OUTLINE | V3D_SHADING_SHADOW | V3D_SHADING_SPECULAR_HIGHLIGHT; - int index = (wpd->shading.flag & DRAWOPTIONS_MASK); - index = (index << 2) + wpd->shading.light; - index = (index << 2); - /* set the drawtype flag - 0 = OB_SOLID, - 1 = OB_TEXTURE - 2 = STUDIOLIGHT_ORIENTATION_WORLD - */ - SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD, 2); - SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1); + /* NOTE: change MAX_SHADERS accordingly when modifying this function. */ + int index = 0; + /* 1 bit OB_SOLID and OB_TEXTURE */ + SET_FLAG_FROM_TEST(index, drawtype == OB_TEXTURE, 1 << 0); + /* 2 bits FLAT/STUDIO/MATCAP/SCENE */ + SET_FLAG_FROM_TEST(index, wpd->shading.light, wpd->shading.light << 1); + /* 1 bit V3D_SHADING_SPECULAR_HIGHLIGHT */ + SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT, 1 << 3); + SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SHADOW, 1 << 4); + SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_CAVITY, 1 << 5); + SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE, 1 << 6); + /* 2 bits STUDIOLIGHT_ORIENTATION */ + SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD, 1 << 7); + SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL, 1 << 8); + /* 1 bit for hair */ + SET_FLAG_FROM_TEST(index, is_hair, 1 << 9); return index; } |