[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45690] trunk/blender/source/blender: Port multires_topology_changed to new bmesh api

Sergey Sharybin sergey.vfx at gmail.com
Mon Apr 16 13:03:44 CEST 2012


Revision: 45690
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45690
Author:   nazgul
Date:     2012-04-16 11:03:42 +0000 (Mon, 16 Apr 2012)
Log Message:
-----------
Port multires_topology_changed to new bmesh api

This call is still needed when loading editmesh because some operations
are not creating CD layer for new loops (like crating new face) and
to prevent loosing all sculpted data when running disps correct
displacement maps should be allocated on loading edit mesh.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h	2012-04-16 10:50:57 UTC (rev 45689)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2012-04-16 11:03:42 UTC (rev 45690)
@@ -99,7 +99,7 @@
 int multires_mdisp_corners(struct MDisps *s);
 
 /* update multires data after topology changing */
-void multires_topology_changed(struct Scene *scene, struct Object *ob);
+void multires_topology_changed(struct Mesh *me);
 
 /**** interpolation stuff ****/
 void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2012-04-16 10:50:57 UTC (rev 45689)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2012-04-16 11:03:42 UTC (rev 45690)
@@ -2166,58 +2166,38 @@
 }
 
 /* update multires data after topology changing */
-#if 0 // BMESH_TODO
-void multires_topology_changed(Scene *scene, Object *ob)
+void multires_topology_changed(Mesh *me)
 {
-	Mesh *me= (Mesh*)ob->data;
-	MDisps *mdisp= NULL, *cur= NULL;
-	int i, grid= 0, corners;
-	MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+	MDisps *mdisp = NULL, *cur = NULL;
+	int i, grid = 0;
 
-	if (mmd)
-		multires_set_tot_mdisps(me, mmd->totlvl);
+	CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
+	mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
 
-	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
-	mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+	if (!mdisp)
+		return;
 
-	if (!mdisp) return;
+	cur = mdisp;
+	for (i = 0; i < me->totloop; i++, cur++) {
+		if (cur->totdisp) {
+			grid = mdisp->totdisp;
 
-	cur= mdisp;
-	for (i = 0; i < me->totface; i++, cur++) {
-		if (mdisp->totdisp) {
-			corners= multires_mdisp_corners(mdisp);
-			grid= mdisp->totdisp / corners;
-
 			break;
 		}
 	}
 
-	for (i = 0; i < me->totface; i++, mdisp++) {
-		int nvert= me->mface[i].v4 ? 4 : 3;
-
+	for (i = 0; i < me->totloop; i++, mdisp++) {
 		/* allocate memory for mdisp, the whole disp layer would be erased otherwise */
 		if (!mdisp->totdisp || !mdisp->disps) {
 			if (grid) {
-				mdisp->totdisp= nvert*grid;
-				mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+				mdisp->totdisp = grid;
+				mdisp->disps = MEM_callocN(3 * mdisp->totdisp * sizeof(float), "mdisp topology");
 			}
 
 			continue;
 		}
-
-		corners= multires_mdisp_corners(mdisp);
-
-		if (corners!=nvert) {
-			mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
-
-			if (mdisp->disps)
-				MEM_freeN(mdisp->disps);
-
-			mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
-		}
 	}
 }
-#endif // BMESH_TODO
 
 /***************** Multires interpolation stuff *****************/
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2012-04-16 10:50:57 UTC (rev 45689)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2012-04-16 11:03:42 UTC (rev 45690)
@@ -89,6 +89,7 @@
 
 #include "BKE_mesh.h"
 #include "BKE_customdata.h"
+#include "BKE_multires.h"
 
 #include "BKE_global.h" /* ugh - for looping over all objects */
 #include "BKE_main.h"
@@ -854,4 +855,7 @@
 	}
 
 	if (oldverts) MEM_freeN(oldverts);
+
+	/* topology could be changed, ensure mdisps are ok */
+	multires_topology_changed(me);
 }

Modified: trunk/blender/source/blender/editors/mesh/editmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2012-04-16 10:50:57 UTC (rev 45689)
+++ trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2012-04-16 11:03:42 UTC (rev 45690)
@@ -313,7 +313,6 @@
 #ifdef USE_TESSFACE_DEFAULT
 	BKE_mesh_tessface_calc(me);
 #endif
-
 }
 
 void EDBM_mesh_free(BMEditMesh *tm)




More information about the Bf-blender-cvs mailing list