Revision: 42028
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42028
Author:   lukastoenne
Date:     2011-11-21 11:46:05 +0000 (Mon, 21 Nov 2011)
Log Message:
-----------
Yet another fix for crashes when drawing empty base mesh with constructive 
modifier. This crashed with ocean modifier (#29241). The previous fix was to 
avoid drawing mapped faces altogether for empty edit mesh, but that also 
disables the actual derived mesh display (#29346).

The real reason for this crash is that ocean modifier (in generative setting) 
does not properly set the derived mesh face ORIGINDEX data to ORIGINDEX_NONE. 
With this the previous fixes are not necessary.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/modifiers/intern/MOD_ocean.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2011-11-21 11:27:43 UTC (rev 42027)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c      
2011-11-21 11:46:05 UTC (rev 42028)
@@ -2735,35 +2735,29 @@
        if(dt>OB_WIRE) {
                if(CHECK_OB_DRAWTEXTURE(v3d, dt)) {
                        if(draw_glsl_material(scene, ob, v3d, dt)) {
-                               /* if em has no faces the drawMappedFaces 
callback will fail */
-                               if(em->faces.first) {
-                                       
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
-
-                                       finalDM->drawMappedFacesGLSL(finalDM, 
GPU_enable_material,
-                                                                               
                 draw_em_fancy__setGLSLFaceOpts, NULL);
-                                       GPU_disable_material();
-
-                                       glFrontFace(GL_CCW);
-                               }
+                               
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+                               
+                               finalDM->drawMappedFacesGLSL(finalDM, 
GPU_enable_material,
+                                                            
draw_em_fancy__setGLSLFaceOpts, NULL);
+                               GPU_disable_material();
+                               
+                               glFrontFace(GL_CCW);
                        }
                        else {
                                draw_mesh_textured(scene, v3d, rv3d, ob, 
finalDM, 0);
                        }
                }
                else {
-                       /* if em has no faces the drawMappedFaces callback will 
fail */
-                       if(em->faces.first) {
-                               /* 3 floats for position, 3 for normal and 
times two because the faces may actually be quads instead of triangles */
-                               glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag 
& ME_TWOSIDED);
-
-                               glEnable(GL_LIGHTING);
-                               
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
-
-                               finalDM->drawMappedFaces(finalDM, 
draw_em_fancy__setFaceOpts, NULL, 0, GPU_enable_material, NULL);
-
-                               glFrontFace(GL_CCW);
-                               glDisable(GL_LIGHTING);
-                       }
+                       /* 3 floats for position, 3 for normal and times two 
because the faces may actually be quads instead of triangles */
+                       glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & 
ME_TWOSIDED);
+                       
+                       glEnable(GL_LIGHTING);
+                       glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+                       
+                       finalDM->drawMappedFaces(finalDM, 
draw_em_fancy__setFaceOpts, NULL, 0, GPU_enable_material, NULL);
+                       
+                       glFrontFace(GL_CCW);
+                       glDisable(GL_LIGHTING);
                }
                        
                // Setup for drawing wire over, disable zbuffer

Modified: trunk/blender/source/blender/modifiers/intern/MOD_ocean.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_ocean.c   2011-11-21 
11:27:43 UTC (rev 42027)
+++ trunk/blender/source/blender/modifiers/intern/MOD_ocean.c   2011-11-21 
11:46:05 UTC (rev 42028)
@@ -277,6 +277,7 @@
        MVert *mv;
        MFace *mf;
        MTFace *tf;
+       int *origindex;
 
        int cdlayer;
 
@@ -305,6 +306,7 @@
 
        mv = CDDM_get_verts(result);
        mf = CDDM_get_faces(result);
+       origindex= result->getFaceDataArray(result, CD_ORIGINDEX);
 
        /* create vertices */
        #pragma omp parallel for private(x, y) if (rx > OMP_MIN_RES)
@@ -329,6 +331,9 @@
                        mf[fi].v4 = vi + res_x+1;
 
                        mf[fi].flag |= ME_SMOOTH;
+
+                       /* generated geometry does not map to original faces */
+                       origindex[fi] = ORIGINDEX_NONE;
                }
        }
 

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

Reply via email to