[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17379] branches/projection-paint/source/ blender/src/imagepaint.c: * clone tool didnt work when objects center was not 0, 0, 0

Campbell Barton ideasman42 at gmail.com
Sun Nov 9 15:34:32 CET 2008


Revision: 17379
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17379
Author:   campbellbarton
Date:     2008-11-09 15:34:32 +0100 (Sun, 09 Nov 2008)

Log Message:
-----------
* clone tool didnt work when objects center was not 0,0,0
* made backface culling work as expected in perspective view.

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-09 13:14:41 UTC (rev 17378)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-11-09 14:34:32 UTC (rev 17379)
@@ -1811,6 +1811,7 @@
 	/* Viewport vars */
 	float mat[3][3];
 	float f_no[3];
+	float viewPos[3]; /* for projection only - view location */
 	
 	float (*projScreenCo)[4]; /* Note, we could have 4D vectors are only needed for */
 	float projMargin;
@@ -1941,8 +1942,9 @@
 	if (ps->tool == PAINT_TOOL_CLONE) {
 		float projCo[4];
 		float *curs= give_cursor();
-		VECCOPY(projCo, curs); /* TODO - what if were in local view? - get some better way */
+		VECCOPY(projCo, curs);
 		Mat4MulVec4fl(ps->ob->imat, projCo);
+		VecSubf(projCo, projCo, ps->ob->obmat[3]);
 		projCo[3] = 1.0;
 		Mat4MulVec4fl(ps->projectMat, projCo);
 		ps->cloneOfs[0] = mval[0] - ((float)(curarea->winx/2.0)+(curarea->winx/2.0)*projCo[0]/projCo[3]);
@@ -1967,6 +1969,15 @@
 	ps->viewWidth  = ps->viewMax2D[0] - ps->viewMin2D[0];
 	ps->viewHeight = ps->viewMax2D[1] - ps->viewMin2D[1];
 	
+	if (!ps->projectIsOrtho) {
+		/* get the view direction relative to the objects matrix */
+		float imat[3][3];
+		VECCOPY(viewPos, G.vd->viewinv[3]);
+		Mat3CpyMat4(imat, ps->ob->imat);
+		Mat3MulVecfl(imat, viewPos);
+		VecAddf(viewPos, viewPos, ps->ob->imat[3]);
+	}
+	
 	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)) {
 			
@@ -1975,8 +1986,30 @@
 				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);
 				
-				if (Inpf(f_no, ps->viewDir) < 0) {
-					continue;
+				if (ps->projectIsOrtho) {
+					if (Inpf(f_no, ps->viewDir) < 0) {
+						continue;
+					}
+				} else {
+					float faceDir[3] = {0,0,0};
+					if (mf->v4)	{
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v1].co);
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v2].co);
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v3].co);
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v4].co);
+						VecMulf(faceDir, 1.0/4.0);
+					} else {
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v1].co);
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v2].co);
+						VecAddf(faceDir, faceDir, ps->dm_mvert[mf->v3].co);
+						VecMulf(faceDir, 1.0/3.0);
+					}
+					
+					VecSubf(faceDir, viewPos, faceDir);
+					
+					if (Inpf(f_no, faceDir) < 0) {
+						continue;
+					}
 				}
 			}
 			





More information about the Bf-blender-cvs mailing list