[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15630] branches/soc-2008-nicholasbishop/ source/blender: More progress with subdividing disps for editing the inbetween levels.

Nicholas Bishop nicholasbishop at gmail.com
Fri Jul 18 22:57:46 CEST 2008


Revision: 15630
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15630
Author:   nicholasbishop
Date:     2008-07-18 22:57:46 +0200 (Fri, 18 Jul 2008)

Log Message:
-----------
More progress with subdividing disps for editing the inbetween levels.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
    branches/soc-2008-nicholasbishop/source/blender/src/editmesh_mods.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-18 20:31:40 UTC (rev 15629)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-07-18 20:57:46 UTC (rev 15630)
@@ -82,6 +82,8 @@
 			  const int totvert, const int totface);
 
 /* MultiresDM */
+void MultiresDM_set_mesh(struct DerivedMesh *dm, struct Mesh *me);
+struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm);
 struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, int);
 void *MultiresDM_get_vertnorm(struct DerivedMesh *);
 void *MultiresDM_get_orco(struct DerivedMesh *);
@@ -124,7 +126,8 @@
 
 void multires_force_update(struct Object *ob);
 
-struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*, int, int);
+struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
+						    struct Mesh *, int, int);
 
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob);
 void multiresModifier_setLevel(void *mmd_v, void *ob_v);

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-18 20:31:40 UTC (rev 15629)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-07-18 20:57:46 UTC (rev 15630)
@@ -1169,6 +1169,8 @@
 	ListBase *vert_face_map;
 	IndexNode *vert_face_map_mem;
 
+	Mesh *me;
+
 	void (*update)(DerivedMesh*);
 } MultiresDM;
 
@@ -1275,6 +1277,16 @@
 	return dm;
 }
 
+void MultiresDM_set_mesh(DerivedMesh *dm, Mesh *me)
+{
+	((MultiresDM*)dm)->me = me;
+}
+
+Mesh *MultiresDM_get_mesh(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->me;
+}
+
 void *MultiresDM_get_vertnorm(DerivedMesh *dm)
 {
 	return ((MultiresDM*)dm)->norm;

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-07-18 20:31:40 UTC (rev 15629)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c	2008-07-18 20:57:46 UTC (rev 15630)
@@ -7220,7 +7220,7 @@
 	if(mmd->lvl == 1)
 		return dm;
 
-	return multires_dm_create_from_derived(mmd, dm, useRenderParams, isFinalCalc);
+	return multires_dm_create_from_derived(mmd, dm, get_mesh(ob), useRenderParams, isFinalCalc);
 }
 
 /***/

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-18 20:31:40 UTC (rev 15629)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-18 20:57:46 UTC (rev 15630)
@@ -1410,62 +1410,86 @@
 	MVert *mvs = CDDM_get_verts(final);
 	MVert *mvd, *mvd_f1, *mvs_f1, *mvd_f3, *mvd_f4;
 	MVert *mvd_f2, *mvs_f2, *mvs_e1, *mvd_e1, *mvs_e2;
-	int totorco, totvert;
+	int totvert;
+	int slo1 = multires_side_tot[lvl - 1];
+	int sll = slo1 / 2;
 	int slo2 = multires_side_tot[totlvl - 2];
 	int shi2 = multires_side_tot[totlvl - 1];
-	int i, j;
+	int skip = multires_side_tot[totlvl - lvl] - 1;
+	int i, j, k;
 
-	/* Base mesh */
-	int base_totvert, base_totedge, base_totface;
-	MFace *base_mface;
-	if(me) {
-		base_totvert = me->totvert;
-		base_totedge = me->totedge;
-		base_totface = me->totface;
-		base_mface = me->mface;
-	}
-	else {
-		base_totvert = MultiresDM_get_totorco(orig);
-		base_totedge = MultiresDM_get_totored(orig);
-		base_totface = MultiresDM_get_totorfa(orig);
-		base_mface = MultiresDM_get_orfa(orig);
-	}
-
 	mmd_sub.lvl = mmd_sub.totlvl = totlvl;
-	mrdm = multires_dm_create_from_derived(&mmd_sub, orig, 0, 0);
+	mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
 		
 	mvd = CDDM_get_verts(mrdm);
 	/* Need to map from ccg to mrdm */
-	totorco = MultiresDM_get_totorco(mrdm);
 	totvert = mrdm->getNumVerts(mrdm);
 
 	/* Load base verts */
-	for(i = 0; i < base_totvert; ++i)
-		VecCopyf(mvd[totvert - totorco + i].co, mvs[totvert - totorco + i].co);
+	for(i = 0; i < me->totvert; ++i)
+		VecCopyf(mvd[totvert - me->totvert + i].co, mvs[totvert - me->totvert + i].co);
 
 	mvd_f1 = mvd;
 	mvs_f1 = mvs;
 	mvd_f2 = mvd;
 	mvs_f2 = mvs + totvert - totsubvert;
