diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-08-01 16:43:57 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-08-01 19:42:59 +0300 |
commit | 4fe14d6a26e101a32e6a0ec9722248d215287a9d (patch) | |
tree | f8ace27ca928a36f2e1fad8d2603324878772b0a /source/blender/blenkernel/intern/subdiv.c | |
parent | 63058490a3da932d2c9224aa4555f23eebb77264 (diff) |
Subsurf: Support subdivision of mesh with just loose elements
Diffstat (limited to 'source/blender/blenkernel/intern/subdiv.c')
-rw-r--r-- | source/blender/blenkernel/intern/subdiv.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/subdiv.c b/source/blender/blenkernel/intern/subdiv.c index d8e0c517d91..bae5491c079 100644 --- a/source/blender/blenkernel/intern/subdiv.c +++ b/source/blender/blenkernel/intern/subdiv.c @@ -29,6 +29,8 @@ #include "BKE_subdiv.h" +#include "DNA_mesh_types.h" + #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" @@ -52,11 +54,18 @@ Subdiv *BKE_subdiv_new_from_converter(const SubdivSettings *settings, OpenSubdiv_TopologyRefinerSettings topology_refiner_settings; topology_refiner_settings.level = settings->level; topology_refiner_settings.is_adaptive = settings->is_adaptive; - struct OpenSubdiv_TopologyRefiner *osd_topology_refiner = - openSubdiv_createTopologyRefinerFromConverter( - converter, &topology_refiner_settings); - if (osd_topology_refiner == NULL) { - return NULL; + struct OpenSubdiv_TopologyRefiner *osd_topology_refiner = NULL; + if (converter->getNumVertices(converter) != 0) { + osd_topology_refiner = + openSubdiv_createTopologyRefinerFromConverter( + converter, &topology_refiner_settings); + + } + else { + /* TODO(sergey): Check whether original geometry had any vertices. + * The thing here is: OpenSubdiv can only deal with faces, but our + * side of subdiv also deals with loose vertices and edges. + */ } Subdiv *subdiv = MEM_callocN(sizeof(Subdiv), "subdiv from converetr"); subdiv->settings = *settings; @@ -75,6 +84,9 @@ Subdiv *BKE_subdiv_new_from_mesh(const SubdivSettings *settings, struct Mesh *mesh) { #ifdef WITH_OPENSUBDIV + if (mesh->totvert == 0) { + return NULL; + } OpenSubdiv_Converter converter; BKE_subdiv_converter_init_for_mesh(&converter, settings, mesh); Subdiv *subdiv = BKE_subdiv_new_from_converter(settings, &converter); |