[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20416] branches/bmesh/blender/source/ blender: mesh DNA modficiations; two new structures added for storing ngons , MPoly and MLoop.

Joseph Eagar joeedh at gmail.com
Tue May 26 06:17:48 CEST 2009


Revision: 20416
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20416
Author:   joeedh
Date:     2009-05-26 06:17:47 +0200 (Tue, 26 May 2009)

Log Message:
-----------
mesh DNA modficiations; two new structures added for storing ngons, MPoly and MLoop.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
    branches/bmesh/blender/source/blender/blenloader/intern/writefile.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
    branches/bmesh/blender/source/blender/makesdna/DNA_customdata_types.h
    branches/bmesh/blender/source/blender/makesdna/DNA_mesh_types.h
    branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h

Added Paths:
-----------
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2009-05-26 04:17:47 UTC (rev 20416)
@@ -43,6 +43,7 @@
 struct MEdge;
 struct MVert;
 struct MCol;
+struct BMesh;
 struct Object;
 struct MTFace;
 struct VecNor;
@@ -54,6 +55,7 @@
 
 struct EditMesh *BKE_mesh_get_editmesh(struct Mesh *me);
 void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
+struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me);
 
 void unlink_mesh(struct Mesh *me);
 void free_mesh(struct Mesh *me);
@@ -135,11 +137,6 @@
 void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
 int mesh_layers_menu(struct CustomData *data, int type);
 
-/*accessor functions for editmesh, all access to editmesh must
-  go through them!*/
-struct EditMesh *EM_GetEditMesh(struct Mesh *me);
-void EM_EndEditMesh(struct Mesh *me, struct EditMesh *em);
-
 #ifdef __cplusplus
 }
 #endif

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-05-26 04:17:47 UTC (rev 20416)
@@ -5,6 +5,12 @@
 struct DerivedMesh;
 struct BMFace;
 
+/*
+ok: the EDBM module is for editmode bmesh stuff.  in contrast, the 
+    BMEdit module is for code shared with blenkernel that concerns
+    the BMEditMesh structure.
+*/
+
 typedef struct BMEditSelection
 {
 	struct BMEditSelection *next, *prev;
@@ -54,7 +60,7 @@
 	int mat_nr;
 } BMEditMesh;
 
-void TM_RecalcTesselation(BMEditMesh *tm);
-BMEditMesh *TM_Create(BMesh *bm);
-BMEditMesh *TM_Copy(BMEditMesh *tm);
-void TM_Free(BMEditMesh *em);
+void BMEdit_RecalcTesselation(BMEditMesh *tm);
+BMEditMesh *BMEdit_Create(BMesh *bm);
+BMEditMesh *BMEdit_Copy(BMEditMesh *tm);
+void BMEdit_Free(BMEditMesh *em);

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-05-26 04:17:47 UTC (rev 20416)
@@ -711,6 +711,8 @@
 	 layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL},
 	{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
 	 layerSwap_mcol, layerDefault_mcol},
+	{sizeof(MPoly), "MPoly", 1, "NGon Face", NULL, NULL, NULL, NULL, NULL},
+	{sizeof(MLoop), "MLoop", 1, "NGon Face-Vertex", NULL, NULL, NULL, NULL, NULL},
 };
 
 const char *LAYERTYPENAMES[CD_NUMTYPES] = {
@@ -720,17 +722,20 @@
 	"CDMloopCol", "CDTangent", "CDMDisps", "CDWeightMCol"};
 
 const CustomDataMask CD_MASK_BAREMESH =
-	CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
+	CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MPOLY;
 const CustomDataMask CD_MASK_MESH =
 	CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
-	CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+	CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
+	CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP;
 const CustomDataMask CD_MASK_EDITMESH =
-	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
+	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV |
+	CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
 	CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
 const CustomDataMask CD_MASK_DERIVEDMESH =
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
 	CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
+	CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
 	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL;
 const CustomDataMask CD_MASK_BMESH = 
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-05-26 04:17:47 UTC (rev 20416)
@@ -90,18 +90,18 @@
 
 #include "bmesh.h"
 
