[Bf-blender-cvs] [f827e3c84bc] blender2.8: Subdiv: Cache Subdiv in CCG surface

Sergey Sharybin noreply at git.blender.org
Fri Sep 14 14:44:46 CEST 2018


Commit: f827e3c84bc9ec585d16a796b614f4b1694e4507
Author: Sergey Sharybin
Date:   Thu Sep 13 11:29:08 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBf827e3c84bc9ec585d16a796b614f4b1694e4507

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.

===================================================================

M	source/blender/blenkernel/BKE_subdiv_ccg.h
M	source/blender/blenkernel/intern/subdiv_ccg.c
M	source/blender/modifiers/intern/MOD_multires.c

===================================================================

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



More information about the Bf-blender-cvs mailing list