diff options
Diffstat (limited to 'source/blender/draw/engines')
16 files changed, 164 insertions, 176 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index d7c6684f086..d2400b8b651 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -128,16 +128,9 @@ static void eevee_cache_populate(void *vedata, Object *ob) EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure(); const DRWContextState *draw_ctx = DRW_context_state_get(); - const bool is_active = (ob == draw_ctx->obact); bool cast_shadow = false; - if (is_active) { - if (DRW_object_is_mode_shade(ob) == true) { - return; - } - } - - if (ob->base_flag & BASE_VISIBLED) { + if (ob->base_flag & BASE_VISIBLE) { EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c index 806fb65b8e8..e083c9b5eb5 100644 --- a/source/blender/draw/engines/eevee/eevee_lookdev.c +++ b/source/blender/draw/engines/eevee/eevee_lookdev.c @@ -45,7 +45,7 @@ void EEVEE_lookdev_cache_init( StudioLight *sl = BKE_studiolight_find(v3d->shading.studio_light, STUDIOLIGHT_INTERNAL | STUDIOLIGHT_ORIENTATION_WORLD); if ((sl->flag & STUDIOLIGHT_ORIENTATION_WORLD)) { struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); - GPUTexture *tex; + GPUTexture *tex = NULL; *grp = DRW_shgroup_create(shader, pass); axis_angle_to_mat3_single(stl->g_data->studiolight_matrix, 'Z', v3d->shading.studiolight_rot_z); @@ -59,15 +59,18 @@ void EEVEE_lookdev_cache_init( if (!pinfo) { /* Do not fadeout when doing probe rendering, only when drawing the background */ DRW_shgroup_uniform_float(*grp, "studioLightBackground", &v3d->shading.studiolight_background, 1); - - BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_GPUTEXTURE); - tex = sl->equirectangular_irradiance_gputexture; + if (v3d->shading.studiolight_background > 0.0f) { + BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_IRRADIANCE_GPUTEXTURE); + tex = sl->equirectangular_irradiance_gputexture; + } } else { BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE); tex = sl->equirectangular_radiance_gputexture; } - DRW_shgroup_uniform_texture(*grp, "image", tex); + if (tex != NULL) { + DRW_shgroup_uniform_texture(*grp, "image", tex); + } /* Do we need to recalc the lightprobes? */ if (pinfo && diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 1a5c26f1c31..5cc20adf961 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1014,7 +1014,7 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } { - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CLIP_PLANES | DRW_STATE_WIRE; + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_CLIP_PLANES | DRW_STATE_WIRE; psl->material_pass = DRW_pass_create("Material Shader Pass", state); } diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index d24551976f9..c650a6945ac 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -145,7 +145,7 @@ void EEVEE_render_cache( RE_engine_update_stats(engine, NULL, info); bool cast_shadow = false; - if (ob->base_flag & BASE_VISIBLED) { + if (ob->base_flag & BASE_VISIBLE) { EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow); } 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_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl index 4a1d88c29c1..c72df6b677d 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 @@ -106,7 +106,7 @@ void main() #endif #ifdef V3D_SHADING_SHADOW - float light_factor = -dot(normal_viewport, world_data.light_direction_vs.xyz); + float light_factor = -dot(normal_viewport, world_data.lights[0].light_direction_vs.xyz); /* The step function might be ok for meshes but it's * clearly not the case for hairs. Do smoothstep in this case. */ float shadow_mix = (diffuse_color.a == 1.0 || diffuse_color.a == 0.0) 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 4a7d195a56a..1b3737193b0 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 @@ -1,4 +1,4 @@ -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR uniform sampler2D image; #endif uniform mat4 ProjectionMatrix; @@ -10,7 +10,7 @@ uniform vec4 viewvecs[3]; #ifdef NORMAL_VIEWPORT_PASS_ENABLED in vec3 normal_viewport; #endif /* NORMAL_VIEWPORT_PASS_ENABLED */ -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR in vec2 uv_interp; #endif #ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL @@ -32,12 +32,12 @@ void main() { vec4 diffuse_color; vec3 diffuse_light = vec3(1.0); -#ifdef OB_SOLID - diffuse_color = material_data.diffuse_color; -#endif /* OB_SOLID */ -#ifdef OB_TEXTURE + +#ifdef V3D_SHADING_TEXTURE_COLOR diffuse_color = texture(image, uv_interp); -#endif /* OB_TEXTURE */ +#else + diffuse_color = material_data.diffuse_color; +#endif /* V3D_SHADING_TEXTURE_COLOR */ vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize; vec3 I_vs = view_vector_from_screen_uv(uv_viewport, viewvecs, ProjectionMatrix); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl index 200850e3036..6aeb912377c 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl @@ -4,7 +4,7 @@ layout(std140) uniform material_block { MaterialData material_data; }; -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR uniform sampler2D image; #endif @@ -12,9 +12,9 @@ uniform sampler2D image; in vec3 normal_viewport; #endif /* NORMAL_VIEWPORT_PASS_ENABLED */ -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR in vec2 uv_interp; -#endif /* OB_TEXTURE */ +#endif /* V3D_SHADING_TEXTURE_COLOR */ #ifdef HAIR_SHADER flat in float hair_rand; @@ -40,17 +40,16 @@ void main() n = normalize(n); #endif -#ifdef OB_SOLID +#ifdef V3D_SHADING_TEXTURE_COLOR + diffuseColor = texture(image, uv_interp); +#else diffuseColor = vec4(material_data.diffuse_color.rgb, 0.0); # ifdef STUDIOLIGHT_ORIENTATION_VIEWNORMAL - specularColor = vec4(material_data.diffuse_color.rgb, 0.0); + # endif -#endif /* OB_SOLID */ +#endif /* V3D_SHADING_TEXTURE_COLOR */ -#ifdef OB_TEXTURE - diffuseColor = texture(image, uv_interp); -#endif /* OB_TEXTURE */ #ifdef HAIR_SHADER float hair_color_variation = hair_rand * 0.1; diffuseColor.rgb = clamp(diffuseColor.rgb - hair_color_variation, 0.0, 1.0); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl index 82443e7336b..66b529fcf5e 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl @@ -9,7 +9,7 @@ in vec3 pos; in vec3 nor; in vec2 uv; #else /* HAIR_SHADER */ -# ifdef OB_TEXTURE +# ifdef V3D_SHADING_TEXTURE_COLOR uniform samplerBuffer u; /* active texture layer */ # endif flat out float hair_rand; @@ -19,7 +19,7 @@ flat out float hair_rand; out vec3 normal_viewport; #endif -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR out vec2 uv_interp; #endif @@ -34,7 +34,7 @@ float integer_noise(int n) void main() { #ifdef HAIR_SHADER -# ifdef OB_TEXTURE +# ifdef V3D_SHADING_TEXTURE_COLOR vec2 uv = hair_get_customdata_vec2(u); # endif float time, thick_time, thickness; @@ -55,7 +55,7 @@ void main() #else gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); #endif -#ifdef OB_TEXTURE +#ifdef V3D_SHADING_TEXTURE_COLOR uv_interp = uv; #endif 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_data.c b/source/blender/draw/engines/workbench/workbench_data.c index b4a2330f173..d544e7614ab 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -15,7 +15,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd) View3D *v3d = draw_ctx->v3d; if (v3d) { wpd->shading = v3d->shading; - wpd->drawtype = v3d->drawtype; if (wpd->shading.light == V3D_LIGHTING_MATCAP) { wpd->studio_light = BKE_studiolight_find( wpd->shading.matcap, STUDIOLIGHT_ORIENTATION_VIEWNORMAL); @@ -30,7 +29,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd) wpd->shading.light = V3D_LIGHTING_STUDIO; wpd->shading.shadow_intensity = 0.5; copy_v3_fl(wpd->shading.single_color, 0.8f); - wpd->drawtype = OB_SOLID; wpd->studio_light = BKE_studiolight_find_first(STUDIOLIGHT_INTERNAL); } wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity; @@ -155,8 +153,7 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa copy_v3_v3(light_direction, scene->display.light_direction); negate_v3(light_direction); - - DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data); + DRW_uniformbuffer_update(wpd->world_ubo, wd); } static void workbench_private_material_free(void *data) diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 3bf7c34d5eb..4fe3e92f10c 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -49,7 +49,7 @@ /* *********** STATIC *********** */ -// #define DEBUG_SHADOW_VOLUME +/* #define DEBUG_SHADOW_VOLUME */ #ifdef DEBUG_SHADOW_VOLUME # include "draw_debug.h" @@ -76,7 +76,6 @@ static struct { struct GPUTexture *effect_buffer_tx; /* ref only, not alloced */ SceneDisplay display; /* world light direction for shadows */ - float light_direction_vs[3]; int next_object_id; float normal_world_matrix[3][3]; @@ -176,17 +175,17 @@ static char *workbench_build_cavity_frag(void) return str; } -static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair) +static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair) { if (e_data.prepass_sh_cache[index] == NULL) { - char *defines = workbench_material_build_defines(wpd, drawtype, is_hair); + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *composite_frag = workbench_build_composite_frag(wpd); char *prepass_vert = workbench_build_prepass_vert(); char *prepass_frag = workbench_build_prepass_frag(); e_data.prepass_sh_cache[index] = DRW_shader_create( prepass_vert, NULL, prepass_frag, defines); - if (drawtype == OB_SOLID && !is_hair) { + if (!use_textures && !is_hair) { e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); } MEM_freeN(prepass_vert); @@ -198,15 +197,15 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, int d static void select_deferred_shaders(WORKBENCH_PrivateData *wpd) { - int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false); - int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true); - int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false); - int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true); + int index_solid = workbench_material_get_shader_index(wpd, false, false); + int index_solid_hair = workbench_material_get_shader_index(wpd, false, true); + int index_texture = workbench_material_get_shader_index(wpd, true, false); + int index_texture_hair = workbench_material_get_shader_index(wpd, true, true); - ensure_deferred_shaders(wpd, index_solid, OB_SOLID, false); - ensure_deferred_shaders(wpd, index_solid_hair, OB_SOLID, true); - ensure_deferred_shaders(wpd, index_texture, OB_TEXTURE, false); - ensure_deferred_shaders(wpd, index_texture_hair, OB_TEXTURE, true); + ensure_deferred_shaders(wpd, index_solid, false, false); + ensure_deferred_shaders(wpd, index_solid_hair, false, true); + ensure_deferred_shaders(wpd, index_texture, true, false); + ensure_deferred_shaders(wpd, index_texture_hair, true, true); wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid]; wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair]; @@ -485,8 +484,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) WORKBENCH_PrivateData *wpd = stl->g_data; DRWShadingGroup *grp; const DRWContextState *draw_ctx = DRW_context_state_get(); - static float light_multiplier = 1.0f; - Scene *scene = draw_ctx->scene; @@ -494,9 +491,9 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) /* Deferred Mix Pass */ { workbench_private_data_get_light_direction(wpd, e_data.display.light_direction); + studiolight_update_light(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.lights[0].light_direction_vs); if (SHADOW_ENABLED(wpd)) { psl->composite_pass = DRW_pass_create( @@ -504,7 +501,7 @@ 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_float(grp, "lightMultiplier", &light_multiplier, 1); + DRW_shgroup_uniform_float_copy(grp, "lightMultiplier", 1.0f); DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1); DRW_shgroup_uniform_float(grp, "shadowShift", &scene->display.shadow_shift, 1); DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL); @@ -548,7 +545,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL); #endif - studiolight_update_light(wpd, e_data.display.light_direction); } else { psl->composite_pass = DRW_pass_create( @@ -561,7 +557,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata) } static WORKBENCH_MaterialData *get_or_create_material_data( - WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype) + WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type) { WORKBENCH_StorageList *stl = vedata->stl; WORKBENCH_PassList *psl = vedata->psl; @@ -574,7 +570,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data( /* Solid */ workbench_material_update_data(wpd, ob, mat, &material_template); material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1; - material_template.drawtype = drawtype; + material_template.color_type = color_type; material_template.ima = ima; uint hash = workbench_material_get_hash(&material_template); @@ -582,22 +578,15 @@ static WORKBENCH_MaterialData *get_or_create_material_data( if (material == NULL) { material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), __func__); material->shgrp = DRW_shgroup_create( - drawtype == OB_SOLID ? wpd->prepass_solid_sh : wpd->prepass_texture_sh, psl->prepass_pass); + color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->prepass_texture_sh: wpd->prepass_solid_sh, psl->prepass_pass); DRW_shgroup_stencil_mask(material->shgrp, 0xFF); material->object_id = material_template.object_id; copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color); copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color); material->material_data.roughness = material_template.material_data.roughness; - switch (drawtype) { - case OB_SOLID: - break; - - case OB_TEXTURE: - { - GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0); - DRW_shgroup_uniform_texture(material->shgrp, "image", tex); - break; - } + if (color_type == V3D_SHADING_TEXTURE_COLOR) { + GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0); + DRW_shgroup_uniform_texture(material->shgrp, "image", tex); } DRW_shgroup_uniform_int(material->shgrp, "object_id", &material->object_id, 1); material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data); @@ -634,19 +623,11 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o if (draw_as == PART_DRAW_PATH) { Image *image = NULL; Material *mat = give_current_material(ob, part->omat); - int mat_drawtype = OB_SOLID; + ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL); + int color_type = workbench_material_determine_color_type(wpd, image); + WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type); - if (wpd->drawtype == OB_TEXTURE) { - ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL); - /* use OB_SOLID when no texture could be determined */ - if (image) { - mat_drawtype = OB_TEXTURE; - } - } - - WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype); - - struct GPUShader *shader = (mat_drawtype == OB_SOLID) + struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR) ? wpd->prepass_solid_hair_sh : wpd->prepass_texture_hair_sh; DRWShadingGroup *shgrp = DRW_shgroup_hair_create( @@ -686,7 +667,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) const bool is_active = (ob == draw_ctx->obact); const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0; bool is_drawn = false; - if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) { + if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) { const Mesh *me = ob->data; if (me->mloopuv) { const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol)); @@ -701,12 +682,8 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) Material *mat = give_current_material(ob, i + 1); Image *image; ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL); - /* use OB_SOLID when no texture could be determined */ - int mat_drawtype = OB_SOLID; - if (image) { - mat_drawtype = OB_TEXTURE; - } - material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype); + int color_type = workbench_material_determine_color_type(wpd, image); + material = get_or_create_material_data(vedata, ob, mat, image, color_type); DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob); } is_drawn = true; @@ -716,11 +693,11 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) /* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */ if (!is_drawn) { - if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) { + if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) { /* No material split needed */ struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob); if (geom) { - material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID); + material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type); if (is_sculpt_mode) { DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); } @@ -745,7 +722,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) } Material *mat = give_current_material(ob, i + 1); - material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID); + material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR); if (is_sculpt_mode) { DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); } diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index db07f9bb6f5..9f23cd5b43b 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -144,7 +144,7 @@ static void workbench_init_object_data(ObjectEngineData *engine_data) } static WORKBENCH_MaterialData *get_or_create_material_data( - WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int drawtype) + WORKBENCH_Data *vedata, Object *ob, Material *mat, Image *ima, int color_type) { WORKBENCH_StorageList *stl = vedata->stl; WORKBENCH_PassList *psl = vedata->psl; @@ -158,7 +158,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data( /* Solid */ workbench_material_update_data(wpd, ob, mat, &material_template); material_template.object_id = OBJECT_ID_PASS_ENABLED(wpd) ? engine_object_data->object_id : 1; - material_template.drawtype = drawtype; + material_template.color_type = color_type; material_template.ima = ima; uint hash = workbench_material_get_hash(&material_template); @@ -168,7 +168,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data( /* transparent accum */ grp = DRW_shgroup_create( - drawtype == OB_SOLID ? wpd->transparent_accum_sh : wpd->transparent_accum_texture_sh, + color_type == V3D_SHADING_TEXTURE_COLOR ? wpd->transparent_accum_texture_sh: wpd->transparent_accum_sh, psl->transparent_accum_pass); DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); DRW_shgroup_uniform_float(grp, "alpha", &wpd->shading.xray_alpha, 1); @@ -178,26 +178,19 @@ static WORKBENCH_MaterialData *get_or_create_material_data( copy_v4_v4(material->material_data.diffuse_color, material_template.material_data.diffuse_color); copy_v4_v4(material->material_data.specular_color, material_template.material_data.specular_color); material->material_data.roughness = material_template.material_data.roughness; - switch (drawtype) { - case OB_SOLID: - { - if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) { - BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE); - DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture); - } - if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) { - DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1); - } - break; - } - case OB_TEXTURE: - { - GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f); - DRW_shgroup_uniform_texture(grp, "image", tex); - break; - } + if (color_type == V3D_SHADING_TEXTURE_COLOR) { + GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D, false, 0.0f); + DRW_shgroup_uniform_texture(grp, "image", tex); } + if (STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd)) { + BKE_studiolight_ensure_flag(wpd->studio_light, STUDIOLIGHT_EQUIRECTANGULAR_RADIANCE_GPUTEXTURE); + DRW_shgroup_uniform_texture(grp, "matcapImage", wpd->studio_light->equirectangular_radiance_gputexture); + } + if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) { + DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1); + } + material->material_ubo = DRW_uniformbuffer_create(sizeof(WORKBENCH_UBO_Material), &material->material_data); DRW_shgroup_uniform_block(grp, "material_block", material->material_ubo); material->shgrp = grp; @@ -211,10 +204,10 @@ static WORKBENCH_MaterialData *get_or_create_material_data( return material; } -static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int drawtype, bool is_hair) +static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair) { - if (e_data.composite_sh_cache[index] == NULL && drawtype == OB_SOLID && !is_hair) { - char *defines = workbench_material_build_defines(wpd, drawtype, is_hair); + if (e_data.composite_sh_cache[index] == NULL && !use_textures && !is_hair) { + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *composite_frag = workbench_build_forward_composite_frag(); e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); MEM_freeN(composite_frag); @@ -222,7 +215,7 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr } if (e_data.transparent_accum_sh_cache[index] == NULL) { - char *defines = workbench_material_build_defines(wpd, drawtype, is_hair); + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *transparent_accum_vert = workbench_build_forward_vert(); char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag(); e_data.transparent_accum_sh_cache[index] = DRW_shader_create( @@ -236,15 +229,15 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, int dr static void select_forward_shaders(WORKBENCH_PrivateData *wpd) { - int index_solid = workbench_material_get_shader_index(wpd, OB_SOLID, false); - int index_solid_hair = workbench_material_get_shader_index(wpd, OB_SOLID, true); - int index_texture = workbench_material_get_shader_index(wpd, OB_TEXTURE, false); - int index_texture_hair = workbench_material_get_shader_index(wpd, OB_TEXTURE, true); + int index_solid = workbench_material_get_shader_index(wpd, false, false); + int index_solid_hair = workbench_material_get_shader_index(wpd, false, true); + int index_texture = workbench_material_get_shader_index(wpd, true, false); + int index_texture_hair = workbench_material_get_shader_index(wpd, true, true); - ensure_forward_shaders(wpd, index_solid, OB_SOLID, false); - ensure_forward_shaders(wpd, index_solid_hair, OB_SOLID, true); - ensure_forward_shaders(wpd, index_texture, OB_TEXTURE, false); - ensure_forward_shaders(wpd, index_texture_hair, OB_TEXTURE, true); + ensure_forward_shaders(wpd, index_solid, false, false); + ensure_forward_shaders(wpd, index_solid_hair, false, true); + ensure_forward_shaders(wpd, index_texture, true, false); + ensure_forward_shaders(wpd, index_texture_hair, true, true); wpd->composite_sh = e_data.composite_sh_cache[index_solid]; wpd->transparent_accum_sh = e_data.transparent_accum_sh_cache[index_solid]; @@ -340,7 +333,9 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) psl->composite_pass = DRW_pass_create("Composite", state); grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass); - DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx); + if (OBJECT_ID_PASS_ENABLED(wpd)) { + DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx); + } DRW_shgroup_uniform_texture_ref(grp, "transparentAccum", &e_data.transparent_accum_tx); DRW_shgroup_uniform_texture_ref(grp, "transparentRevealage", &e_data.transparent_revealage_tx); DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); @@ -399,19 +394,11 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O if (draw_as == PART_DRAW_PATH) { Image *image = NULL; Material *mat = give_current_material(ob, part->omat); - int mat_drawtype = OB_SOLID; + ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL); + int color_type = workbench_material_determine_color_type(wpd, image); + WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, color_type); - if (wpd->drawtype == OB_TEXTURE) { - ED_object_get_active_image(ob, part->omat, &image, NULL, NULL, NULL); - /* use OB_SOLID when no texture could be determined */ - if (image) { - mat_drawtype = OB_TEXTURE; - } - } - - WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype); - - struct GPUShader *shader = (mat_drawtype == OB_SOLID) + struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR) ? wpd->transparent_accum_hair_sh : wpd->transparent_accum_texture_hair_sh; DRWShadingGroup *shgrp = DRW_shgroup_hair_create( @@ -461,14 +448,14 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) return; } + WORKBENCH_MaterialData *material; if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { const DRWContextState *draw_ctx = DRW_context_state_get(); const bool is_active = (ob == draw_ctx->obact); const bool is_sculpt_mode = is_active && (draw_ctx->object_mode & OB_MODE_SCULPT) != 0; bool is_drawn = false; - WORKBENCH_MaterialData *material = get_or_create_material_data(vedata, ob, NULL, NULL, OB_SOLID); - if (!is_sculpt_mode && wpd->drawtype == OB_TEXTURE && ELEM(ob->type, OB_MESH)) { + if (!is_sculpt_mode && TEXTURE_DRAWING_ENABLED(wpd) && ELEM(ob->type, OB_MESH)) { const Mesh *me = ob->data; if (me->mloopuv) { const int materials_len = MAX2(1, (is_sculpt_mode ? 1 : ob->totcol)); @@ -484,11 +471,16 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) Image *image; ED_object_get_active_image(ob, i + 1, &image, NULL, NULL, NULL); /* use OB_SOLID when no texture could be determined */ - int mat_drawtype = OB_SOLID; - if (image) { - mat_drawtype = OB_TEXTURE; + + int color_type = wpd->shading.color_type; + if (color_type == V3D_SHADING_TEXTURE_COLOR) { + /* use OB_SOLID when no texture could be determined */ + if (image == NULL) { + color_type = V3D_SHADING_MATERIAL_COLOR; + } } - material = get_or_create_material_data(vedata, ob, mat, image, mat_drawtype); + + material = get_or_create_material_data(vedata, ob, mat, image, color_type); DRW_shgroup_call_object_add(material->shgrp_object_outline, geom_array[i], ob); DRW_shgroup_call_object_add(material->shgrp, geom_array[i], ob); } @@ -499,10 +491,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) /* Fallback from not drawn OB_TEXTURE mode or just OB_SOLID mode */ if (!is_drawn) { - if ((wpd->shading.color_type != V3D_SHADING_MATERIAL_COLOR)) { + if (ELEM(wpd->shading.color_type, V3D_SHADING_SINGLE_COLOR, V3D_SHADING_RANDOM_COLOR)) { /* No material split needed */ struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob); if (geom) { + material = get_or_create_material_data(vedata, ob, NULL, NULL, wpd->shading.color_type); if (is_sculpt_mode) { DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat); DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); @@ -529,7 +522,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) } Material *mat = give_current_material(ob, i + 1); - material = get_or_create_material_data(vedata, ob, mat, NULL, OB_SOLID); + material = get_or_create_material_data(vedata, ob, mat, NULL, V3D_SHADING_MATERIAL_COLOR); if (is_sculpt_mode) { DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, ob->obmat); DRW_shgroup_call_sculpt_add(material->shgrp, ob, ob->obmat); diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 231d9a9582a..76599fdce99 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -9,15 +9,15 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data) { - /* 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; + /* 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; static float default_diffuse_color[] = {0.8f, 0.8f, 0.8f, 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.5f; - if (DRW_object_is_paint_mode(ob) || color_type == V3D_SHADING_SINGLE_COLOR) { + if (color_type == V3D_SHADING_SINGLE_COLOR) { copy_v3_v3(data->material_data.diffuse_color, wpd->shading.single_color); } else if (color_type == V3D_SHADING_RANDOM_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, bool is_hair) +char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair) { char *str = NULL; @@ -79,15 +79,9 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) { BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n"); } - switch (drawtype) { - case OB_SOLID: - BLI_dynstr_appendf(ds, "#define OB_SOLID\n"); - break; - case OB_TEXTURE: - BLI_dynstr_appendf(ds, "#define OB_TEXTURE\n"); - break; + if (use_textures) { + BLI_dynstr_appendf(ds, "#define V3D_SHADING_TEXTURE_COLOR\n"); } - if (NORMAL_ENCODING_ENABLED()) { BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n"); } @@ -95,6 +89,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; @@ -118,19 +123,19 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template) input[3] = (uint)(material_template->material_data.roughness * 512); result += BLI_ghashutil_uinthash_v4_murmur(input); - if (material_template->drawtype == OB_TEXTURE) { + if (material_template->color_type == V3D_SHADING_TEXTURE_COLOR) { /* add texture reference */ result += BLI_ghashutil_inthash_p_murmur(material_template->ima); } return result; } -int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair) +int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair) { /* 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); + /* 1 bit V3D_SHADING_TEXTURE_COLOR */ + SET_FLAG_FROM_TEST(index, use_textures, 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 */ @@ -160,3 +165,12 @@ void workbench_material_set_normal_world_matrix( DRW_shgroup_uniform_mat3(grp, "normalWorldMatrix", persistent_matrix); } } + +int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima) +{ + int color_type = wpd->shading.color_type; + if (color_type == V3D_SHADING_TEXTURE_COLOR && ima == NULL) { + color_type = V3D_SHADING_MATERIAL_COLOR; + } + return color_type; +} diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 9e43a5c4a48..57cfd6b4718 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -41,11 +41,10 @@ #define M_GOLDEN_RATION_CONJUGATE 0.618033988749895 #define MAX_SHADERS (1 << 10) -#define OB_SOLID_ENABLED(wpd) (wpd->drawtype & OB_SOLID) -#define OB_TEXTURE_ENABLED(wpd) (wpd->drawtype & OB_TEXTURE) +#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR) #define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT) #define STUDIOLIGHT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_STUDIO) -#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP && OB_SOLID_ENABLED(wpd)) +#define MATCAP_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_MATCAP) #define STUDIOLIGHT_ORIENTATION_WORLD_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD)) #define STUDIOLIGHT_ORIENTATION_CAMERA_ENABLED(wpd) (STUDIOLIGHT_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_CAMERA)) #define STUDIOLIGHT_ORIENTATION_VIEWNORMAL_ENABLED(wpd) (MATCAP_ENABLED(wpd) && (wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL)) @@ -57,6 +56,8 @@ #define NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) (MATCAP_ENABLED(wpd) || STUDIOLIGHT_ENABLED(wpd) || SHADOW_ENABLED(wpd) || SPECULAR_HIGHLIGHT_ENABLED(wpd)) #define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || CAVITY_ENABLED(wpd)) #define NORMAL_ENCODING_ENABLED() (true) +#define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR) + typedef struct WORKBENCH_FramebufferList { /* Deferred render buffers */ @@ -112,7 +113,7 @@ typedef struct WORKBENCH_UBO_Light { } WORKBENCH_UBO_Light; typedef struct WORKBENCH_UBO_World { - float spherical_harmonics_coefs[9][4]; + float spherical_harmonics_coefs[STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS][4]; float background_color_low[4]; float background_color_high[4]; float object_outline_color[4]; @@ -147,7 +148,7 @@ typedef struct WORKBENCH_PrivateData { View3DShading shading; StudioLight *studio_light; UserDef *user_preferences; - int drawtype; + int color_type; struct GPUUniformBuffer *world_ubo; struct DRWShadingGroup *shadow_shgrp; struct DRWShadingGroup *depth_shgrp; @@ -176,7 +177,7 @@ typedef struct WORKBENCH_MaterialData { struct GPUUniformBuffer *material_ubo; int object_id; - int drawtype; + int color_type; Image *ima; /* Linked shgroup for drawing */ @@ -228,10 +229,11 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob); void workbench_forward_cache_finish(WORKBENCH_Data *vedata); /* workbench_materials.c */ -char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair); +int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima); +char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair); void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data); uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template); -int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, int drawtype, bool is_hair); +int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair); void workbench_material_set_normal_world_matrix( DRWShadingGroup *grp, WORKBENCH_PrivateData *wpd, float persistent_matrix[3][3]); diff --git a/source/blender/draw/engines/workbench/workbench_studiolight.c b/source/blender/draw/engines/workbench/workbench_studiolight.c index e5e24cbb88a..f9e5df91388 100644 --- a/source/blender/draw/engines/workbench/workbench_studiolight.c +++ b/source/blender/draw/engines/workbench/workbench_studiolight.c @@ -34,10 +34,15 @@ void studiolight_update_world(StudioLight *sl, WORKBENCH_UBO_World *wd) { + int i; BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED); - for (int i = 0; i < 9; i++) { + + for (i = 0; i < STUDIOLIGHT_SPHERICAL_HARMONICS_COMPONENTS; i++) { copy_v3_v3(wd->spherical_harmonics_coefs[i], sl->spherical_harmonics_coefs[i]); } + for (; i < STUDIOLIGHT_SPHERICAL_HARMONICS_MAX_COMPONENTS; i++) { + copy_v3_fl(wd->spherical_harmonics_coefs[i], 0.0); + } } static void compute_parallel_lines_nor_and_dist(const float v1[2], const float v2[2], const float v3[2], float r_line[2]) @@ -121,6 +126,7 @@ static BoundBox *studiolight_object_shadow_bbox_get(WORKBENCH_PrivateData *wpd, for (int i = 0; i < 8; ++i) { mul_m4_v3(wpd->shadow_mat, oed->shadow_bbox.vec[i]); } + oed->shadow_bbox_dirty = false; } return &oed->shadow_bbox; |