-	mvs_e1 = mvs + totsubface;
-	for(i = 0; i < base_totface; ++i) {
-		const int end = base_mface[i].v4 ? 4 : 3;
-		int x, y;
+	mvs_e1 = mvs + totsubface * (skip-1) * (skip-1);
 
+	for(i = 0; i < me->totface; ++i) {
+		const int end = me->mface[i].v4 ? 4 : 3;
+		int x, y, x2, y2, mov;
+
 		mvd_f1 += 1 + end * (slo2-2); //center+edgecross
 		mvd_f3 = mvd_f4 = mvd_f1;
 
 		for(j = 0; j < end; ++j) {
-			/* Update face centers created in the top level */
-			for(y = 1; y < slo2 - 1; y += 2) {
-				for(x = 1; x < slo2 - 1; x += 2) {
+			mvd_f1 += (skip/2 - 1) * (slo2 - 2) + (skip/2 - 1);
+			/* Update sub faces */
+			for(y = 0; y < sll; ++y) {
+				for(x = 0; x < sll; ++x) {
+					/* Face center */
 					VecCopyf(mvd_f1->co, mvs_f1->co);
-					mvd_f1 += 2;
 					mvs_f1 += 1;
+
+					/* Now we hold the center of the subface at mvd_f1
+					   and offset it to the edge cross and face verts */
+
+					/* Edge cross */
+					for(k = 0; k < 4; ++k) {
+						if(k == 0) mov = -1;
+						else if(k == 1) mov = slo2 - 2;
+						else if(k == 2) mov = 1;
+						else if(k == 3) mov = -(slo2 - 2);
+
+						for(x2 = 1; x2 < skip/2; ++x2) {
+							VecCopyf((mvd_f1 + mov * x2)->co, mvs_f1->co);
+							++mvs_f1;
+						}
+					}
+
+					/* Main face verts */
+					for(k = 0; k < 4; ++k) {
+						int movx, movy;
+
+						if(k == 0) { movx = -1; movy = -(slo2 - 2); }
+						else if(k == 1) { movx = slo2 - 2; movy = -1; }
+						else if(k == 2) { movx = 1; movy = slo2 - 2; }
+						else if(k == 3) { movx = -(slo2 - 2); movy = 1; }
+
+						for(y2 = 1; y2 < skip/2; ++y2) {
+							for(x2 = 1; x2 < skip/2; ++x2) {
+								VecCopyf((mvd_f1 + movy * y2 + movx * x2)->co, mvs_f1->co);
+								++mvs_f1;
+							}
+						}
+					}
+							
+					mvd_f1 += skip;
 				}
-				mvd_f1 += slo2 - 3;
+				mvd_f1 += (skip - 1) * (slo2 - 2) - 1;
 			}
-			mvd_f1 -= slo2 - 2;
+			mvd_f1 -= (skip - 1) * (slo2 - 2) - 1 + skip;
+			mvd_f1 += (slo2 - 2) * (skip/2-1) + skip/2-1 + 1;
 		}
 
 		/* update face center verts */
@@ -1476,70 +1500,89 @@
 
 		/* update face edge verts */
 		for(j = 0; j < end; ++j) {
-			VecCopyf(mvd_f2->co, mvs_e1->co);
-			mvd_f2++;
-			mvs_e1++;
-			for(x = 2; x < slo2 - 1; x += 2) {
-				VecCopyf(mvd_f2->co, mvs_f2->co);
-				mvd_f2++;
-				mvs_f2++;
+			MVert *restore;
 
+			/* Super-face edge cross */
+			for(k = 0; k < skip-1; ++k) {
 				VecCopyf(mvd_f2->co, mvs_e1->co);
 				mvd_f2++;
 				mvs_e1++;
 			}
+			for(x = 1; x < sll; ++x) {
+				VecCopyf(mvd_f2->co, mvs_f2->co);
+				mvd_f2++;
+				mvs_f2++;
 
-			for(y = 0; y < slo2/2 - 1; ++y) {
-				for(x = 0; x < slo2/2; ++x) {
-					VecCopyf(mvd_f3[1+(y*2) + x*(2 * (slo2-2))].co,
-						 mvs_e1->co);
-					mvs_e1+=2;
+				for(k = 0; k < skip-1; ++k) {
+					VecCopyf(mvd_f2->co, mvs_e1->co);
+					mvd_f2++;
+					mvs_e1++;
 				}
 			}
 
-			mvs_e1 -= (slo2/2) * (slo2/2 - 1) * 2 - 1;
-			for(y = 0; y < slo2/2 - 1; ++y) {
-				for(x = 0; x < slo2/2; ++x) {
-					VecCopyf(mvd_f3[(slo2-2) + (x*2) + y*2*(slo2-2)].co,
-						 mvs_e1->co);
-					mvs_e1+=2;
+			restore = mvs_e1;
+			for(y = 0; y < sll - 1; ++y) {
+				for(x = 0; x < sll; ++x) {
+					for(k = 0; k < skip - 1; ++k) {
+						VecCopyf(mvd_f3[(skip-1)+(y*skip) + (x*skip+k)*(slo2-2)].co,
+							 mvs_e1->co);
+						++mvs_e1;
+					}
+					mvs_e1 += skip-1;
 				}
 			}
+			
+			mvs_e1 = restore + skip - 1;
+			for(y = 0; y < sll - 1; ++y) {
+				for(x = 0; x < sll; ++x) {
+					for(k = 0; k < skip - 1; ++k) {
+						VecCopyf(mvd_f3[(slo2-2)*(skip-1)+(x*skip)+k + y*skip*(slo2-2)].co,
+							 mvs_e1->co);
+						++mvs_e1;
+					}
+					mvs_e1 += skip - 1;
+				}
+			}
 
 			mvd_f3 += (slo2-2)*(slo2-2);
-			mvs_e1 -= 1;
+			mvs_e1 -= skip - 1;
 		}
 
 		/* update base (2) face verts */
 		for(j = 0; j < end; ++j) {
-			mvd_f2 += slo2 - 1;
-			for(y = 1; y < slo2 - 2; y += 2) {
-				for(x = 1; x < slo2 - 2; x += 2) {
+			mvd_f2 += (slo2 - 1) * (skip - 1);
+			for(y = 0; y < sll - 1; ++y) {
+				for(x = 0; x < sll - 1; ++x) {
 					VecCopyf(mvd_f2->co, mvs_f2->co);
-					mvd_f2 += 2;
+					mvd_f2 += skip;
 					++mvs_f2;
 				}
-				mvd_f2 += slo2 - 1;
+				mvd_f2 += (slo2 - 1) * (skip - 1);
 			}
-			mvd_f2 -= 1;
+			mvd_f2 -= (skip - 1);
 		}
 	}
 
 	/* edges */
-	mvd_e1 = mvd + totvert - base_totvert - base_totedge * (shi2-2);
-	mvs_e2 = mvs + totvert - base_totvert - base_totedge * (slo2-2);
-	for(i = 0; i < base_totedge; ++i) {
-		VecCopyf(mvd_e1->co, mvs_e1->co);
-		mvd_e1++;
-		mvs_e1++;
-		for(j = 0; j < slo2-2; j++) {
-			VecCopyf(mvd_e1->co, mvs_e2->co);
-			mvd_e1++;
-			mvs_e2++;
+	mvd_e1 = mvd + totvert - me->totvert - me->totedge * (shi2-2);
+	mvs_e2 = mvs + totvert - me->totvert - me->totedge * (slo1-2);
+	for(i = 0; i < me->totedge; ++i) {
+		for(j = 0; j < skip - 1; ++j) {
 			VecCopyf(mvd_e1->co, mvs_e1->co);
 			mvd_e1++;
 			mvs_e1++;
 		}
+		for(j = 0; j < slo1 - 2; j++) {
+			VecCopyf(mvd_e1->co, mvs_e2->co);
+			mvd_e1++;
+			mvs_e2++;
+			
+			for(k = 0; k < skip - 1; ++k) {
+				VecCopyf(mvd_e1->co, mvs_e1->co);
+				mvd_e1++;
+				mvs_e1++;
+			}
+		}
 	}
 
 	final->needsFree = 1;
@@ -1580,7 +1623,7 @@
 
 		orig = CDDM_from_mesh(me, NULL);
 		mmd_sub.lvl = mmd_sub.totlvl = mmd->totlvl - 1;
-		mrdm = multires_dm_create_from_derived(&mmd_sub, orig, 0, 0);
+		mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
 		totsubvert = mrdm->getNumVerts(mrdm);
 		totsubedge = mrdm->getNumEdges(mrdm);
 		totsubface = mrdm->getNumFaces(mrdm);
@@ -1854,7 +1897,7 @@
 	if(mdisps) {
 		MultiresDisplacer d;
 		const int lvl = MultiresDM_get_lvl(dm);
-		//const int totlvl = MultiresDM_get_totlvl(dm);
+		const int totlvl = MultiresDM_get_totlvl(dm);
 		const int gridFaces = multires_side_tot[lvl - 2] - 1;
 		const int edgeSize = multires_side_tot[lvl - 1] - 1;
 		ListBase *map = MultiresDM_get_vert_face_map(dm);
@@ -1929,8 +1972,14 @@
 			++d.subco;
 		}
 
-		/* Propagate disps upwards */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list