From 7261d675e6aeb1b0dff2712f50df9f4da6e1d453 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 30 Jan 2018 12:40:05 +0100 Subject: [PATCH 1/3] Fix Cycles incorrect principled BSDF mixing with some parameter variatons. Spotted by Ha Hyung-jin, thanks! --- intern/cycles/kernel/closure/bsdf_microfacet.h | 4 +++- intern/cycles/kernel/osl/osl_closures.cpp | 18 ++++++++++++++++++ intern/cycles/kernel/svm/svm_closure.h | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h index 18b645e0ecb..2dd59354058 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet.h @@ -336,7 +336,9 @@ ccl_device bool bsdf_microfacet_merge(const ShaderClosure *a, const ShaderClosur (bsdf_a->ior == bsdf_b->ior) && ((bsdf_a->extra == NULL && bsdf_b->extra == NULL) || ((bsdf_a->extra && bsdf_b->extra) && - (isequal_float3(bsdf_a->extra->color, bsdf_b->extra->color)))); + (isequal_float3(bsdf_a->extra->color, bsdf_b->extra->color)) && + (isequal_float3(bsdf_a->extra->cspec0, bsdf_b->extra->cspec0)) && + (bsdf_a->extra->clearcoat == bsdf_b->extra->clearcoat))); } ccl_device int bsdf_microfacet_ggx_aniso_setup(MicrofacetBsdf *bsdf) diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index 608e856e019..c52230de86e 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -194,10 +194,12 @@ public: return NULL; } + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra = extra; bsdf->ior = 1.5f; bsdf->alpha_x = clearcoat_roughness; bsdf->alpha_y = clearcoat_roughness; + bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f); bsdf->extra->clearcoat = clearcoat; return bsdf; @@ -379,6 +381,7 @@ public: bsdf->extra = extra; bsdf->extra->color = color; bsdf->extra->cspec0 = cspec0; + bsdf->extra->clearcoat = 0.0f; return bsdf; } }; @@ -388,6 +391,8 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); + bsdf->alpha_y = bsdf->alpha_x; sd->flag |= (bsdf) ? bsdf_microfacet_ggx_fresnel_setup(bsdf, sd) : 0; } }; @@ -462,6 +467,8 @@ public: bsdf->extra = extra; bsdf->extra->color = color; + bsdf->extra->cspec0 = make_float3(0.0f, 0.0f, 0.0f); + bsdf->extra->clearcoat = 0.0f; return bsdf; } }; @@ -471,6 +478,9 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->ior = 0.0f; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); + bsdf->alpha_y = bsdf->alpha_x; sd->flag |= (bsdf) ? bsdf_microfacet_multi_ggx_setup(bsdf) : 0; } }; @@ -493,6 +503,7 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->ior = 0.0f; sd->flag |= (bsdf) ? bsdf_microfacet_multi_ggx_aniso_setup(bsdf) : 0; } }; @@ -519,6 +530,8 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); + bsdf->alpha_y = bsdf->alpha_x; sd->flag |= (bsdf) ? bsdf_microfacet_multi_ggx_glass_setup(bsdf) : 0; } }; @@ -568,6 +581,7 @@ public: bsdf->extra = extra; bsdf->extra->color = color; bsdf->extra->cspec0 = cspec0; + bsdf->extra->clearcoat = 0.0f; return bsdf; } }; @@ -577,6 +591,8 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); + bsdf->alpha_y = bsdf->alpha_x; sd->flag |= (bsdf) ? bsdf_microfacet_multi_ggx_fresnel_setup(bsdf, sd) : 0; } }; @@ -629,6 +645,8 @@ public: void setup(ShaderData *sd, int path_flag, float3 weight) { MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); + bsdf->alpha_y = bsdf->alpha_x; sd->flag |= (bsdf) ? bsdf_microfacet_multi_ggx_glass_fresnel_setup(bsdf, sd) : 0; } }; diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 5a5cf2db401..7fc96f7e47f 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -268,6 +268,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * bsdf->extra->cspec0 = (specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic; bsdf->extra->color = base_color; + bsdf->extra->clearcoat = 0.0f; /* setup bsdf */ if(distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID || roughness <= 0.075f) /* use single-scatter GGX */ @@ -306,6 +307,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * } bsdf->N = N; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra = extra; bsdf->alpha_x = refl_roughness * refl_roughness; @@ -314,6 +316,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * bsdf->extra->color = base_color; bsdf->extra->cspec0 = cspec0; + bsdf->extra->clearcoat = 0.0f; /* setup bsdf */ sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd); @@ -365,6 +368,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * bsdf->extra->color = base_color; bsdf->extra->cspec0 = cspec0; + bsdf->extra->clearcoat = 0.0f; /* setup bsdf */ sd->flag |= bsdf_microfacet_multi_ggx_glass_fresnel_setup(bsdf, sd); @@ -390,12 +394,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * } bsdf->N = clearcoat_normal; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->ior = 1.5f; bsdf->extra = extra; bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness; bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness; + bsdf->extra->color = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra->cspec0 = make_float3(0.04f, 0.04f, 0.04f); bsdf->extra->clearcoat = clearcoat; @@ -460,6 +466,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * } bsdf->N = N; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->alpha_x = param1; bsdf->alpha_y = param1; bsdf->ior = 0.0f; @@ -477,6 +484,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * bsdf->extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra)); if(bsdf->extra) { bsdf->extra->color = stack_load_float3(stack, data_node.z); + bsdf->extra->cspec0 = make_float3(0.0f, 0.0f, 0.0f); + bsdf->extra->clearcoat = 0.0f; sd->flag |= bsdf_microfacet_multi_ggx_setup(bsdf); } } @@ -498,6 +507,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * if(bsdf) { bsdf->N = N; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra = NULL; float eta = fmaxf(param2, 1e-5f); @@ -555,6 +565,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * if(bsdf) { bsdf->N = N; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra = NULL; svm_node_glass_setup(sd, bsdf, type, eta, roughness, false); } @@ -569,6 +580,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * if(bsdf) { bsdf->N = N; + bsdf->T = make_float3(0.0f, 0.0f, 0.0f); bsdf->extra = NULL; svm_node_glass_setup(sd, bsdf, type, eta, roughness, true); } @@ -603,6 +615,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * kernel_assert(stack_valid(data_node.z)); bsdf->extra->color = stack_load_float3(stack, data_node.z); + bsdf->extra->cspec0 = make_float3(0.0f, 0.0f, 0.0f); + bsdf->extra->clearcoat = 0.0f; /* setup bsdf */ sd->flag |= bsdf_microfacet_multi_ggx_glass_setup(bsdf); @@ -656,6 +670,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * bsdf->extra = (MicrofacetExtra*)closure_alloc_extra(sd, sizeof(MicrofacetExtra)); if(bsdf->extra) { bsdf->extra->color = stack_load_float3(stack, data_node.w); + bsdf->extra->cspec0 = make_float3(0.0f, 0.0f, 0.0f); + bsdf->extra->clearcoat = 0.0f; sd->flag |= bsdf_microfacet_multi_ggx_aniso_setup(bsdf); } } From 7a868d127f394e7e4e48972fe9bcbd8a3b923c7b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 30 Jan 2018 16:11:58 +0100 Subject: [PATCH 2/3] Fix blender player (tm) --- source/blenderplayer/bad_level_call_stubs/stubs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 98ef7a1a6ee..1a1d813a995 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -486,7 +486,7 @@ void ED_view3d_background_image_remove(struct View3D *v3d, struct BGpic *bgpic) void ED_view3d_background_image_clear(struct View3D *v3d) RET_NONE void ED_view3d_update_viewmat(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, float viewmat[4][4], float winmat[4][4], const struct rcti *rect) RET_NONE float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit) RET_ZERO -void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct View3D *v3d, struct ScrArea *sa) RET_NONE +void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa) RET_NONE void ED_node_shader_default(const struct bContext *C, struct ID *id) RET_NONE void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh) RET_NONE struct bScreen *ED_screen_animation_playing(const struct wmWindowManager *wm) RET_NULL From 87608e66e174068f9471619a5fe153fd279c4947 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 31 Jan 2018 19:02:43 +1100 Subject: [PATCH 3/3] WM: correct comment, variable name for addons --- source/blender/makesdna/DNA_userdef_types.h | 1 - source/blender/makesrna/intern/rna_userdef.c | 14 ++++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index e590e04fc6d..a7759a1d143 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -402,7 +402,6 @@ typedef struct bTheme { #define UI_THEMESPACE_START(btheme) (CHECK_TYPE_INLINE(btheme, bTheme *), &((btheme)->tbuts)) #define UI_THEMESPACE_END(btheme) (CHECK_TYPE_INLINE(btheme, bTheme *), (&((btheme)->tclip) + 1)) -/* for the moment only the name. may want to store options with this later */ typedef struct bAddon { struct bAddon *next, *prev; char module[64]; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index c66ac26f928..489a841fb0b 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -401,15 +401,17 @@ static void rna_userdef_autosave_update(Main *bmain, Scene *scene, PointerRNA *p static bAddon *rna_userdef_addon_new(void) { + ListBase *addons_list = &U.addons; bAddon *bext = MEM_callocN(sizeof(bAddon), "bAddon"); - BLI_addtail(&U.addons, bext); + BLI_addtail(addons_list, bext); return bext; } -static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *path_cmp_ptr) +static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *bext_ptr) { - bAddon *bext = path_cmp_ptr->data; - if (BLI_findindex(&U.addons, bext) == -1) { + ListBase *addons_list = &U.addons; + bAddon *bext = bext_ptr->data; + if (BLI_findindex(addons_list, bext) == -1) { BKE_report(reports, RPT_ERROR, "Add-on is no longer valid"); return; } @@ -419,8 +421,8 @@ static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *path_cmp_p MEM_freeN(bext->prop); } - BLI_freelinkN(&U.addons, bext); - RNA_POINTER_INVALIDATE(path_cmp_ptr); + BLI_freelinkN(addons_list, bext); + RNA_POINTER_INVALIDATE(bext_ptr); } static bPathCompare *rna_userdef_pathcompare_new(void)