From f827e3c84bc9ec585d16a796b614f4b1694e4507 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 13 Sep 2018 11:29:08 +0200 Subject: Subdiv: Cache Subdiv in CCG surface Allows to do re-shaping easier, since we will know for sure what was the limit surface the CCG is created for. --- source/blender/blenkernel/BKE_subdiv_ccg.h | 15 ++++++++++++++- source/blender/blenkernel/intern/subdiv_ccg.c | 4 ++++ source/blender/modifiers/intern/MOD_multires.c | 8 +++++--- 3 files changed, 23 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_subdiv_ccg.h b/source/blender/blenkernel/BKE_subdiv_ccg.h index 8f8a605d309..59a31e158cc 100644 --- a/source/blender/blenkernel/BKE_subdiv_ccg.h +++ b/source/blender/blenkernel/BKE_subdiv_ccg.h @@ -57,6 +57,12 @@ typedef struct SubdivToCCGSettings { /* Representation of subdivision surface which uses CCG grids. */ typedef struct SubdivCCG { + /* This is a subdivision surface this CCG was created for. + * + * TODO(sergey): Make sure the whole descriptor is valid, including all the + * displacement attached to the surface. + */ + struct Subdiv *subdiv; /* A level at which geometry was subdivided. This is what defines grid * resolution. It is NOT the topology refinement level. */ @@ -110,7 +116,14 @@ typedef struct SubdivCCG { */ } SubdivCCG; -/* Create real hi-res CCG from subdivision. */ +/* Create real hi-res CCG from subdivision. + * + * NOTE: CCG becomes an owner of subdiv. + * + * TODO(sergey): Allow some user-counter or more explicit control over who owns + * the Subdiv. The goal should be to allow viewport GL Mesh and CCG to share + * same Subsurf without conflicts. + */ struct SubdivCCG *BKE_subdiv_to_ccg( struct Subdiv *subdiv, const SubdivToCCGSettings *settings, diff --git a/source/blender/blenkernel/intern/subdiv_ccg.c b/source/blender/blenkernel/intern/subdiv_ccg.c index 9f44ce0d090..505d215e7e9 100644 --- a/source/blender/blenkernel/intern/subdiv_ccg.c +++ b/source/blender/blenkernel/intern/subdiv_ccg.c @@ -331,6 +331,7 @@ SubdivCCG *BKE_subdiv_to_ccg( return NULL; } BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG); + subdiv_ccg->subdiv = subdiv; return subdiv_ccg; } @@ -364,6 +365,9 @@ void BKE_subdiv_ccg_destroy(SubdivCCG *subdiv_ccg) } MEM_freeN(subdiv_ccg->grid_hidden); } + if (subdiv_ccg->subdiv != NULL) { + BKE_subdiv_free(subdiv_ccg->subdiv); + } MEM_freeN(subdiv_ccg); } diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index bf0086903b8..ca62560caa8 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -227,14 +227,16 @@ static Mesh *applyModifier_subdiv(ModifierData *md, * still missing in implementation. */ if ((ctx->object->mode & OB_MODE_SCULPT) && G.debug_value == 128) { + /* NOTE: CCG takes ownership over Subdiv. */ result = multires_as_ccg(mmd, ctx, mesh, subdiv); + // BKE_subdiv_stats_print(&subdiv->stats); } else { result = multires_as_mesh(mmd, ctx, mesh, subdiv); + /* TODO(sergey): Cache subdiv somehow. */ + // BKE_subdiv_stats_print(&subdiv->stats); + BKE_subdiv_free(subdiv); } - /* TODO(sergey): Cache subdiv somehow. */ - // BKE_subdiv_stats_print(&subdiv->stats); - BKE_subdiv_free(subdiv); return result; } #endif -- cgit v1.2.3