[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15297] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Displacements over subdivided edges work correctly now ( both for display and updating the highest level.)

Nicholas Bishop nicholasbishop at gmail.com
Sat Jun 21 20:21:28 CEST 2008


Revision: 15297
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15297
Author:   nicholasbishop
Date:     2008-06-21 20:20:32 +0200 (Sat, 21 Jun 2008)

Log Message:
-----------
Displacements over subdivided edges work correctly now (both for display and updating the highest level.)

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/multires.c
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-06-21 18:20:32 UTC (rev 15297)
@@ -29,7 +29,9 @@
 
 struct CustomData;
 struct EditMesh;
+struct MCol;
 struct Multires;
+struct MultiresColFace;
 struct MultiresLevel;
 struct Mesh;
 struct Object;
@@ -53,7 +55,7 @@
 void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n);
 void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int type, const int n);
 void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel *cr_lvl);
-void multires_to_mcol(struct MultiresColFace *f, MCol mcol[4]);
+void multires_to_mcol(struct MultiresColFace *f, struct MCol *mcol);
 /* After adding or removing vcolor layers, run this */
 void multires_load_cols(struct Mesh *me);
 
@@ -69,24 +71,37 @@
 
 struct DerivedMesh;
 struct MFace;
+struct MEdge;
 
+typedef struct IndexNode {
+	struct IndexNode *next, *prev;
+	int index;
+} IndexNode;
+
+void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
+			  const int totvert, const int totface);
+
 /* MultiresDM */
 struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, int);
 void *MultiresDM_get_orco(struct DerivedMesh *);
 void *MultiresDM_get_subco(struct DerivedMesh *);
 struct MFace *MultiresDM_get_orfa(struct DerivedMesh *);
+struct MEdge *MultiresDM_get_ored(struct DerivedMesh *);
+struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
 int MultiresDM_get_totlvl(struct DerivedMesh *);
 int MultiresDM_get_lvl(struct DerivedMesh *);
 int MultiresDM_get_totorfa(struct DerivedMesh *);
+int MultiresDM_get_totored(struct DerivedMesh *);
 void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
 
 /* Modifier */
 struct MDisps;
+struct MFace;
 struct MultiresModifierData;
 typedef struct MultiresDisplacer {
 	struct MDisps *grid;
+	struct MFace *face;
 	float mat[3][3];
-	int sides;
 	int spacing;
 	int sidetot;
 	int sidendx;
@@ -94,6 +109,7 @@
 	int invert;
 	float (*orco)[3];
 	float (*subco)[3];
+	float weight;
 
 	int x, y, ax, ay;
 } MultiresDisplacer;
@@ -104,7 +120,9 @@
 void multiresModifier_setLevel(void *mmd_v, void *ob_v);
 
 void multires_displacer_init(MultiresDisplacer *d, struct DerivedMesh *dm,
-			     const int face_index, const int sides, const int invert);
+			     const int face_index, const int invert);
+void multires_displacer_weight(MultiresDisplacer *d, const float w);
 void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index);
+void multires_displacer_anchor_edge(MultiresDisplacer *d, const int, const int, const int);
 void multires_displacer_jump(MultiresDisplacer *d);
 void multires_displace(MultiresDisplacer *d, float out[3]);

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-06-21 18:20:32 UTC (rev 15297)
@@ -42,6 +42,7 @@
 #include "BKE_displist.h"
 #include "BKE_global.h"
 #include "BKE_mesh.h"
+#include "BKE_multires.h"
 #include "BKE_utildefines.h"
 
 #include "BLI_arithb.h"
@@ -1148,9 +1149,15 @@
 	int lvl, totlvl;
 	float (*orco)[3];
 	float (*subco)[3];
+	MEdge *ored;
 	MFace *orfa;
+	int totorco;
+	int totored;
 	int totorfa;
 
+	ListBase *vert_face_map;
+	IndexNode *vert_face_map_mem;
+
 	void (*update)(DerivedMesh*);
 } MultiresDM;
 
@@ -1163,9 +1170,14 @@
 		mrdm->update(dm);
 
 	if(DM_release(dm)) {
+		MEM_freeN(mrdm->ored);
 		MEM_freeN(mrdm->orfa);
 		MEM_freeN(mrdm->subco);
 		MEM_freeN(mrdm->orco);
+		if(mrdm->vert_face_map)
+			MEM_freeN(mrdm->vert_face_map);
+		if(mrdm->vert_face_map_mem)
+			MEM_freeN(mrdm->vert_face_map_mem);
 		MEM_freeN(mrdm);
 	}
 }
@@ -1197,8 +1209,11 @@
 		mrdm->orco = MEM_callocN(sizeof(float) * 3 * orig->getNumVerts(orig), "multires orco");
 		for(i = 0; i < orig->getNumVerts(orig); ++i)
 			VecCopyf(mrdm->orco[i], mvert[i].co);
+		mrdm->totorco = orig->getNumVerts(orig);
 		mrdm->orfa = MEM_dupallocN(CustomData_get_layer(&orig->faceData, CD_MFACE));
 		mrdm->totorfa = orig->getNumFaces(orig);
+		mrdm->ored = MEM_dupallocN(CustomData_get_layer(&orig->edgeData, CD_MEDGE));
+		mrdm->totored = orig->getNumEdges(orig);
 	}
 	else
 		DM_init(dm, numVerts, numEdges, numFaces);
@@ -1241,6 +1256,16 @@
 	return ((MultiresDM*)dm)->totorfa;
 }
 
