[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17540] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Better support for triangles with the new tangent calculations.

Nicholas Bishop nicholasbishop at gmail.com
Sun Nov 23 03:42:37 CET 2008


Revision: 17540
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17540
Author:   nicholasbishop
Date:     2008-11-23 03:42:32 +0100 (Sun, 23 Nov 2008)

Log Message:
-----------
Better support for triangles with the new tangent calculations.

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

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h	2008-11-23 02:42:32 UTC (rev 17540)
@@ -56,6 +56,7 @@
 struct MVert *MultiresDM_get_subco(struct DerivedMesh *);
 struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
 struct ListBase *MultiresDM_get_vert_edge_map(struct DerivedMesh *);
+int *MultiresDM_get_face_offsets(struct DerivedMesh *);
 int MultiresDM_get_totlvl(struct DerivedMesh *);
 int MultiresDM_get_lvl(struct DerivedMesh *);
 void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c	2008-11-23 02:42:32 UTC (rev 17540)
@@ -61,6 +61,7 @@
 
 #include <string.h>
 #include <limits.h>
+#include <math.h>
 
 typedef struct {
 	DerivedMesh dm;
@@ -1160,10 +1161,9 @@
 	float (*orco)[3];
 	MVert *subco;
 
-	float (*norm)[3];
-
 	ListBase *vert_face_map, *vert_edge_map;
 	IndexNode *vert_face_map_mem, *vert_edge_map_mem;
+	int *face_offsets;
 
 	Mesh *me;
 	int flags;
@@ -1182,7 +1182,6 @@
 	if(DM_release(dm)) {
 		MEM_freeN(mrdm->subco);
 		MEM_freeN(mrdm->orco);
-		MEM_freeN(mrdm->norm);
 		if(mrdm->vert_face_map)
 			MEM_freeN(mrdm->vert_face_map);
 		if(mrdm->vert_face_map_mem)
@@ -1191,11 +1190,13 @@
 			MEM_freeN(mrdm->vert_edge_map);
 		if(mrdm->vert_edge_map_mem)
 			MEM_freeN(mrdm->vert_edge_map_mem);
+		if(mrdm->face_offsets)
+			MEM_freeN(mrdm->face_offsets);
 		MEM_freeN(mrdm);
 	}
 }
 
-static void MultiresDM_calc_norm(MultiresDM *mrdm)
+/*static void MultiresDM_calc_norm(MultiresDM *mrdm)
 {
 	float (*v)[3] = mrdm->orco;
 	int i;
@@ -1219,7 +1220,7 @@
 
 	for(i = 0; i < mrdm->me->totvert; ++i)
 		Normalize(mrdm->norm[i]);
-}
+}*/
 
 DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts, int numEdges, int numFaces)
 {
@@ -1278,16 +1279,6 @@
 	return ((MultiresDM*)dm)->me;
 }
 
-void *MultiresDM_get_vertnorm(DerivedMesh *dm)
-{
-	MultiresDM *mrdm = (MultiresDM*)dm;
-
-	if(!mrdm->norm)
-		MultiresDM_calc_norm(mrdm);
-
-	return mrdm->norm;
-}
-
 void *MultiresDM_get_orco(DerivedMesh *dm)
 {
 	return ((MultiresDM*)dm)->orco;
@@ -1341,6 +1332,28 @@
 	return mrdm->vert_edge_map;
 }
 
+int *MultiresDM_get_face_offsets(DerivedMesh *dm)
+{
+	MultiresDM *mrdm = (MultiresDM*)dm;
+	int i, totface, accum = 0;
+
+	if(!mrdm->face_offsets) {
+		int len = (int)pow(2, mrdm->lvl - 2) - 1;
+		int area = len * len;
+		int t = 1 + len * 3 + area * 3, q = t + len + area;
+
+		totface = dm->getNumFaces(dm);
+		mrdm->face_offsets = MEM_callocN(sizeof(int) * totface, "mrdm face offsets");
+		for(i = 0; i < totface; ++i) {
+			mrdm->face_offsets[i] = accum;
+
+			accum += (mrdm->me->mface[i].v4 ? q : t);
+		}
+	}
+
+	return mrdm->face_offsets;
+}
+
 int *MultiresDM_get_flags(DerivedMesh *dm)
 {
 	return &((MultiresDM*)dm)->flags;

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-11-23 02:42:32 UTC (rev 17540)
@@ -537,16 +537,26 @@
 	int dir[4];
 } DisplacerEdges;
 
