[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15445] branches/soc-2008-nicholasbishop/ source/blender/blenkernel/intern/multires.c: Added displacement subdivision ; displacements aren't lost when multires-subdividing now.

Nicholas Bishop nicholasbishop at gmail.com
Sat Jul 5 21:54:40 CEST 2008


Revision: 15445
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15445
Author:   nicholasbishop
Date:     2008-07-05 21:53:36 +0200 (Sat, 05 Jul 2008)

Log Message:
-----------
Added displacement subdivision; displacements aren't lost when multires-subdividing now. Subdivision is not yet entirely correct; edges and corners aren't handled correctly, so there is still a visible seam.

Modified Paths:
--------------
    branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c

Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-05 17:05:05 UTC (rev 15444)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c	2008-07-05 19:53:36 UTC (rev 15445)
@@ -1388,7 +1388,10 @@
 {
 	Mesh *me = get_mesh(ob);
 	MDisps *mdisps;
-	int i;
+	/*ListBase *map;
+	IndexNode *mapmem;*/
+	int i, j, k, slo, shi;
+	float *out;
 
 	if(mmd->totlvl == multires_max_levels) {
 		// TODO
@@ -1400,6 +1403,9 @@
 	++mmd->lvl;
 	++mmd->totlvl;
 
+	slo = multires_side_tot[mmd->totlvl - 2];
+	shi = multires_side_tot[mmd->totlvl - 1];
+
 	mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
 	if(!mdisps)
 		mdisps = CustomData_add_layer(&me->fdata, CD_MDISPS, CD_DEFAULT, NULL, me->totface);
@@ -1410,12 +1416,118 @@
 		float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps");
 
 		if(mdisps[i].disps) {
-			/* TODO: Transfer old disps over to the new */
+			/* face verts */
+			for(j = 0; j < slo - 1; ++j) {
+				for(k = 0; k < slo - 1; ++k) {
+					out = disps[(j*2+1)*shi + k*2+1];
+					VecAddf(out, mdisps[i].disps[j*slo + k], mdisps[i].disps[j*slo + k+1]);
+					VecAddf(out, out, mdisps[i].disps[(j+1)*slo + k]);
+					VecAddf(out, out, mdisps[i].disps[(j+1)*slo + k+1]);
+					VecMulf(out, 0.25);
+				}
+			}
+
+			/* vertical interior edge verts */
+			for(j = 0; j < slo - 1; ++j) {
+				for(k = 1; k < slo - 1; ++k) {
+					out = disps[(j*2+1)*shi + k*2];
+					VecAddf(out, mdisps[i].disps[j*slo + k], mdisps[i].disps[(j+1)*slo + k]);
+					VecAddf(out, out, disps[(j*2+1)*shi + k*2-1]);
+					VecAddf(out, out, disps[(j*2+1)*shi + k*2+1]);
+					VecMulf(out, 0.25);
+				}
+			}
+
+			/* horizontal interior edge verts */
+			for(j = 1; j < slo - 1; ++j) {
+				for(k = 0; k < slo - 1; ++k) {
+					out = disps[j*2*shi + k*2+1];
+					VecAddf(out, mdisps[i].disps[j*slo + k], mdisps[i].disps[j*slo + k+1]);
+					VecAddf(out, out, disps[(j*2-1)*shi + k*2+1]);
+					VecAddf(out, out, disps[(j*2+1)*shi + k*2+1]);
+					VecMulf(out, 0.25);
+				}
+			}
+
+			/* interior orig verts */
+			for(j = 1; j < slo - 1; ++j) {
+				for(k = 1; k < slo - 1; ++k) {
+					float avg[3];
+					out = disps[j*2*shi + k*2];
+					VecCopyf(out, mdisps[i].disps[j*slo+k]);
+
+					VecAddf(avg, disps[(j*2-1)*shi + k*2], disps[(j*2+1)*shi + k*2]);
+					VecAddf(avg, avg, disps[j*2*shi + k*2-1]);
+					VecAddf(avg, avg, disps[j*2*shi + k*2+1]);
+					VecMulf(avg, 0.5);
+					VecAddf(out, out, avg);
+
+					VecAddf(avg, disps[(j*2-1)*shi + k*2-1], disps[(j*2-1)*shi + k*2+1]);
+					VecAddf(avg, avg, disps[(j*2+1)*shi + k*2-1]);
+					VecAddf(avg, avg, disps[(j*2+1)*shi + k*2+1]);
+					VecMulf(avg, 0.25);
+					VecAddf(out, out, avg);
+
+					VecMulf(out, 0.25);
+				}
+			}
+
+			/* exterior edge verts, first pass */
+			for(j = 0; j < slo - 1; ++j) {
+				for(k = 0; k < slo; k += slo - 1) {
+					out = disps[(j*2+1)*shi + k*2];
+					VecAddf(out, mdisps[i].disps[j*slo + k], mdisps[i].disps[(j+1)*slo + k]);
+					VecMulf(out, 0.5);
+
+					out = disps[k*2*shi + j*2+1];
+					VecAddf(out, mdisps[i].disps[k*slo + j], mdisps[i].disps[k*slo + j+1]);
+					VecMulf(out, 0.5);
+				}
+			}
+
+			/* exterior orig verts, first pass */
+			for(j = 1; j < slo - 1; ++j) {
+				for(k = 0; k < slo; k += slo - 1) {
+					out = disps[j*2*shi + k*2];
+					VecAddf(out, disps[(j*2-1)*shi + k*2], disps[(j*2+1)*shi + k*2]);
+					VecMulf(out, 0.5);
+
+					out = disps[k*2*shi + j*2];
+					VecAddf(out, disps[k*2*shi + j*2-1], disps[k*2*shi + j*2+1]);
+					VecMulf(out, 0.5);
+				}
+			}
+
+			/* corner verts */
+			VecCopyf(disps[0], mdisps[i].disps[0]);
+			VecCopyf(disps[shi - 1], mdisps[i].disps[slo - 1]);
+			VecCopyf(disps[(shi-1)*shi], mdisps[i].disps[(slo-1)*slo]);
+			VecCopyf(disps[shi*shi-1], mdisps[i].disps[slo*slo-1]);
+			
 			MEM_freeN(mdisps[i].disps);
 		}
+
 		mdisps[i].disps = disps;
 		mdisps[i].totdisp = totdisp;
 	}
+
+
+	/* TODO: the edge and corner displacements aren't being subdivided according to catmull-clark rules */
+
+	/* Subdividing displacements at the edges of faces requires mesh connectivity data */
+	/*create_vert_face_map(&map, &mapmem, me->mface, me->totvert, me->totface);
+	for(i = 0; i < me->totface; ++i) {
+		for(j = 0; j < slo - 1; ++j) {
+			for(k = 0; k < slo; k += slo - 1) {
+				out = mdisps[i].disps[(j*2+1)*shi + k*2];
+
+				out = mdisps[i].disps[k*2*shi + j*2+1];
+			}
+		}
+	}
+
+	MEM_freeN(map);
+	MEM_freeN(mapmem);*/
 }
 
 void multiresModifier_setLevel(void *mmd_v, void *ob_v)





More information about the Bf-blender-cvs mailing list