+MEdge *MultiresDM_get_ored(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->ored;
+}
+
+int MultiresDM_get_totored(struct DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->totored;
+}
+
 int MultiresDM_get_totlvl(DerivedMesh *dm)
 {
 	return ((MultiresDM*)dm)->totlvl;
@@ -1260,3 +1285,14 @@
 {
 	((MultiresDM*)dm)->update = update;
 }
+
+ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
+{
+	MultiresDM *mrdm = (MultiresDM*)dm;
+
+	if(!mrdm->vert_face_map)
+		create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, mrdm->orfa,
+				     mrdm->totorco, mrdm->totorfa);
+
+	return mrdm->vert_face_map;
+}

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-06-21 18:20:32 UTC (rev 15297)
@@ -1309,6 +1309,24 @@
 	}
 }
 
+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);
+		}
+	}
+}
+
 /* MULTIRES MODIFIER */
 static const int multires_max_levels = 13;
 static const int multires_quad_tot[] = {4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
@@ -1414,29 +1432,31 @@
 }
 
 void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
-			     const int face_index, const int sides, const int invert)
+			     const int face_index, const int invert)
 {
-	MFace *face;
 	float inv[3][3];
 
-	face = MultiresDM_get_orfa(dm) + face_index;
+	d->face = MultiresDM_get_orfa(dm) + face_index;
 	/* Get the multires grid from customdata and calculate the TS matrix */
 	d->grid = (MDisps*)dm->getFaceDataArray(dm, CD_MDISPS);
 	if(d->grid)
 		d->grid += face_index;
-	d->subco = MultiresDM_get_subco(dm);
-	calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), face);
+	calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), d->face);
 	if(invert) {
 		Mat3Inv(inv, d->mat);
 		Mat3CpyMat3(d->mat, inv);
 	}
 
-	d->sides = sides;
 	d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
 	d->sidetot = multires_side_tot[MultiresDM_get_totlvl(dm) - 1];
 	d->invert = invert;
 }
 
+void multires_displacer_weight(MultiresDisplacer *d, const float w)
+{
+	d->weight = w;
+}
+
 void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index)
 {
 	d->sidendx = side_index;
@@ -1476,6 +1496,46 @@
 	d->ay = d->y;
 }
 
+void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int v2, int x)
+{
+	const int mov = d->spacing * x;
+
+	d->type = 4;
+
+	if(v1 == d->face->v1) {
+		d->x = 0;
+		d->y = 0;
+		if(v2 == d->face->v2)
+			d->x += mov;
+		else
+			d->y += mov;
+	}
+	else if(v1 == d->face->v2) {
+		d->x = d->sidetot - 1;
+		d->y = 0;
+		if(v2 == d->face->v1)
+			d->x -= mov;
+		else
+			d->y += mov;
+	}
+	else if(v1 == d->face->v3) {
+		d->x = d->sidetot - 1;
+		d->y = d->sidetot - 1;
+		if(v2 == d->face->v2)
+			d->y -= mov;
+		else
+			d->x -= mov;
+	}
+	else if(v1 == d->face->v4) {
+		d->x = 0;
+		d->y = d->sidetot - 1;
+		if(v2 == d->face->v3)
+			d->x += mov;
+		else
+			d->y -= mov;
+	}
+}
+
 void multires_displacer_jump(MultiresDisplacer *d)
 {
 	if(d->sidendx == 0) {
@@ -1505,10 +1565,8 @@
 
 	data = d->grid->disps[d->y * d->sidetot + d->x];
 
-	if(d->invert) {
+	if(d->invert)
 		VecSubf(disp, co, *d->subco);
-		++d->subco;
-	}
 	else
 		VecCopyf(disp, data);
 
@@ -1518,8 +1576,11 @@
 		VecCopyf(data, disp);
 		
 	}
-	else
+	else {
+		if(d->type == 4)
+			VecMulf(disp, d->weight);
 		VecAddf(co, co, disp);
+	}
 
 	if(d->type == 2) {
 		if(d->sidendx == 0)
@@ -1547,6 +1608,7 @@
 {
 	MDisps *mdisps;
 	MVert *mvert;
+	MEdge *medge;
 	MFace *mface;
 	int i;
 
@@ -1557,29 +1619,34 @@
 	
 	if(mdisps) {
 		MultiresDisplacer d;
-		float (*subco)[3] = MultiresDM_get_subco(dm);
+		const int gridFaces = multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
+		const int edgeSize = multires_side_tot[MultiresDM_get_totlvl(dm) - 1] - 1;
+		ListBase *map = MultiresDM_get_vert_face_map(dm);
+		int S, x, y;
 		
 		mvert = CDDM_get_verts(dm);
+		medge = MultiresDM_get_ored(dm);
 		mface = MultiresDM_get_orfa(dm);
 
+		d.subco = MultiresDM_get_subco(dm);
+
 		/* For now just handle top-level sculpts */
 		for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
-			int gridFaces = multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
 			const int numVerts = mface[i].v4 ? 4 : 3;
-			int S, x, y;
 			
 			// convert from mvert->co to disps
-			multires_displacer_init(&d, dm, i, numVerts, 1);
-			d.subco = subco;
+			multires_displacer_init(&d, dm, i, 1);
 			multires_displacer_anchor(&d, 1, 0);
 			multires_displace(&d, mvert->co);
 			++mvert;
+			++d.subco;
 
 			for(S = 0; S < numVerts; ++S) {
 				multires_displacer_anchor(&d, 2, S);
 				for(x = 1; x < gridFaces; ++x) {
 					multires_displace(&d, mvert->co);
 					++mvert;
+					++d.subco;
 				}
 			}
 
@@ -1589,12 +1656,30 @@
 					for(x = 1; x < gridFaces; x++) {
 						multires_displace(&d, mvert->co);
 						++mvert;
+						++d.subco;
 					}
 					multires_displacer_jump(&d);
 				}
 			}
+		}
 
-			subco = d.subco;
+		for(i = 0; i < MultiresDM_get_totored(dm); ++i) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list