+typedef struct DisplacerSpill {
+	/* Index of face (in base mesh), -1 for none */
+	int face;
+
+	/* Spill flag */
+	/* 1 = Negative variable axis */
+	/* 2 = Near fixed axis */
+	/* 4 = Flip axes */
+	int f;
+
+	/* Neighboring edges */
+	DisplacerEdges edges;
+} DisplacerSpill;
+
 typedef struct MultiresDisplacer {
 	Mesh *me;
 	MDisps *grid;
 	/* To be removed */
 	MFace *face;
 	
-	/* For matrix calc */
-	float mat_target[3];
-	float mat_center[3];
-	float (*mat_norms)[3];
 	int dm_first_base_vert_index;
 
 	int spacing;
@@ -554,7 +564,6 @@
 	int sidendx;
 	int type;
 	int invert;
-	float (*orco)[3];
 	MVert *subco;
 	int subco_index, face_index;
 	float weight;
@@ -562,15 +571,14 @@
 	/* Valence for each corner */
 	int valence[4];
 
-	/* Indices of neighboring faces (or -1 for no neighbor) */
-	int face_spill_x, face_spill_y;
-	/* 1 = Negative variable axis */
-	/* 2 = Near fixed axis */
-	/* 4 = Flip axes */
-	int spill_x, spill_y;
-	/* Neighboring edges for current face and spill faces */
-	DisplacerEdges edges_primary, edges_spill_x, edges_spill_y;
+	/* Neighboring edges for current face */
+	DisplacerEdges edges_primary;
 
+	/* Neighboring faces */
+	DisplacerSpill spill_x, spill_y;
+
+	int *face_offsets;
+
 	int x, y, ax, ay;
 } MultiresDisplacer;
 
@@ -585,6 +593,7 @@
 	ListBase *emap = MultiresDM_get_vert_edge_map(dm);
 	IndexNode *n;
 	int i, end = f->v4 ? 4 : 3;
+	int offset = dm->getNumVerts(dm) - d->me->totvert - d->me->totedge * d->interior_st;
 
 	for(i = 0; i < end; ++i) {
 		int vcur = mface_v(f, i);
@@ -602,7 +611,7 @@
 					de->dir[i] = -1;
 					de->base[i] += d->interior_st - 1;
 				}
-				de->base[i] += d->me->totface * d->interior_st * d->interior_st;
+				de->base[i] += offset;
 				break;
 			}
 		}
@@ -628,9 +637,11 @@
 	ListBase *map = MultiresDM_get_vert_face_map(dm);
 	IndexNode *n1, *n2;
 	int v4 = d->face->v4 ? d->face->v4 : d->face->v1;
-	int crn[2];
+	int crn[2], lv;
 
-	d->face_spill_x = d->face_spill_y = -1;
+	memset(&d->spill_x, 0, sizeof(DisplacerSpill));
+	memset(&d->spill_y, 0, sizeof(DisplacerSpill));
+	d->spill_x.face = d->spill_y.face = -1;
 
 	for(n1 = map[d->face->v3].first; n1; n1 = n1->next) {
 		if(n1->index == d->face_index)
@@ -638,60 +649,62 @@
 
 		for(n2 = map[d->face->v2].first; n2; n2 = n2->next) {
 			if(n1->index == n2->index)
-				d->face_spill_x = n1->index;
+				d->spill_x.face = n1->index;
 		}
 		for(n2 = map[v4].first; n2; n2 = n2->next) {
 			if(n1->index == n2->index)
-				d->face_spill_y = n1->index;
+				d->spill_y.face = n1->index;
 		}
 	}
 
