svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r20937:21899
[blender.git] / source / blender / blenkernel / intern / mesh.c
index 0c8cd1d959391d4d63cd5173942ff4495c582cd3..c7454d3b832fed1311d2aff21ddce7d74398be69 100644 (file)
@@ -24,9 +24,7 @@
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Blender Foundation
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -58,7 +56,6 @@
 #include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
 #include "BKE_mesh.h"
-#include "BKE_multires.h"
 #include "BKE_subsurf.h"
 #include "BKE_displist.h"
 #include "BKE_library.h"
 /* -- */
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
-#include "BKE_bad_level_calls.h"
-
-#ifdef WITH_VERSE
-#include "BKE_verse.h"
-#endif
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
 #include "BLI_arithb.h"
 
+
+EditMesh *BKE_mesh_get_editmesh(Mesh *me)
+{
+       return me->edit_mesh;
+}
+
+void BKE_mesh_end_editmesh(Mesh *me, EditMesh *em)
+{
+}
+
+
 void mesh_update_customdata_pointers(Mesh *me)
 {
        me->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
@@ -143,8 +146,7 @@ void free_mesh(Mesh *me)
        
        if(me->bb) MEM_freeN(me->bb);
        if(me->mselect) MEM_freeN(me->mselect);
-
-       if(me->mr) multires_free(me->mr);
+       if(me->edit_mesh) MEM_freeN(me->edit_mesh);
 }
 
 void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
@@ -194,11 +196,8 @@ Mesh *add_mesh(char *name)
        me->texflag= AUTOSPACE;
        me->flag= ME_TWOSIDED;
        me->bb= unit_boundbox();
-
-#ifdef WITH_VERSE
-       me->vnode = NULL;
-#endif
-
+       me->drawflag= ME_DRAWEDGES|ME_DRAWFACES|ME_DRAWCREASES;
+       
        return me;
 }
 
@@ -232,9 +231,6 @@ Mesh *copy_mesh(Mesh *me)
                }
        }
        
-       if(me->mr)
-               men->mr= multires_copy(me->mr);
-
        men->mselect= NULL;
 
        men->bb= MEM_dupallocN(men->bb);
@@ -242,10 +238,6 @@ Mesh *copy_mesh(Mesh *me)
        men->key= copy_key(me->key);
        if(men->key) men->key->from= (ID *)men;
 
-#ifdef WITH_VERSE
-       men->vnode = NULL;
-#endif 
-
        return men;
 }
 
@@ -959,7 +951,8 @@ void nurbs_to_mesh(Object *ob)
 
 }
 
-void mesh_delete_material_index(Mesh *me, int index) {
+void mesh_delete_material_index(Mesh *me, int index)
+{
        int i;
 
        for (i=0; i<me->totface; i++) {
@@ -969,7 +962,8 @@ void mesh_delete_material_index(Mesh *me, int index) {
        }
 }
 
-void mesh_set_smooth_flag(Object *meshOb, int enableSmooth) {
+void mesh_set_smooth_flag(Object *meshOb, int enableSmooth) 
+{
        Mesh *me = meshOb->data;
        int i;
 
@@ -983,7 +977,7 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth) {
                }
        }
 
-       DAG_object_flush_update(G.scene, meshOb, OB_RECALC_DATA);
+// XXX do this in caller       DAG_object_flush_update(scene, meshOb, OB_RECALC_DATA);
 }
 
 void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r) 
@@ -1032,38 +1026,14 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces,
 
 float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
 {
-#ifdef WITH_VERSE
-       if(me->vnode) {
-               struct VLayer *vlayer;
-               struct VerseVert *vvert;
-               unsigned int i, numVerts;
-               float (*cos)[3];
-
-               vlayer = find_verse_layer_type((VGeomData*)((VNode*)me->vnode)->data, VERTEX_LAYER);
-
-               vvert = vlayer->dl.lb.first;
-               numVerts = vlayer->dl.da.count;
-               cos = MEM_mallocN(sizeof(*cos)*numVerts, "verse_vertexcos");
-
-               for(i=0; i<numVerts && vvert; vvert = vvert->next, i++) {
-                       VECCOPY(cos[i], vvert->co);
-               }
-
-               return cos;
-       }
-       else {
-#endif
-               int i, numVerts = me->totvert;
-               float (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "vertexcos1");
-        
-               if (numVerts_r) *numVerts_r = numVerts;
-               for (i=0; i<numVerts; i++)
-                       VECCOPY(cos[i], me->mvert[i].co);
-        
-               return cos;
-#ifdef WITH_VERSE
-       }
-#endif
+       int i, numVerts = me->totvert;
+       float (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "vertexcos1");
+       
+       if (numVerts_r) *numVerts_r = numVerts;
+       for (i=0; i<numVerts; i++)
+               VECCOPY(cos[i], me->mvert[i].co);
+       
+       return cos;
 }
 
 float (*mesh_getRefKeyCos(Mesh *me, int *numVerts_r))[3]
@@ -1198,6 +1168,48 @@ void free_uv_vert_map(UvVertMap *vmap)
        }
 }
 
+/* Generates a map where the key is the vertex and the value is a list
+   of faces that use that vertex as a corner. The lists are allocated
+   from one memory pool. */
+void create_vert_face_map(ListBase **map, IndexNode **mem, const MFace *mface, const int totvert, const int totface)
+{
+       int i,j;
+       IndexNode *node = NULL;
+       
+       (*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert face map");
+       (*mem) = MEM_callocN(sizeof(IndexNode) * totface*4, "vert face map mem");
+       node = *mem;
+       
+       /* Find the users */
+       for(i = 0; i < totface; ++i){
+               for(j = 0; j < (mface[i].v4?4:3); ++j, ++node) {
+                       node->index = i;
+                       BLI_addtail(&(*map)[((unsigned int*)(&mface[i]))[j]], node);
+               }
+       }
+}
+
+/* Generates a map where the key is the vertex and the value is a list
+   of edges that use that vertex as an endpoint. The lists are allocated
+   from one memory pool. */
+void create_vert_edge_map(ListBase **map, IndexNode **mem, const MEdge *medge, const int totvert, const int totedge)
+{
+       int i, j;
+       IndexNode *node = NULL;
+       (*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert edge map");
+       (*mem) = MEM_callocN(sizeof(IndexNode) * totedge * 2, "vert edge map mem");
+       node = *mem;
+       
+       /* Find the users */
+       for(i = 0; i < totedge; ++i){
+               for(j = 0; j < 2; ++j, ++node) {
+                       node->index = i;
+                       BLI_addtail(&(*map)[((unsigned int*)(&medge[i].v1))[j]], node);
+               }
+       }
+}
+
 /* Partial Mesh Visibility */
 PartialVisibility *mesh_pmv_copy(PartialVisibility *pmv)
 {
@@ -1253,7 +1265,7 @@ void mesh_pmv_revert(Object *ob, Mesh *me)
                MEM_freeN(me->pv->vert_map);
                me->pv->vert_map= NULL;
 
-               DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+// XXX do this in caller               DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
        }
 }