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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to