-	if(d->face_spill_x != -1) {
+	if(d->spill_x.face != -1) {
 		/* Neighbor of v2/v3 found, find flip and orientation */
-		find_face_corners(&mface[d->face_spill_x], d->face->v2, d->face->v3, crn);
+		find_face_corners(&mface[d->spill_x.face], d->face->v2, d->face->v3, crn);
+		lv = mface[d->spill_x.face].v4 ? 3 : 2;
 
-		if(crn[0] == 0 && crn[1] == 3)
-			d->spill_x = 0+2+0;
-		else if(crn[0] == 3 && crn[1] == 0)
-			d->spill_x = 1+2+0;
+		if(crn[0] == 0 && crn[1] == lv)
+			d->spill_x.f = 0+2+0;
+		else if(crn[0] == lv && crn[1] == 0)
+			d->spill_x.f = 1+2+0;
 		else if(crn[0] == 1 && crn[1] == 0)
-			d->spill_x = 1+2+4;
+			d->spill_x.f = 1+2+4;
 		else if(crn[0] == 0 && crn[1] == 1)
-			d->spill_x = 0+2+4;
+			d->spill_x.f = 0+2+4;
 		else if(crn[0] == 2 && crn[1] == 1)
-			d->spill_x = 1+0+0;
+			d->spill_x.f = 1+0+0;
 		else if(crn[0] == 1 && crn[1] == 2)
-			d->spill_x = 0+0+0;
+			d->spill_x.f = 0+0+0;
 		else if(crn[0] == 3 && crn[1] == 2)
-			d->spill_x = 0+0+4;
+			d->spill_x.f = 0+0+4;
 		else if(crn[0] == 2 && crn[1] == 3)
-			d->spill_x = 1+0+4;
+			d->spill_x.f = 1+0+4;
 
-		find_displacer_edges(d, dm, &d->edges_spill_x, &mface[d->face_spill_x]);
+		find_displacer_edges(d, dm, &d->spill_x.edges, &mface[d->spill_x.face]);
 	}
 
-	if(d->face_spill_y != -1) {
+	if(d->spill_y.face != -1) {
 		/* Neighbor of v3/v4 found, find flip and orientation */
-		find_face_corners(&mface[d->face_spill_y], d->face->v3, v4, crn);
+		find_face_corners(&mface[d->spill_y.face], d->face->v3, v4, crn);
+		lv = mface[d->spill_y.face].v4 ? 3 : 2;
 
 		if(crn[0] == 1 && crn[1] == 0)
-			d->spill_y = 1+2+0;
+			d->spill_y.f = 1+2+0;
 		else if(crn[0] == 0 && crn[1] == 1)
-			d->spill_y = 0+2+0;
+			d->spill_y.f = 0+2+0;
 		else if(crn[0] == 2 && crn[1] == 1)
-			d->spill_y = 1+0+4;
+			d->spill_y.f = 1+0+4;
 		else if(crn[0] == 1 && crn[1] == 2)
-			d->spill_y = 0+0+4;
+			d->spill_y.f = 0+0+4;
 		else if(crn[0] == 3 && crn[1] == 2)
-			d->spill_y = 0+0+0;
+			d->spill_y.f = 0+0+0;
 		else if(crn[0] == 2 && crn[1] == 3)
-			d->spill_y = 1+0+0;
-		else if(crn[0] == 0 && crn[1] == 3)
-			d->spill_y = 0+2+4;
-		else if(crn[0] == 3 && crn[1] == 0)
-			d->spill_y = 1+2+4;
+			d->spill_y.f = 1+0+0;
+		else if(crn[0] == 0 && crn[1] == lv)
+			d->spill_y.f = 0+2+4;
+		else if(crn[0] == lv && crn[1] == 0)
+			d->spill_y.f = 1+2+4;
 
-		find_displacer_edges(d, dm, &d->edges_spill_y, &mface[d->face_spill_y]);
+		find_displacer_edges(d, dm, &d->spill_y.edges, &mface[d->spill_y.face]);
 	}
 }
 
@@ -699,9 +712,11 @@
 {
 	int i;
 
+	d->valence[3] = -1;
+
 	/* Set the vertex valence for the corners */
 	for(i = 0; i < (d->face->v4 ? 4 : 3); ++i)
-		d->valence[i] = BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[((unsigned*)(&d->face->v1))[i]]);
+		d->valence[i] = BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[mface_v(d->face, i)]);
 }
 
 static void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
@@ -712,13 +727,12 @@
 	d->me = me;
 	d->face = me->mface + face_index;
 	d->face_index = face_index;
+	d->face_offsets = MultiresDM_get_face_offsets(dm);
 	/* Get the multires grid from customdata */
 	d->grid = CustomData_get_layer(&me->fdata, CD_MDISPS);
 	if(d->grid)
 		d->grid += face_index;
 
-	d->mat_norms = MultiresDM_get_vertnorm(dm);
-
 	d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
 	d->sidetot = multires_side_tot[MultiresDM_get_lvl(dm) - 1];
 	d->interior_st = d->sidetot - 2;
@@ -778,41 +792,55 @@
 
 static void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int v2, int x)
 {
-	const int mov = x;
-
 	d->type = 4;
 
 	if(v1 == d->face->v1) {
 		d->x = 0;
 		d->y = 0;
 		if(v2 == d->face->v2)
-			d->x += mov;
+			d->x += x;
+		else if(v2 == d->face->v3) {
+			if(x < d->sidetot / 2)
+				d->y = x;
+			else {
+				d->x = x;
+				d->y = d->sidetot - 1;
+			}
+		}
 		else
-			d->y += mov;
+			d->y += x;
 	}
 	else if(v1 == d->face->v2) {
 		d->x = d->sidetot - 1;
 		d->y = 0;
 		if(v2 == d->face->v1)
-			d->x -= mov;
+			d->x -= x;
 		else
-			d->y += mov;
+			d->y += x;
 	}
 	else if(v1 == d->face->v3) {
 		d->x = d->sidetot - 1;
 		d->y = d->sidetot - 1;
 		if(v2 == d->face->v2)
-			d->y -= mov;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list