ngons draw with uniform normals in object mode now, I had this code disabled for...
authorCampbell Barton <ideasman42@gmail.com>
Sun, 18 Mar 2012 06:49:32 +0000 (06:49 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 18 Mar 2012 06:49:32 +0000 (06:49 +0000)
source/blender/blenkernel/BKE_cdderivedmesh.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/cdderivedmesh.c

index 9e2dd778b039de5fd65452080f36c388ba9812b6..fed200d7be063c3f57ef5776f9e6bdccaa7d0401 100644 (file)
@@ -96,6 +96,7 @@ void CDDM_apply_vert_normals(struct DerivedMesh *cddm, short (*vertNormals)[3]);
 
 /* recalculates vertex and face normals for a CDDerivedMesh
  */
+void CDDM_calc_normals_mapping_ex(struct DerivedMesh *dm, const short only_face_normals);
 void CDDM_calc_normals_mapping(struct DerivedMesh *dm);
 void CDDM_calc_normals(struct DerivedMesh *dm);
 void CDDM_calc_normals_tessface(struct DerivedMesh *dm);
index 6c3c75811617e19c6e9598c21bf7caf6f3af9b53..99629a2e27b031050d332a211eeca5f2183a1f5e 100644 (file)
@@ -1699,6 +1699,19 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
                /* Need to watch this, it can cause issues, see bug [#29338]             */
                /* take care with this block, we really need testing frameworks          */
                /* --------------------------------------------------------------------- */
+
+
+               /* without this, drawing ngon tri's faces will show ugly tessellated face
+                * normals and will also have to calculate normals on the fly, try avoid
+                * this where possible since calculating polygon normals isn't fast,
+                * note that this isn't a problem for subsurf (only quads) or editmode
+                * which deals with drawing differently.
+                *
+                * Never calc vertex normals because other code ensures these are up to date.
+                */
+               if ((finaldm->type == DM_TYPE_CDDM) && (CustomData_has_layer(&finaldm->faceData, CD_NORMAL) == FALSE)) {
+                       CDDM_calc_normals_mapping_ex(finaldm, TRUE);
+               }
        }
 
 
index 5eeccb7b450cb1abece00c67a37a5fafb56b9480..afde9d806c6576cf70f0ccdf26cec4cddc904408 100644 (file)
@@ -2069,24 +2069,21 @@ void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
                copy_v3_v3_short(vert->no, vertNormals[i]);
 }
 
-void CDDM_calc_normals_mapping(DerivedMesh *dm)
+void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals)
 {
        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
+       #if 0
        /* we don't want to overwrite any referenced layers */
        cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
-#endif
+       #endif
 
 
        if (dm->numTessFaceData == 0) {
@@ -2105,17 +2102,24 @@ void CDDM_calc_normals_mapping(DerivedMesh *dm)
 
 
        face_nors = MEM_mallocN(sizeof(float)*3*dm->numTessFaceData, "face_nors");
-       
+
        /* calculate face normals */
        mesh_calc_normals_mapping_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);
+                                                                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);
+}
+
 
+void CDDM_calc_normals_mapping(DerivedMesh *dm)
+{
+       /* 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);
 
+       CDDM_calc_normals_mapping_ex(dm, only_face_normals);
 }
 
 /* bmesh note: this matches what we have in trunk */