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;
+                                       }
                                }
                        }
                        


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to