[Bf-blender-cvs] [7e457b1] opensubdiv-modifier: OpenSubdiv: Fix crash when drawing mesh without faces

Sergey Sharybin noreply at git.blender.org
Thu Jul 17 20:11:35 CEST 2014


Commit: 7e457b113f59797ec8de342f6d34ca8464a25fd6
Author: Sergey Sharybin
Date:   Thu Jul 17 15:06:16 2014 +0600
https://developer.blender.org/rB7e457b113f59797ec8de342f6d34ca8464a25fd6

OpenSubdiv: Fix crash when drawing mesh without faces

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

M	source/blender/blenkernel/intern/CCGSubSurf.c
M	source/blender/blenkernel/intern/CCGSubSurf.h
M	source/blender/blenkernel/intern/subsurf_ccg.c

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

diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 32df69d..e277a60 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2314,10 +2314,15 @@ static void ccgSubSurf__updateGLMeshCoords(CCGSubSurf *ss)
 	MEM_freeN(positions);
 }
 
-void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss)
+bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss)
 {
 	int compute_type;
 
+	/* Happens for meshes without faces. */
+	if (UNLIKELY(ss->osd_evaluator == NULL)) {
+		return false;
+	}
+
 	switch (U.opensubdiv_compute_type) {
 #define CHECK_COMPUTE_TYPE(type) \
 		case USER_OPENSUBDIV_COMPUTE_ ## type: \
@@ -2355,7 +2360,7 @@ void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss)
 
 		if (UNLIKELY(ss->osd_mesh == NULL)) {
 			/* Most likely compute device is not available. */
-			return;
+			return false;
 		}
 
 		ccgSubSurf__updateGLMeshCoords(ss);
@@ -2395,6 +2400,8 @@ void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss)
 	}
 
 	openSubdiv_osdGLMeshDisplayPrepare();
+
+	return true;
 }
 
 void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads,
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 28062ff..e962b4d 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -187,7 +187,7 @@ void				ccgFaceIterator_next		(CCGFaceIterator *fi);
 void				ccgFaceIterator_free		(CCGFaceIterator *fi);
 
 #ifdef WITH_OPENSUBDIV
-void ccgSubSurf_prepareGLMesh(CCGSubSurf *ss);
+bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss);
 void ccgSubSurf_drawGLMesh(CCGSubSurf *ss, bool fill_quads,
                            int start_partition, int num_partitions);
 void ccgSubSurf_setSkipGrids(CCGSubSurf *ss, bool skip_grids);
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 32ec038..375af90 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1665,8 +1665,9 @@ static void ccgDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEd
 #ifdef WITH_OPENSUBDIV
 	if (ccgdm->useGpuBackend) {
 		/* TODO(sergey): We currently only support all edges drawing. */
-		ccgSubSurf_prepareGLMesh(ss);
-		ccgSubSurf_drawGLMesh(ss, false, -1, -1);
+		if (ccgSubSurf_prepareGLMesh(ss)) {
+			ccgSubSurf_drawGLMesh(ss, false, -1, -1);
+		}
 		return;
 	}
 #endif
@@ -1792,7 +1793,9 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
 		int i, matnr = -1, shademodel = -1;
 		CCGFaceIterator *fi;
 		int start_partition = 0, num_partitions = 0;
-		ccgSubSurf_prepareGLMesh(ss);
+		if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss) == false)) {
+			return;
+		}
 
 		for (fi = ccgSubSurf_getFaceIterator(ss), i = 0;
 		     !ccgFaceIterator_isStopped(fi);
@@ -2041,7 +2044,9 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm,
 	if (ccgdm->useGpuBackend) {
 		int i, matnr = -1, shademodel = -1;
 		CCGFaceIterator *fi;
-		ccgSubSurf_prepareGLMesh(ss);
+		if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss) == false)) {
+			return;
+		}
 		do_draw = 0;
 		for (fi = ccgSubSurf_getFaceIterator(ss), i = 0;
 		     !ccgFaceIterator_isStopped(fi);
@@ -2448,8 +2453,9 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
 		if (drawParams != NULL)
 			drawParams(&tmp_tf, (mcol != NULL), mat_nr);
 
-		ccgSubSurf_prepareGLMesh(ss);
-		ccgSubSurf_drawGLMesh(ss, true, -1, -1);
+		if (ccgSubSurf_prepareGLMesh(ss)) {
+			ccgSubSurf_drawGLMesh(ss, true, -1, -1);
+		}
 		return;
 	}
 #endif




More information about the Bf-blender-cvs mailing list