[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42476] branches/bmesh/blender/source/ blender/blenkernel/intern: alternative fix for [#29338], now dont duplicate the vertex layer when calculating normals, instead only calculate face normals.
Campbell Barton
ideasman42 at gmail.com
Wed Dec 7 02:12:56 CET 2011
Revision: 42476
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42476
Author: campbellbarton
Date: 2011-12-07 01:12:53 +0000 (Wed, 07 Dec 2011)
Log Message:
-----------
alternative fix for [#29338], now dont duplicate the vertex layer when calculating normals, instead only calculate face normals.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-12-07 00:36:57 UTC (rev 42475)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2011-12-07 01:12:53 UTC (rev 42476)
@@ -1109,8 +1109,6 @@
int draw_flag= ((scene->toolsettings->multipaint ? CALC_WP_MULTIPAINT : 0) |
(scene->toolsettings->auto_normalize ? CALC_WP_AUTO_NORMALIZE : 0));
- short do_re_tessellate;
-
if(mmd && !mmd->sculptlvl)
has_multires = 0;
@@ -1412,19 +1410,13 @@
CDDM_apply_vert_coords(finaldm, deformedVerts);
- /* BMESH_TODO, do_re_tesselate recalculates normals anyway, this seems redundant! - campbell */
CDDM_calc_normals(finaldm);
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
add_weight_mcol_dm(ob, finaldm, draw_flag);
- do_re_tessellate= TRUE;
-
} else if(dm) {
finaldm = dm;
-
- do_re_tessellate= TRUE;
-
} else {
int recalc_normals= 0;
@@ -1445,8 +1437,6 @@
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
add_weight_mcol_dm(ob, finaldm, draw_flag);
-
- do_re_tessellate= FALSE;
}
/* add an orco layer if needed */
@@ -1470,23 +1460,22 @@
#endif /* WITH_GAMEENGINE */
- /* need to check when this isnt needed.
- * - when the mesh has no modifiers (shouldnt be needed)
- * - deform only? (unside, can try skip) but need to double check
- * - rebuild mesh with constructive modifier (ofcourse)
- *
- * Need to watch this, it can cause issues, see bug [#29338]
- */
- if (do_re_tessellate) {
- /* Re-tesselation is necessary to push render data (uvs, textures, colors)
- * from loops and polys onto the tessfaces. This may be currently be redundant
- * in cases where the render mode doesn't use these inputs, but ideally
- * eventually tesselation would happen on-demand, and this is one of the primary
- * places it would be needed. */
- finaldm->recalcTesselation(finaldm);
- finaldm->calcNormals(finaldm);
- }
+ /* --------------------------------------------------------------------- */
+ /* Re-tesselation is necessary to push render data (uvs, textures, colors)
+ * from loops and polys onto the tessfaces. This may be currently be
+ * redundantin cases where the render mode doesn't use these inputs, but
+ * ideally eventually tesselation would happen on-demand, and this is one
+ * of the primary places it would be needed. */
+ finaldm->recalcTesselation(finaldm);
+ /* if we have no modifiers applied we'lll still want the tessface normals
+ * to be calculated from the polygon noramals,
+ * 'CDDM_calc_normals' checks for this case - campbell */
+ finaldm->calcNormals(finaldm);
+ /* Need to watch this, it can cause issues, see bug [#29338] */
+ /* take care with this block, we really need testing frameworks */
+ /* --------------------------------------------------------------------- */
+
*final_r = finaldm;
if(orcodm)
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-12-07 00:36:57 UTC (rev 42475)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-12-07 01:12:53 UTC (rev 42476)
@@ -2232,11 +2232,20 @@
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
float (*face_nors)[3] = NULL;
+
+ /* use this to skip calculating normals on original vert's, this may need to be changed */
+ const short only_face_normals = CustomData_is_referenced_layer(&dm->vertData, CD_MVERT);
if(dm->numVertData == 0) return;
+ /* now we skip calculating vertex normals for referenced layer,
+ * no need to duplicate verts.
+ * WATCH THIS, bmesh only change!,
+ * need to take care of the side effects here - campbell */
+#if 0
/* we don't want to overwrite any referenced layers */
cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+#endif
if (dm->numTessFaceData == 0) {
/* No tesselation on this mesh yet, need to calculate one */
@@ -2251,9 +2260,10 @@
face_nors = MEM_mallocN(sizeof(float)*3*dm->numTessFaceData, "face_nors");
/* calculate face normals */
- mesh_calc_normals(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
- dm->numLoopData, dm->numPolyData, NULL, cddm->mface, dm->numTessFaceData,
- CustomData_get_layer(&dm->faceData, CD_POLYINDEX), face_nors);
+ mesh_calc_normals_ex(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
+ dm->numLoopData, dm->numPolyData, NULL, cddm->mface, dm->numTessFaceData,
+ CustomData_get_layer(&dm->faceData, CD_POLYINDEX), face_nors,
+ only_face_normals);
CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN,
face_nors, dm->numTessFaceData);
More information about the Bf-blender-cvs
mailing list