[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