[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32869] trunk/blender/source/blender: Fix #24388: multires base mesh

Sergey Sharybin g.ulairi at gmail.com
Thu Nov 4 17:00:28 CET 2010


Revision: 32869
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32869
Author:   nazgul
Date:     2010-11-04 17:00:28 +0100 (Thu, 04 Nov 2010)

Log Message:
-----------
Fix #24388: multires base mesh

- MDisp should be re-allocated if face changed amount of vertices
- Allocate disps array in layerSwap_mdisps to prevent loosing all highres data

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/editors/mesh/editmesh.c

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h	2010-11-04 15:59:09 UTC (rev 32868)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2010-11-04 16:00:28 UTC (rev 32869)
@@ -37,6 +37,8 @@
 struct MultiresModifierData;
 struct ModifierData;
 struct Object;
+struct Scene;
+struct MDisps;
 
 void multires_mark_as_modified(struct Object *ob);
 
@@ -74,5 +76,10 @@
 void multiresModifier_scale_disp(struct Scene *scene, struct Object *ob);
 void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struct Object *to_ob);
 
+int multires_mdisp_corners(struct MDisps *s);
+
+/* update multires data after topology changing */
+void multires_topology_changed(struct Object *ob);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-11-04 15:59:09 UTC (rev 32868)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-11-04 16:00:28 UTC (rev 32869)
@@ -50,6 +50,7 @@
 #include "BKE_global.h"
 #include "BKE_main.h"
 #include "BKE_utildefines.h"
+#include "BKE_multires.h"
 
 /* number of layers to add when growing a CustomData object */
 #define CUSTOMDATA_GROW 5
@@ -441,19 +442,6 @@
 }
 #endif
 
-static int mdisp_corners(MDisps *s)
-{
-	int lvl= 13;
-
-	while(lvl > 0) {
-		int side = (1 << (lvl-1)) + 1;
-		if ((s->totdisp % (side*side)) == 0) return s->totdisp / (side*side);
-		lvl--;
-	}
-
-	return 0;
-}
-
 static void layerSwap_mdisps(void *data, const int *ci)
 {
 	MDisps *s = data;
@@ -462,7 +450,7 @@
 
 	if(s->disps) {
 		int nverts= (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
-		corners= mdisp_corners(s);
+		corners= multires_mdisp_corners(s);
 		cornersize= s->totdisp/corners;
 
 		if(corners!=nverts) {
@@ -470,8 +458,8 @@
 			   if it happened, just forgot displacement */
 
 			MEM_freeN(s->disps);
-			s->disps= NULL;
-			s->totdisp= 0; /* flag to update totdisp */
+			s->totdisp= (s->totdisp/corners)*nverts;
+			s->disps= MEM_callocN(s->totdisp*sizeof(float)*3, "mdisp swap");
 			return;
 		}
 

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2010-11-04 15:59:09 UTC (rev 32868)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2010-11-04 16:00:28 UTC (rev 32869)
@@ -305,33 +305,45 @@
 }
 
 /* reset the multires levels to match the number of mdisps */
-void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+static int get_levels_from_disps(Object *ob)
 {
 	Mesh *me = ob->data;
 	MDisps *mdisp;
-	int i;
+	int i, totlvl= 0;
 
 	mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
 
-	if(mdisp) {
-		for(i = 0; i < me->totface; ++i, ++mdisp) {
-			int S = me->mface[i].v4 ? 4 : 3;
+	for(i = 0; i < me->totface; ++i, ++mdisp) {
+		int S = me->mface[i].v4 ? 4 : 3;
 
-			if(mdisp->totdisp == 0) continue;
+		if(mdisp->totdisp == 0) continue;
 
-			while(1) {
-				int side = (1 << (mmd->totlvl-1)) + 1;
-				int lvl_totdisp = side*side*S;
-				if(mdisp->totdisp == lvl_totdisp)
-					break;
-				else if(mdisp->totdisp < lvl_totdisp)
-					--mmd->totlvl;
-				else
-					++mmd->totlvl;
-					
-			}
+		while(1) {
+			int side = (1 << (totlvl-1)) + 1;
+			int lvl_totdisp = side*side*S;
+			if(mdisp->totdisp == lvl_totdisp)
+				break;
+			else if(mdisp->totdisp < lvl_totdisp)
+				--totlvl;
+			else
+				++totlvl;
+
 		}
+	}
 
+	return totlvl;
+}
+
+/* reset the multires levels to match the number of mdisps */
+void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+{
+	Mesh *me = ob->data;
+	MDisps *mdisp;
+
+	mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+	if(mdisp) {
+		mmd->totlvl = get_levels_from_disps(ob);
 		mmd->lvl = MIN2(mmd->sculptlvl, mmd->totlvl);
 		mmd->sculptlvl = MIN2(mmd->sculptlvl, mmd->totlvl);
 		mmd->renderlvl = MIN2(mmd->renderlvl, mmd->totlvl);
@@ -1555,6 +1567,19 @@
 	subdm->release(subdm);
 }
 
+int multires_mdisp_corners(MDisps *s)
+{
+	int lvl= 13;
+
+	while(lvl > 0) {
+		int side = (1 << (lvl-1)) + 1;
+		if ((s->totdisp % (side*side)) == 0) return s->totdisp / (side*side);
+		lvl--;
+	}
+
+	return 0;
+}
+
 void multiresModifier_scale_disp(Scene *scene, Object *ob)
 {
 	float smat[3][3];
@@ -1578,3 +1603,27 @@
 
 	multires_apply_smat(scene, ob, mat);
 }
+
+/* update multires data after topology changing */
+void multires_topology_changed(Object *ob)
+{
+	Mesh *me= (Mesh*)ob->data;
+	MDisps *mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+	int i;
+
+	if(!mdisp) return;
+
+	for(i = 0; i < me->totface; i++, mdisp++) {
+		int corners= multires_mdisp_corners(mdisp);
+		int nvert= me->mface[i].v4 ? 4 : 3;
+
+		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");
+		}
+	}
+}

Modified: trunk/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh.c	2010-11-04 15:59:09 UTC (rev 32868)
+++ trunk/blender/source/blender/editors/mesh/editmesh.c	2010-11-04 16:00:28 UTC (rev 32869)
@@ -54,6 +54,7 @@
 #include "BKE_mesh.h"
 #include "BKE_paint.h"
 #include "BKE_report.h"
+#include "BKE_multires.h"
 
 #include "ED_mesh.h"
 #include "ED_object.h"
@@ -1306,6 +1307,9 @@
 	}
 
 	mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+	/* topology could be changed, ensure mdisps are ok */
+	multires_topology_changed(ob);
 }
 
 void remake_editMesh(Scene *scene, Object *ob)





More information about the Bf-blender-cvs mailing list