[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17306] branches/projection-paint/source/ blender/src/imagepaint.c: last commit broke projection painting in perspective mode.

Campbell Barton ideasman42 at gmail.com
Mon Nov 3 12:06:23 CET 2008


Revision: 17306
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17306
Author:   campbellbarton
Date:     2008-11-03 12:06:22 +0100 (Mon, 03 Nov 2008)

Log Message:
-----------
last commit broke projection painting in perspective mode.

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c	2008-11-03 09:59:08 UTC (rev 17305)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-11-03 11:06:22 UTC (rev 17306)
@@ -178,12 +178,13 @@
 	float (*projectVertScreenCos)[3];	/* verts projected into floating point screen space */
 	
 	/* options for projection painting */
-	short projectOcclude;		/* Use raytraced occlusion? - ortherwise will paint right through to the back*/
-	short projectBackfaceCull;	/* ignore faces with normals pointing away, skips a lot of raycasts if your normals are correctly flipped */
+	short projectIsIsOcclude;		/* Use raytraced occlusion? - ortherwise will paint right through to the back*/
+	short projectIsBackfaceCull;	/* ignore faces with normals pointing away, skips a lot of raycasts if your normals are correctly flipped */
+	short projectIsOrtho;
 	
 	float projectMat[4][4];		/* Projection matrix, use for getting screen coords */
 	float viewMat[4][4];
-	float viewDir[3];			/* View vector, use for projectBackfaceCull and for ray casting with an ortho viewport  */
+	float viewDir[3];			/* View vector, use for projectIsBackfaceCull and for ray casting with an ortho viewport  */
 	
 	float viewMin2D[2];			/* 2D bounds for mesh verts on the screen's plane (screenspace) */
 	float viewMax2D[2]; 
@@ -607,7 +608,9 @@
 	float pixelScreenCo[3]; /* for testing occlusion we need the depth too, but not for saving into ProjectPixel */
 	int bucket_index;
 	
+	//float pxWorldCo[3]; 
 	
+	
 	INIT_MINMAX2(min_uv, max_uv);
 	
 	i = mf->v4 ? 3:2;
@@ -652,21 +655,24 @@
 			for (x = xmini; x < xmaxi; x++) {
 				uv[0] = (((float)x)+0.5) / (float)ibuf->x;
 				
+				
 				/* Get the world coord for the point in uv space */
-				w1 = AreaF2Dfl(tf->uv[sc->v[1]], tf->uv[sc->v[2]], uv);
-				w2 = AreaF2Dfl(tf->uv[sc->v[2]], tf->uv[sc->v[0]], uv);
-				w3 = AreaF2Dfl(tf->uv[sc->v[0]], tf->uv[sc->v[1]], uv);
+				if (ps->projectIsOrtho) {
+					w1 = AreaF2Dfl(tf->uv[sc->v[1]], tf->uv[sc->v[2]], uv);
+					w2 = AreaF2Dfl(tf->uv[sc->v[2]], tf->uv[sc->v[0]], uv);
+					w3 = AreaF2Dfl(tf->uv[sc->v[0]], tf->uv[sc->v[1]], uv);
+				} else { /* prespective mode needs an interpolation */
+					w1 = AreaF2Dfl(tf->uv[sc->v[1]], tf->uv[sc->v[2]], uv) / v1co[2];
+					w2 = AreaF2Dfl(tf->uv[sc->v[2]], tf->uv[sc->v[0]], uv) / v2co[2];
+					w3 = AreaF2Dfl(tf->uv[sc->v[0]], tf->uv[sc->v[1]], uv) / v3co[2];
+				}
+				
 				wtot = w1 + w2 + w3;
-				
 				w1 /= wtot; w2 /= wtot; w3 /= wtot;
 				
-				i=2;
-				do {
-					pixelScreenCo[i] = v1co[i]*w1 + v2co[i]*w2 + v3co[i]*w3;
-					/* incase we want the world pixel coords */
-					/* pixelWorldCo[i] = ps->dm_mvert[ (*(&mf->v1 + sc->v[0])) ].co[i][0] * w1 ....; */
-				} while (i--);
-				/* Done building the world coord for this UV */
+				pixelScreenCo[0] = v1co[0]*w1 + v2co[0]*w2 + v3co[0]*w3;
+				pixelScreenCo[1] = v1co[1]*w1 + v2co[1]*w2 + v3co[1]*w3;
+				pixelScreenCo[2] = v1co[2]*w1 + v2co[2]*w2 + v3co[2]*w3;
 				
 				bucket_index = project_paint_BucketOffset(ps, pixelScreenCo);
 				
@@ -674,7 +680,7 @@
 				 * Then this can be used to index the bucket array */
 				
 				/* Is this UV visible from the view? - raytrace */
-				if (ps->projectOcclude==0 || !project_bucket_point_occluded(ps, bucket_index, face_index, pixelScreenCo)) {
+				if (ps->projectIsOcclude==0 || !project_bucket_point_occluded(ps, bucket_index, face_index, pixelScreenCo)) {
 					
 					/* done with view3d_project_float inline */
 					projPixel = (ProjectPixel *)BLI_memarena_alloc( ps->projectArena, sizeof(ProjectPixel) );
@@ -938,6 +944,11 @@
 	ps->projectVertScreenCos = BLI_memarena_alloc( ps->projectArena, sizeof(float) * ps->dm_totvert * 3);
 	projScreenCo = ps->projectVertScreenCos;
 	
+	/* TODO - check cameras mode too */
+	if (G.vd->persp == V3D_ORTHO) {
+		ps->projectIsOrtho = 1;
+	}
+	
 	INIT_MINMAX2(ps->viewMin2D, ps->viewMax2D);
 	
 	for(a=0; a < ps->dm_totvert; a++, projScreenCo++) {
@@ -965,7 +976,7 @@
 	for( a = 0, tf = ps->dm_mtface, mf = ps->dm_mface; a < ps->dm_totface; mf++, tf++, a++ ) {
 		if (tf->tpage && ((G.f & G_FACESELECT)==0 || mf->flag & ME_FACE_SEL)) {
 			
-			if (ps->projectBackfaceCull) {
+			if (ps->projectIsBackfaceCull) {
 				/* TODO - we dont really need the normal, just the direction, save a sqrt? */
 				if (mf->v4)	CalcNormFloat4(ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, f_no);
 				else		CalcNormFloat(ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, f_no);
@@ -1809,8 +1820,8 @@
 		/* setup projection painting data */
 		memset(&ps, 0, sizeof(ps));
 		
-		ps.projectBackfaceCull = 1;
-		ps.projectOcclude = 1;
+		ps.projectIsBackfaceCull = 1;
+		ps.projectIsOcclude = 1;
 		
 		project_paint_begin(&s, &ps);
 		





More information about the Bf-blender-cvs mailing list