[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57566] trunk/blender/source/blender: fix [#35795] Edge split modifier do not show result in viewport with curves.

Campbell Barton ideasman42 at gmail.com
Wed Jun 19 10:19:36 CEST 2013


Revision: 57566
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57566
Author:   campbellbarton
Date:     2013-06-19 08:19:36 +0000 (Wed, 19 Jun 2013)
Log Message:
-----------
fix [#35795] Edge split modifier do not show result in viewport with curves.

caused by recent changes in normal calculation, however curves were not being very smart about calculating modifiers (calling unneeded re-tessellation for every modifier)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2013-06-19 08:00:20 UTC (rev 57565)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2013-06-19 08:19:36 UTC (rev 57566)
@@ -976,7 +976,6 @@
 					dm = tdm;
 
 					CDDM_apply_vert_coords(dm, vertCos);
-					CDDM_calc_normals_mapping(dm);
 				}
 			}
 			else {
@@ -989,8 +988,6 @@
 				}
 
 				dm = CDDM_from_curve_displist(ob, dispbase);
-
-				CDDM_calc_normals_mapping(dm);
 			}
 
 			if (vertCos) {
@@ -1001,8 +998,9 @@
 
 			if (useCache)
 				appf |= MOD_APPLY_USECACHE;
-			ndm = mti->applyModifier(md, ob, dm, appf);
 
+			ndm = modwrap_applyModifier(md, ob, dm, appf);
+
 			if (ndm) {
 				/* Modifier returned a new derived mesh */
 
@@ -1031,8 +1029,19 @@
 	}
 
 	if (derivedFinal) {
-		if (dm)
-			DM_ensure_tessface(dm);  /* needed for drawing */
+		if (dm) {
+			/* see: mesh_calc_modifiers */
+			if (dm->getNumTessFaces(dm) == 0) {
+				dm->recalcTessellation(dm);
+			}
+			/* Even if tessellation is not needed, some modifiers might have modified CD layers
+			 * (like mloopcol or mloopuv), hence we have to update those. */
+			else if (dm->dirty & DM_DIRTY_TESS_CDLAYERS) {
+				DM_update_tessface_data(dm);
+			}
+
+			CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
+		}
 		(*derivedFinal) = dm;
 	}
 

Modified: trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2013-06-19 08:00:20 UTC (rev 57565)
+++ trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2013-06-19 08:19:36 UTC (rev 57566)
@@ -49,7 +49,7 @@
 #include "DNA_object_types.h"
 
 
-static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Object *UNUSED(ob))
+static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
 {
 	DerivedMesh *result;
 	BMesh *bm;
@@ -97,7 +97,8 @@
 
 	result = CDDM_from_bmesh(bm, TRUE);
 	BM_mesh_free(bm);
-	
+
+	result->dirty |= DM_DIRTY_NORMALS;
 	return result;
 }
 
@@ -119,25 +120,16 @@
 	temd->flags = emd->flags;
 }
 
-static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
-                                         Object *ob, DerivedMesh *dm)
-{
-	if (!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG)))
-		return dm;
-
-	return doEdgeSplit(dm, emd, ob);
-}
-
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), DerivedMesh *dm,
                                   ModifierApplyFlag UNUSED(flag))
 {
 	DerivedMesh *result;
 	EdgeSplitModifierData *emd = (EdgeSplitModifierData *) md;
 
-	result = edgesplitModifier_do(emd, ob, derivedData);
+	if (!(emd->flags & (MOD_EDGESPLIT_FROMANGLE | MOD_EDGESPLIT_FROMFLAG)))
+		return dm;
 
-	if (result != derivedData)
-		result->dirty |= DM_DIRTY_NORMALS;
+	result = doEdgeSplit(dm, emd);
 
 	return result;
 }




More information about the Bf-blender-cvs mailing list