diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-09-05 18:08:09 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-09-05 18:08:09 +0300 |
commit | 922aefba25c35be8e3696d0ebc3637d769755cae (patch) | |
tree | c8ef56a3473fea395af85889da75745e80b0d467 | |
parent | a31eca3fdd0d2e18b73f180b87a4c77ac5a8da78 (diff) |
OpenSubdiv: Fix missing ORCO when enabling OSD but having dependency to the geometry
Was causing huge viewport lags.
Reported by angavrilov in IRC, thanks!
Safe and nice for 2.78.
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index ad3c4f81438..5f759c61bcb 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -80,6 +80,7 @@ static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm); #include "GPU_shader.h" #ifdef WITH_OPENSUBDIV +# include "BKE_depsgraph.h" # include "DNA_userdef_types.h" #endif @@ -2566,7 +2567,7 @@ static void editbmesh_calc_modifiers( * playback performance is kept as high as possible. */ static bool calc_modifiers_skip_orco(Scene *scene, - const Object *ob, + Object *ob, bool use_render_params) { ModifierData *last_md = ob->modifiers.last; @@ -2575,9 +2576,18 @@ static bool calc_modifiers_skip_orco(Scene *scene, last_md->type == eModifierType_Subsurf && modifier_isEnabled(scene, last_md, required_mode)) { + if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) { + return false; + } + else if ((ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) { + return false; + } + else if ((DAG_get_eval_flags_for_object(scene, ob) & DAG_EVAL_NEED_CPU) != 0) { + return false; + } SubsurfModifierData *smd = (SubsurfModifierData *)last_md; /* TODO(sergey): Deduplicate this with checks from subsurf_ccg.c. */ - return smd->use_opensubdiv && U.opensubdiv_compute_type != USER_OPENSUBDIV_COMPUTE_NONE; + return smd->use_opensubdiv != 0; } return false; } |