-BMEditMesh *TM_Create(BMesh *bm)
+BMEditMesh *BMEdit_Create(BMesh *bm)
 {
 	BMEditMesh *tm = MEM_callocN(sizeof(BMEditMesh), "tm");
 	
 	tm->bm = bm;
 
-	TM_RecalcTesselation(tm);
+	BMEdit_RecalcTesselation(tm);
 
 	return tm;
 }
 
-BMEditMesh *TM_Copy(BMEditMesh *tm)
+BMEditMesh *BMEdit_Copy(BMEditMesh *tm)
 {
 	BMEditMesh *tm2 = MEM_callocN(sizeof(BMEditMesh), "tm2");
 	*tm2 = *tm;
@@ -111,7 +111,7 @@
 	
 	tm2->looptris = NULL;
 	tm2->bm = BM_Copy_Mesh(tm->bm);
-	TM_RecalcTesselation(tm2);
+	BMEdit_RecalcTesselation(tm2);
 
 	tm2->vert_index = NULL;
 	tm2->edge_index = NULL;
@@ -120,7 +120,7 @@
 	return tm2;
 }
 
-void TM_RecalcTesselation(BMEditMesh *tm)
+void BMEdit_RecalcTesselation(BMEditMesh *tm)
 {
 	BMesh *bm = tm->bm;
 	BMLoop **looptris = NULL;
@@ -198,7 +198,7 @@
 }
 
 /*does not free the BMEditMesh struct itself*/
-void TM_Free(BMEditMesh *em)
+void BMEdit_Free(BMEditMesh *em)
 {
 	if(em->derivedFinal) {
 		if (em->derivedFinal!=em->derivedCage) {
@@ -221,6 +221,8 @@
 	if (em->vert_index) MEM_freeN(em->vert_index);
 	if (em->edge_index) MEM_freeN(em->edge_index);
 	if (em->face_index) MEM_freeN(em->face_index);
+
+	BM_Free_Mesh(em->bm);
 }
 
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2009-05-26 04:17:47 UTC (rev 20416)
@@ -72,6 +72,8 @@
 #include "BLI_editVert.h"
 #include "BLI_arithb.h"
 
+#include "bmesh.h"
+
 EditMesh *BKE_mesh_get_editmesh(Mesh *me)
 {
 	return bmesh_to_editmesh(me->edit_btmesh->bm);
@@ -79,10 +81,8 @@
 
 void BKE_mesh_end_editmesh(Mesh *me, EditMesh *em)
 {
-	BM_Free_Mesh(me->edit_btmesh->bm);
-
 	me->edit_btmesh->bm = editmesh_to_bmesh(em);
-	TM_RecalcTesselation(me->edit_btmesh);
+	BMEdit_RecalcTesselation(me->edit_btmesh);
 }
 
 
@@ -97,6 +97,14 @@
 	me->mface = CustomData_get_layer(&me->fdata, CD_MFACE);
 	me->mcol = CustomData_get_layer(&me->fdata, CD_MCOL);
 	me->mtface = CustomData_get_layer(&me->fdata, CD_MTFACE);
+
+	me->mpoly = CustomData_get_layer(&me->pdata, CD_MPOLY);
+	me->mloop = CustomData_get_layer(&me->ldata, CD_MLOOP);
+
+	me->mtpoly = CustomData_get_layer(&me->pdata, CD_MTEXPOLY);
+
+	me->mloopcol = CustomData_get_layer(&me->ldata, CD_MLOOPCOL);
+	me->mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV);
 }
 
 /* Note: unlinking is called when me->id.us is 0, question remains how
@@ -145,6 +153,8 @@
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
 	CustomData_free(&me->fdata, me->totface);
+	CustomData_free(&me->ldata, me->totloop);
+	CustomData_free(&me->pdata, me->totpoly);
 
 	if(me->mat) MEM_freeN(me->mat);
 	
@@ -209,6 +219,7 @@
 {
 	Mesh *men;
 	MTFace *tface;
+	MTexPoly *txface;
 	int a, i;
 	
 	men= copy_libblock(me);
@@ -222,6 +233,8 @@
 	CustomData_copy(&me->vdata, &men->vdata, CD_MASK_MESH, CD_DUPLICATE, men->totvert);
 	CustomData_copy(&me->edata, &men->edata, CD_MASK_MESH, CD_DUPLICATE, men->totedge);
 	CustomData_copy(&me->fdata, &men->fdata, CD_MASK_MESH, CD_DUPLICATE, men->totface);
+	CustomData_copy(&me->ldata, &men->ldata, CD_MASK_MESH, CD_DUPLICATE, men->totloop);
+	CustomData_copy(&me->pdata, &men->pdata, CD_MASK_MESH, CD_DUPLICATE, men->totpoly);
 	mesh_update_customdata_pointers(men);
 
 	/* ensure indirect linked data becomes lib-extern */
@@ -234,7 +247,17 @@
 					id_lib_extern((ID*)tface->tpage);
 		}
 	}
