Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/workbench/workbench_materials.c
| Show All 35 Lines | |||||
| #include "ED_uvedit.h" | #include "ED_uvedit.h" | ||||
| #define HSV_SATURATION 0.5 | #define HSV_SATURATION 0.5 | ||||
| #define HSV_VALUE 0.8 | #define HSV_VALUE 0.8 | ||||
| void workbench_material_update_data(WORKBENCH_PrivateData *wpd, | void workbench_material_update_data(WORKBENCH_PrivateData *wpd, | ||||
| Object *ob, | Object *ob, | ||||
| Material *mat, | Material *mat, | ||||
| WORKBENCH_MaterialData *data) | WORKBENCH_MaterialData *data, | ||||
| int color_type) | |||||
| { | { | ||||
| /* When V3D_SHADING_TEXTURE_COLOR is active, use V3D_SHADING_MATERIAL_COLOR as fallback when no | |||||
| * texture could be determined */ | |||||
| int color_type = wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR ? | |||||
| V3D_SHADING_MATERIAL_COLOR : | |||||
| wpd->shading.color_type; | |||||
| copy_v3_fl3(data->diffuse_color, 0.8f, 0.8f, 0.8f); | copy_v3_fl3(data->diffuse_color, 0.8f, 0.8f, 0.8f); | ||||
| copy_v3_v3(data->base_color, data->diffuse_color); | copy_v3_v3(data->base_color, data->diffuse_color); | ||||
| copy_v3_fl3(data->specular_color, 0.05f, 0.05f, 0.05f); /* Dielectric: 5% reflective. */ | copy_v3_fl3(data->specular_color, 0.05f, 0.05f, 0.05f); /* Dielectric: 5% reflective. */ | ||||
| data->metallic = 0.0f; | data->metallic = 0.0f; | ||||
| data->roughness = 0.632455532f; /* sqrtf(0.4f); */ | data->roughness = 0.632455532f; /* sqrtf(0.4f); */ | ||||
| data->alpha = wpd->shading.xray_alpha; | data->alpha = wpd->shading.xray_alpha; | ||||
| if (color_type == V3D_SHADING_SINGLE_COLOR) { | if (color_type == V3D_SHADING_SINGLE_COLOR) { | ||||
| copy_v3_v3(data->diffuse_color, wpd->shading.single_color); | copy_v3_v3(data->diffuse_color, wpd->shading.single_color); | ||||
| copy_v3_v3(data->base_color, data->diffuse_color); | copy_v3_v3(data->base_color, data->diffuse_color); | ||||
| } | } | ||||
| else if (color_type == V3D_SHADING_ERROR_COLOR) { | |||||
| copy_v3_fl3(data->diffuse_color, 0.8, 0.0, 0.8); | |||||
| copy_v3_v3(data->base_color, data->diffuse_color); | |||||
| } | |||||
| else if (color_type == V3D_SHADING_RANDOM_COLOR) { | else if (color_type == V3D_SHADING_RANDOM_COLOR) { | ||||
| uint hash = BLI_ghashutil_strhash_p_murmur(ob->id.name); | uint hash = BLI_ghashutil_strhash_p_murmur(ob->id.name); | ||||
| if (ob->id.lib) { | if (ob->id.lib) { | ||||
| hash = (hash * 13) ^ BLI_ghashutil_strhash_p_murmur(ob->id.lib->name); | hash = (hash * 13) ^ BLI_ghashutil_strhash_p_murmur(ob->id.lib->name); | ||||
| } | } | ||||
| float hue = BLI_hash_int_01(hash); | float hue = BLI_hash_int_01(hash); | ||||
| float hsv[3] = {hue, HSV_SATURATION, HSV_VALUE}; | float hsv[3] = {hue, HSV_SATURATION, HSV_VALUE}; | ||||
| hsv_to_rgb_v(hsv, data->diffuse_color); | hsv_to_rgb_v(hsv, data->diffuse_color); | ||||
| copy_v3_v3(data->base_color, data->diffuse_color); | copy_v3_v3(data->base_color, data->diffuse_color); | ||||
| } | } | ||||
| else if (ELEM(color_type, V3D_SHADING_OBJECT_COLOR, V3D_SHADING_VERTEX_COLOR)) { | else if (ELEM(color_type, V3D_SHADING_OBJECT_COLOR, V3D_SHADING_VERTEX_COLOR)) { | ||||
| copy_v3_v3(data->diffuse_color, ob->color); | copy_v3_v3(data->diffuse_color, ob->color); | ||||
| copy_v3_v3(data->base_color, data->diffuse_color); | copy_v3_v3(data->base_color, data->diffuse_color); | ||||
| data->alpha *= ob->color[3]; | data->alpha *= ob->color[3]; | ||||
| } | } | ||||
| else { | else { | ||||
| /* V3D_SHADING_MATERIAL_COLOR */ | /* V3D_SHADING_MATERIAL_COLOR or V3D_SHADING_TEXTURE_COLOR */ | ||||
| if (mat) { | if (mat) { | ||||
| data->alpha *= mat->a; | data->alpha *= mat->a; | ||||
| if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) { | if (SPECULAR_HIGHLIGHT_ENABLED(wpd)) { | ||||
| copy_v3_v3(data->base_color, &mat->r); | copy_v3_v3(data->base_color, &mat->r); | ||||
| mul_v3_v3fl(data->diffuse_color, &mat->r, 1.0f - mat->metallic); | mul_v3_v3fl(data->diffuse_color, &mat->r, 1.0f - mat->metallic); | ||||
| mul_v3_v3fl(data->specular_color, &mat->r, mat->metallic); | mul_v3_v3fl(data->specular_color, &mat->r, mat->metallic); | ||||
| add_v3_fl(data->specular_color, 0.05f * (1.0f - mat->metallic)); | add_v3_fl(data->specular_color, 0.05f * (1.0f - mat->metallic)); | ||||
| data->metallic = mat->metallic; | data->metallic = mat->metallic; | ||||
| data->roughness = sqrtf(mat->roughness); /* Remap to disney roughness. */ | data->roughness = sqrtf(mat->roughness); /* Remap to disney roughness. */ | ||||
| } | } | ||||
| else { | else { | ||||
| copy_v3_v3(data->base_color, &mat->r); | copy_v3_v3(data->base_color, &mat->r); | ||||
| copy_v3_v3(data->diffuse_color, &mat->r); | copy_v3_v3(data->diffuse_color, &mat->r); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, | char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, | ||||
| bool is_uniform_color, | bool is_uniform_color, | ||||
| bool is_hair) | bool is_hair, | ||||
| bool is_texture_painting) | |||||
| { | { | ||||
| char *str = NULL; | char *str = NULL; | ||||
| bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | ||||
| bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | ||||
| !is_uniform_color; | !is_uniform_color; | ||||
| if (is_texture_painting) { | |||||
| use_textures = true; | |||||
| use_vertex_colors = false; | |||||
| } | |||||
| DynStr *ds = BLI_dynstr_new(); | DynStr *ds = BLI_dynstr_new(); | ||||
| if (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE) { | if (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE) { | ||||
| BLI_dynstr_append(ds, "#define V3D_SHADING_OBJECT_OUTLINE\n"); | BLI_dynstr_append(ds, "#define V3D_SHADING_OBJECT_OUTLINE\n"); | ||||
| } | } | ||||
| if (wpd->shading.flag & V3D_SHADING_SHADOW) { | if (wpd->shading.flag & V3D_SHADING_SHADOW) { | ||||
| BLI_dynstr_append(ds, "#define V3D_SHADING_SHADOW\n"); | BLI_dynstr_append(ds, "#define V3D_SHADING_SHADOW\n"); | ||||
| } | } | ||||
| Show All 10 Lines | if (FLAT_ENABLED(wpd)) { | ||||
| BLI_dynstr_append(ds, "#define V3D_LIGHTING_FLAT\n"); | BLI_dynstr_append(ds, "#define V3D_LIGHTING_FLAT\n"); | ||||
| } | } | ||||
| if (MATCAP_ENABLED(wpd)) { | if (MATCAP_ENABLED(wpd)) { | ||||
| BLI_dynstr_append(ds, "#define V3D_LIGHTING_MATCAP\n"); | BLI_dynstr_append(ds, "#define V3D_LIGHTING_MATCAP\n"); | ||||
| } | } | ||||
| if (OBJECT_ID_PASS_ENABLED(wpd)) { | if (OBJECT_ID_PASS_ENABLED(wpd)) { | ||||
| BLI_dynstr_append(ds, "#define OBJECT_ID_PASS_ENABLED\n"); | BLI_dynstr_append(ds, "#define OBJECT_ID_PASS_ENABLED\n"); | ||||
| } | } | ||||
| if (MATDATA_PASS_ENABLED(wpd)) { | if (workbench_is_matdata_pass_enabled(wpd)) { | ||||
| BLI_dynstr_append(ds, "#define MATDATA_PASS_ENABLED\n"); | BLI_dynstr_append(ds, "#define MATDATA_PASS_ENABLED\n"); | ||||
| } | } | ||||
| if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) { | if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) { | ||||
| BLI_dynstr_append(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n"); | BLI_dynstr_append(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n"); | ||||
| } | } | ||||
| if (use_vertex_colors) { | if (use_vertex_colors) { | ||||
| BLI_dynstr_append(ds, "#define V3D_SHADING_VERTEX_COLOR\n"); | BLI_dynstr_append(ds, "#define V3D_SHADING_VERTEX_COLOR\n"); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| /* NOTE: change MAX_COMPOSITE_SHADERS accordingly when modifying this function. */ | /* NOTE: change MAX_COMPOSITE_SHADERS accordingly when modifying this function. */ | ||||
| int index = 0; | int index = 0; | ||||
| /* 2 bits FLAT/STUDIO/MATCAP + Specular highlight */ | /* 2 bits FLAT/STUDIO/MATCAP + Specular highlight */ | ||||
| index = SPECULAR_HIGHLIGHT_ENABLED(wpd) ? 3 : wpd->shading.light; | index = SPECULAR_HIGHLIGHT_ENABLED(wpd) ? 3 : wpd->shading.light; | ||||
| SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SHADOW, 1 << 2); | SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_SHADOW, 1 << 2); | ||||
| SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_CAVITY, 1 << 3); | SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_CAVITY, 1 << 3); | ||||
| SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE, 1 << 4); | SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE, 1 << 4); | ||||
| SET_FLAG_FROM_TEST(index, MATDATA_PASS_ENABLED(wpd), 1 << 5); | SET_FLAG_FROM_TEST(index, workbench_is_matdata_pass_enabled(wpd), 1 << 5); | ||||
| BLI_assert(index < MAX_COMPOSITE_SHADERS); | BLI_assert(index < MAX_COMPOSITE_SHADERS); | ||||
| return index; | return index; | ||||
| } | } | ||||
| int workbench_material_get_prepass_shader_index(WORKBENCH_PrivateData *wpd, | int workbench_material_get_prepass_shader_index(WORKBENCH_PrivateData *wpd, | ||||
| bool is_uniform_color, | bool is_uniform_color, | ||||
| bool is_hair) | bool is_hair, | ||||
| bool is_texture_painting) | |||||
| { | { | ||||
| bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | ||||
| bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | ||||
| !is_uniform_color; | !is_uniform_color; | ||||
| if (is_texture_painting) { | |||||
| use_textures = true; | |||||
| use_vertex_colors = false; | |||||
| } | |||||
| /* NOTE: change MAX_PREPASS_SHADERS accordingly when modifying this function. */ | /* NOTE: change MAX_PREPASS_SHADERS accordingly when modifying this function. */ | ||||
| int index = 0; | int index = 0; | ||||
| SET_FLAG_FROM_TEST(index, is_hair, 1 << 0); | SET_FLAG_FROM_TEST(index, is_hair, 1 << 0); | ||||
| SET_FLAG_FROM_TEST(index, MATDATA_PASS_ENABLED(wpd), 1 << 1); | SET_FLAG_FROM_TEST(index, workbench_is_matdata_pass_enabled(wpd), 1 << 1); | ||||
| SET_FLAG_FROM_TEST(index, OBJECT_ID_PASS_ENABLED(wpd), 1 << 2); | SET_FLAG_FROM_TEST(index, OBJECT_ID_PASS_ENABLED(wpd), 1 << 2); | ||||
| SET_FLAG_FROM_TEST(index, NORMAL_VIEWPORT_PASS_ENABLED(wpd), 1 << 3); | SET_FLAG_FROM_TEST(index, NORMAL_VIEWPORT_PASS_ENABLED(wpd), 1 << 3); | ||||
| SET_FLAG_FROM_TEST(index, MATCAP_ENABLED(wpd), 1 << 4); | SET_FLAG_FROM_TEST(index, MATCAP_ENABLED(wpd), 1 << 4); | ||||
| SET_FLAG_FROM_TEST(index, use_textures, 1 << 5); | SET_FLAG_FROM_TEST(index, use_textures, 1 << 5); | ||||
| SET_FLAG_FROM_TEST(index, use_vertex_colors, 1 << 6); | SET_FLAG_FROM_TEST(index, use_vertex_colors, 1 << 6); | ||||
| BLI_assert(index < MAX_PREPASS_SHADERS); | BLI_assert(index < MAX_PREPASS_SHADERS); | ||||
| return index; | return index; | ||||
| } | } | ||||
| int workbench_material_get_accum_shader_index(WORKBENCH_PrivateData *wpd, | int workbench_material_get_accum_shader_index(WORKBENCH_PrivateData *wpd, | ||||
| bool is_uniform_color, | bool is_uniform_color, | ||||
| bool is_hair) | bool is_hair, | ||||
| bool is_texture_painting) | |||||
| { | { | ||||
| bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | bool use_textures = (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR) && !is_uniform_color; | ||||
| bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | bool use_vertex_colors = (wpd->shading.color_type == V3D_SHADING_VERTEX_COLOR) && | ||||
| !is_uniform_color; | !is_uniform_color; | ||||
| if (is_texture_painting) { | |||||
| use_textures = true; | |||||
| use_vertex_colors = false; | |||||
| is_hair = false; | |||||
| } | |||||
| /* NOTE: change MAX_ACCUM_SHADERS accordingly when modifying this function. */ | /* NOTE: change MAX_ACCUM_SHADERS accordingly when modifying this function. */ | ||||
| int index = 0; | int index = 0; | ||||
| /* 2 bits FLAT/STUDIO/MATCAP + Specular highlight */ | /* 2 bits FLAT/STUDIO/MATCAP + Specular highlight */ | ||||
| index = SPECULAR_HIGHLIGHT_ENABLED(wpd) ? 3 : wpd->shading.light; | index = SPECULAR_HIGHLIGHT_ENABLED(wpd) ? 3 : wpd->shading.light; | ||||
| SET_FLAG_FROM_TEST(index, use_textures, 1 << 2); | SET_FLAG_FROM_TEST(index, use_textures, 1 << 2); | ||||
| SET_FLAG_FROM_TEST(index, use_vertex_colors, 1 << 3); | SET_FLAG_FROM_TEST(index, use_vertex_colors, 1 << 3); | ||||
| SET_FLAG_FROM_TEST(index, is_hair, 1 << 4); | SET_FLAG_FROM_TEST(index, is_hair, 1 << 4); | ||||
| /* 1 bits SHADOWS (only facing factor) */ | /* 1 bits SHADOWS (only facing factor) */ | ||||
| Show All 12 Lines | int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, | ||||
| if ((color_type == V3D_SHADING_TEXTURE_COLOR && (ima == NULL || use_sculpt_pbvh)) || | if ((color_type == V3D_SHADING_TEXTURE_COLOR && (ima == NULL || use_sculpt_pbvh)) || | ||||
| (ob->dt < OB_TEXTURE)) { | (ob->dt < OB_TEXTURE)) { | ||||
| color_type = V3D_SHADING_MATERIAL_COLOR; | color_type = V3D_SHADING_MATERIAL_COLOR; | ||||
| } | } | ||||
| if (color_type == V3D_SHADING_VERTEX_COLOR && (me == NULL || me->mloopcol == NULL)) { | if (color_type == V3D_SHADING_VERTEX_COLOR && (me == NULL || me->mloopcol == NULL)) { | ||||
| color_type = V3D_SHADING_OBJECT_COLOR; | color_type = V3D_SHADING_OBJECT_COLOR; | ||||
| } | } | ||||
| /* Force V3D_SHADING_TEXTURE_COLOR for active object when in texture painting | |||||
| * no matter the shading color that the user has chosen, when there is no | |||||
| * texture we will render the object with the error color */ | |||||
| if (workbench_is_object_in_texture_paint_mode(ob)) { | |||||
| color_type = ima ? V3D_SHADING_TEXTURE_COLOR : V3D_SHADING_ERROR_COLOR; | |||||
| } | |||||
| return color_type; | return color_type; | ||||
| } | } | ||||
| void workbench_material_get_image_and_mat( | void workbench_material_get_image_and_mat( | ||||
| Object *ob, int mat_nr, Image **r_image, ImageUser **r_iuser, int *r_interp, Material **r_mat) | Object *ob, int mat_nr, Image **r_image, ImageUser **r_iuser, int *r_interp, Material **r_mat) | ||||
| { | { | ||||
| bNode *node; | bNode *node; | ||||
| *r_mat = give_current_material(ob, mat_nr); | *r_mat = give_current_material(ob, mat_nr); | ||||
| Show All 23 Lines | |||||
| void workbench_material_shgroup_uniform(WORKBENCH_PrivateData *wpd, | void workbench_material_shgroup_uniform(WORKBENCH_PrivateData *wpd, | ||||
| DRWShadingGroup *grp, | DRWShadingGroup *grp, | ||||
| WORKBENCH_MaterialData *material, | WORKBENCH_MaterialData *material, | ||||
| Object *ob, | Object *ob, | ||||
| const bool use_metallic, | const bool use_metallic, | ||||
| const bool deferred, | const bool deferred, | ||||
| const int interp) | const int interp) | ||||
| { | { | ||||
| if (deferred && !MATDATA_PASS_ENABLED(wpd)) { | if (deferred && !workbench_is_matdata_pass_enabled(wpd)) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (workbench_material_determine_color_type(wpd, material->ima, ob, false) == | if (workbench_material_determine_color_type(wpd, material->ima, ob, false) == | ||||
| V3D_SHADING_TEXTURE_COLOR) { | V3D_SHADING_TEXTURE_COLOR) { | ||||
| GPUTexture *tex = GPU_texture_from_blender(material->ima, material->iuser, GL_TEXTURE_2D); | GPUTexture *tex = GPU_texture_from_blender(material->ima, material->iuser, GL_TEXTURE_2D); | ||||
| DRW_shgroup_uniform_texture(grp, "image", tex); | DRW_shgroup_uniform_texture(grp, "image", tex); | ||||
| DRW_shgroup_uniform_bool_copy( | DRW_shgroup_uniform_bool_copy( | ||||
| Show All 37 Lines | |||||