From eb7d251cd78c5811896bc95053a33a32f6c5ed89 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 24 Jan 2018 08:24:21 +0100 Subject: Fix Cycles GLSL bump not matching final render after recent changes. --- source/blender/nodes/shader/nodes/node_shader_bump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/nodes/shader/nodes/node_shader_bump.c b/source/blender/nodes/shader/nodes/node_shader_bump.c index b39ca5d90ee..122f02eda8a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bump.c +++ b/source/blender/nodes/shader/nodes/node_shader_bump.c @@ -34,7 +34,7 @@ /* **************** BUMP ******************** */ static bNodeSocketTemplate sh_node_bump_in[] = { { SOCK_FLOAT, 1, N_("Strength"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, - { SOCK_FLOAT, 1, N_("Distance"), 0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f}, + { SOCK_FLOAT, 1, N_("Distance"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f}, { SOCK_FLOAT, 1, N_("Height"), 1.0f, 1.0f, 1.0f, 1.0f, -1000.0f, 1000.0f, PROP_NONE, SOCK_HIDE_VALUE}, { SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE}, { -1, 0, "" } -- cgit v1.2.3 From 3e20ac8df3b147624028ba1c32f66a81dd1b9b1c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 24 Jan 2018 11:03:03 +0100 Subject: Fix T53874: OpenGL render to OpenEXR not working after recent changes. Multilayer EXR also failed already in 2.79 for Sequencer and OpenGL rendering. Now we revert to single layer OpenEXR in that case. --- source/blender/render/intern/source/pipeline.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index f5577ae89ea..5a1a15d0266 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -3334,11 +3334,14 @@ bool RE_WriteRenderViewsImage(ReportList *reports, RenderResult *rr, Scene *scen BLI_strncpy(filepath, name, sizeof(filepath)); for (view_id = 0, rv = rr->views.first; rv; rv = rv->next, view_id++) { + /* Sequencer and OpenGL render can't save multiple EXR layers. */ + bool is_float = rv->rect32 == NULL; + if (!is_mono) { BKE_scene_multiview_view_filepath_get(&scene->r, filepath, rv->name, name); } - if (is_exr_rr) { + if (is_exr_rr && is_float) { ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, rv->name, -1); render_print_save_message(reports, name, ok, errno); -- cgit v1.2.3 From 9112cceb5ee9846a0e223ab7f2c632acae7f8a4d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Jan 2018 11:12:01 +0100 Subject: BKE's modifier_isEnabled: add check on NULL Scene pointer. We do not always have that one available, and even without the isDisabled callback this func is helpful. Note that this is a bot stupid, only modifier actually needing a valid Scene pointer here is subsurf... :| --- source/blender/blenkernel/intern/modifier.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 1e7c3104d17..d7a24f90dbe 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -434,6 +434,11 @@ bool modifiers_isParticleEnabled(Object *ob) return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render)); } +/** + * Check whether is enabled. + * + * \param scene Current scene, may be NULL, in which case isDisabled callback of the modifier is never called. + */ bool modifier_isEnabled(struct Scene *scene, ModifierData *md, int required_mode) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -441,7 +446,7 @@ bool modifier_isEnabled(struct Scene *scene, ModifierData *md, int required_mode md->scene = scene; if ((md->mode & required_mode) != required_mode) return false; - if (mti->isDisabled && mti->isDisabled(md, required_mode == eModifierMode_Render)) return false; + if (scene != NULL && mti->isDisabled && mti->isDisabled(md, required_mode == eModifierMode_Render)) return false; if (md->mode & eModifierMode_DisableTemporary) return false; if ((required_mode & eModifierMode_Editmode) && !(mti->flags & eModifierTypeFlag_SupportsEditmode)) return false; -- cgit v1.2.3 From ad046efa7966a0d1d201ca92ad8352ccfaed2ca3 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Jan 2018 11:13:49 +0100 Subject: Fix T53551: Weight paint crash when subsurf modifier is not first (master not 2.79). We can only support painting from subsurf DM in a limited subset of cases, others (like multiple subsurf, or topology-modyfying ones, break mapping to original geometry). This is not the most ideal fix (ideally, we should always be able to get a mapping to original geometry from any point in modifiers stack...). --- source/blender/blenkernel/intern/subsurf_ccg.c | 83 +++++++++++++++++++++----- 1 file changed, 67 insertions(+), 16 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 5d0f06e95ec..624a8975f5e 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -67,6 +67,7 @@ #include "BKE_global.h" #include "BKE_mesh.h" #include "BKE_mesh_mapping.h" +#include "BKE_modifier.h" #include "BKE_multires.h" #include "BKE_paint.h" #include "BKE_scene.h" @@ -4444,7 +4445,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm; CCGKey key; - int numGrids, grid_pbvh; + int numGrids; CCG_key_top_level(&key, ccgdm->ss); @@ -4456,35 +4457,85 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) if (!ob->sculpt) return NULL; - /* In vwpaint, we always use a grid_pbvh for multires/subsurf */ - grid_pbvh = (!(ob->mode & OB_MODE_SCULPT) || ccgDM_use_grid_pbvh(ccgdm)); + bool grid_pbvh = ccgDM_use_grid_pbvh(ccgdm); + if ((ob->mode & OB_MODE_SCULPT) == 0) { + /* In vwpaint, we may use a grid_pbvh for multires/subsurf, under certain conditions. + * More complex cases break 'history' trail back to original vertices, in that case we fall back to + * deformed cage only (i.e. original deformed mesh). */ + VirtualModifierData virtualModifierData; + ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData); + + grid_pbvh = true; + bool has_one_ccg_modifier = false; + for (; md; md = md->next) { + /* We can only accept to use this ccgdm if: + * - it's the only active ccgdm in the stack. + * - there is no topology-modifying modifier in the stack. + * Otherwise, there is no way to map back to original geometry from grid-generated PBVH. + */ + const ModifierTypeInfo *mti = modifierType_getInfo(md->type); + + if (!modifier_isEnabled(NULL, md, eModifierMode_Realtime)) { + continue; + } + if (ELEM(mti->type, eModifierTypeType_OnlyDeform, eModifierTypeType_NonGeometrical)) { + continue; + } + + if (ELEM(md->type, eModifierType_Subsurf, eModifierType_Multires)) { + if (has_one_ccg_modifier) { + /* We only allow a single active ccg modifier in the stack. */ + grid_pbvh = false; + break; + } + has_one_ccg_modifier = true; + continue; + } + + /* Any other non-deforming modifier makes it impossible to use grid pbvh. */ + grid_pbvh = false; + break; + } + } if (ob->sculpt->pbvh) { + /* Note that we have to clean up exisitng pbvh instead of updating it in case it does not match current + * grid_pbvh status. */ if (grid_pbvh) { - /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm - * but this can be freed on ccgdm release, this updates the pointers - * when the ccgdm gets remade, the assumption is that the topology - * does not change. */ - ccgdm_create_grids(dm); - BKE_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, (void **)ccgdm->gridFaces, - ccgdm->gridFlagMats, ccgdm->gridHidden); + if (BKE_pbvh_get_ccgdm(ob->sculpt->pbvh) != NULL) { + /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm + * but this can be freed on ccgdm release, this updates the pointers + * when the ccgdm gets remade, the assumption is that the topology + * does not change. */ + ccgdm_create_grids(dm); + BKE_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, (void **)ccgdm->gridFaces, + ccgdm->gridFlagMats, ccgdm->gridHidden); + } + else { + BKE_pbvh_free(ob->sculpt->pbvh); + ob->sculpt->pbvh = NULL; + } + } + else if (BKE_pbvh_get_ccgdm(ob->sculpt->pbvh) != NULL) { + BKE_pbvh_free(ob->sculpt->pbvh); + ob->sculpt->pbvh = NULL; } ccgdm->pbvh = ob->sculpt->pbvh; } if (ccgdm->pbvh) { - /* For vertex paint, keep track of ccgdm */ - if (!(ob->mode & OB_MODE_SCULPT)) { + /* For grid pbvh, keep track of ccgdm */ + if (grid_pbvh) { BKE_pbvh_set_ccgdm(ccgdm->pbvh, ccgdm); } return ccgdm->pbvh; } - /* no pbvh exists yet, we need to create one. only in case of multires + /* No pbvh exists yet, we need to create one. only in case of multires * we build a pbvh over the modified mesh, in other cases the base mesh * is being sculpted, so we build a pbvh from that. */ - /* Note: vwpaint always builds a pbvh over the modified mesh. */ + /* Note: vwpaint tries to always build a pbvh over the modified mesh. */ if (grid_pbvh) { ccgdm_create_grids(dm); @@ -4517,8 +4568,8 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) pbvh_show_mask_set(ccgdm->pbvh, ob->sculpt->show_mask); } - /* For vertex paint, keep track of ccgdm */ - if (!(ob->mode & OB_MODE_SCULPT) && ccgdm->pbvh) { + /* For grid pbvh, keep track of ccgdm. */ + if (grid_pbvh && ccgdm->pbvh) { BKE_pbvh_set_ccgdm(ccgdm->pbvh, ccgdm); } return ccgdm->pbvh; -- cgit v1.2.3 From a55a4818d664a04fa176cc54d447598ca565af8a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Jan 2018 11:17:53 +0100 Subject: Fix (unreported) missing feature in ccgdm pbvh generator. Compared to usual cddm one, ccgdm one was not applying the ob->derivedDeform deformation to the pbvh generated from the original mesh geometry, when possible. --- source/blender/blenkernel/intern/subsurf_ccg.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'source') diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 624a8975f5e..84b97f2812a 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -4561,6 +4561,18 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); BKE_pbvh_build_mesh(ccgdm->pbvh, me->mpoly, me->mloop, me->mvert, me->totvert, &me->vdata, looptri, looptris_num); + + if (ob->sculpt->modifiers_active && ob->derivedDeform != NULL) { + DerivedMesh *deformdm = ob->derivedDeform; + float (*vertCos)[3]; + int totvert; + + totvert = deformdm->getNumVerts(deformdm); + vertCos = MEM_malloc_arrayN(totvert, sizeof(float[3]), "ccgDM_getPBVH vertCos"); + deformdm->getVertCos(deformdm, vertCos); + BKE_pbvh_apply_vertCos(ccgdm->pbvh, vertCos); + MEM_freeN(vertCos); + } } if (ccgdm->pbvh != NULL) { -- cgit v1.2.3 From e68771fa8760035050f476895ebe791c4857f91b Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 24 Jan 2018 11:20:46 +0100 Subject: Cleanup: MOD_wireframe: remove useless isDisabled callback. --- source/blender/modifiers/intern/MOD_wireframe.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c index adadd4834d4..15f8b185a3d 100644 --- a/source/blender/modifiers/intern/MOD_wireframe.c +++ b/source/blender/modifiers/intern/MOD_wireframe.c @@ -52,11 +52,6 @@ static void copyData(ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); } -static bool isDisabled(ModifierData *UNUSED(md), int UNUSED(useRenderParams)) -{ - return false; -} - static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) { WireframeModifierData *wmd = (WireframeModifierData *)md; @@ -131,7 +126,7 @@ ModifierTypeInfo modifierType_Wireframe = { /* initData */ initData, /* requiredDataMask */ requiredDataMask, /* freeData */ NULL, - /* isDisabled */ isDisabled, + /* isDisabled */ NULL, /* updateDepgraph */ NULL, /* updateDepsgraph */ NULL, /* dependsOnTime */ NULL, -- cgit v1.2.3