-	
+
+	for(i=0; i<me->pdata.totlayer; i++) {
+		if(me->pdata.layers[i].type == CD_MTEXPOLY) {
+			txface= (MTexPoly*)me->pdata.layers[i].data;
+
+			for(a=0; a<me->totpoly; a++, txface++)
+				if(txface->tpage)
+					id_lib_extern((ID*)txface->tpage);
+		}
+	}
+
 	men->mselect= NULL;
 
 	men->bb= MEM_dupallocN(men->bb);
@@ -245,12 +268,43 @@
 	return men;
 }
 
+BMesh *BKE_mesh_to_bmesh(Mesh *me)
+{
+	BMesh *bm;
+	int allocsize[4] = {512,512,2048,512};
+
+	bm = BM_Make_Mesh(allocsize);
+
+	BMO_CallOpf(bm, "mesh_to_bmesh mesh=%p", me);
+
+	return bm;
+}
+
 void make_local_tface(Mesh *me)
 {
 	MTFace *tface;
+	MTexPoly *txface;
 	Image *ima;
 	int a, i;
 	
+	for(i=0; i<me->pdata.totlayer; i++) {
+		if(me->pdata.layers[i].type == CD_MTEXPOLY) {
+			txface= (MTexPoly*)me->fdata.layers[i].data;
+			
+			for(a=0; a<me->totpoly; a++, txface++) {
+				/* special case: ima always local immediately */
+				if(txface->tpage) {
+					ima= txface->tpage;
+					if(ima->id.lib) {
+						ima->id.lib= 0;
+						ima->id.flag= LIB_LOCAL;
+						new_id(0, (ID *)ima, 0);
+					}
+				}
+			}
+		}
+	}
+
 	for(i=0; i<me->fdata.totlayer; i++) {
 		if(me->fdata.layers[i].type == CD_MTFACE) {
 			tface= (MTFace*)me->fdata.layers[i].data;
@@ -268,6 +322,7 @@
 			}
 		}
 	}
+
 }
 
 void make_local_mesh(Mesh *me)

Modified: branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/bmesh/blender/source/blender/blenloader/intern/readfile.c	2009-05-26 02:49:46 UTC (rev 20415)
+++ branches/bmesh/blender/source/blender/blenloader/intern/readfile.c	2009-05-26 04:17:47 UTC (rev 20416)
@@ -3004,6 +3004,26 @@
 
 }
 
+static void lib_link_customdata_mtpoly(FileData *fd, Mesh *me, CustomData *pdata, int totface)
+{
+	int i;
+
+	for(i=0; i<pdata->totlayer; i++) {
+		CustomDataLayer *layer = &pdata->layers[i];
+		
+		if(layer->type == CD_MTEXPOLY) {
+			MTexPoly *tf= layer->data;
+			int i;
+
+			for (i=0; i<totface; i++, tf++) {
+				tf->tpage= newlibadr(fd, me->id.lib, tf->tpage);
+				if(tf->tpage && tf->tpage->id.us==0)
+					tf->tpage->id.us= 1;
+			}
+		}
+	}
+}
+
 static void lib_link_mesh(FileData *fd, Main *main)
 {
 	Mesh *me;
@@ -3030,6 +3050,7 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list