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

Log Message:
-----------
disabled painting to offscreen buckets, was causing priblems when zooming in on 
large models. also simplified backface test.

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-16 
16:53:37 UTC (rev 17474)
+++ branches/projection-paint/source/blender/src/imagepaint.c   2008-11-16 
18:25:15 UTC (rev 17475)
@@ -160,6 +160,7 @@
 #define PROJ_DEBUG_NOSCANLINE 1
 //#define PROJ_DEBUG_NOSEAMBLEED 1
 //#define PROJ_DEBUG_PRINT_THREADS 1
+#define PROJ_DEBUG_WINCLIP 1
 
 /* projectFaceSeamFlags options */
 //#define PROJ_FACE_IGNORE     1<<0    /* When the face is hidden, backfacing 
or occluded */
@@ -2209,16 +2210,18 @@
        ps->screen_max[1] += projMargin;
        ps->screen_min[1] -= projMargin;
        
+#ifdef PROJ_DEBUG_WINCLIP
+       CLAMP(ps->screen_min[0], -ps->brush->size, curarea->winx + 
ps->brush->size);
+       CLAMP(ps->screen_max[0], -ps->brush->size, curarea->winx + 
ps->brush->size);
+
+       CLAMP(ps->screen_min[1], -ps->brush->size, curarea->winy + 
ps->brush->size);
+       CLAMP(ps->screen_max[1], -ps->brush->size, curarea->winy + 
ps->brush->size);
+#endif
        
        /* only for convenience */
        ps->screen_width  = ps->screen_max[0] - ps->screen_min[0];
        ps->screen_height = ps->screen_max[1] - ps->screen_min[1];
        
-       /* done with screen coords */
-       
-       //ps->buckets_x = G.rt ? G.rt : PROJ_BUCKET_BRUSH_DIV;
-       //ps->buckets_y = G.rt ? G.rt : PROJ_BUCKET_BRUSH_DIV;
-
        ps->buckets_x = (int)(ps->screen_width / (((float)ps->brush->size) / 
PROJ_BUCKET_BRUSH_DIV));
        ps->buckets_y = (int)(ps->screen_height / (((float)ps->brush->size) / 
PROJ_BUCKET_BRUSH_DIV));
        
@@ -2329,46 +2332,62 @@
        
        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)) {
-
+                       
+                       float *v1coSS, *v2coSS, *v3coSS, *v4coSS;
+                       
+                       v1coSS = ps->screenCoords[mf->v1]; 
+                       v2coSS = ps->screenCoords[mf->v2]; 
+                       v3coSS = ps->screenCoords[mf->v3];
+                       if (mf->v4) {
+                               v4coSS = ps->screenCoords[mf->v4]; 
+                       }
+                       
+                       
                        if (!ps->is_ortho) {
-                               if (    ps->screenCoords[mf->v1][0]==MAXFLOAT ||
-                                               
ps->screenCoords[mf->v2][0]==MAXFLOAT ||
-                                               
ps->screenCoords[mf->v3][0]==MAXFLOAT ||
-                                               (mf->v4 && 
ps->screenCoords[mf->v4][0]==MAXFLOAT)
+                               if (    v1coSS[0]==MAXFLOAT ||
+                                               v2coSS[0]==MAXFLOAT ||
+                                               v3coSS[0]==MAXFLOAT ||
+                                               (mf->v4 && v4coSS[0]==MAXFLOAT)
                                ) {
                                        continue;
                                }
                        }
+                       
+#ifdef PROJ_DEBUG_WINCLIP
+                       /* ignore faces outside the view */
+                       if (
+                                  (v1coSS[0] < ps->screen_min[0] &&
+                                       v2coSS[0] < ps->screen_min[0] &&
+                                       v3coSS[0] < ps->screen_min[0] &&
+                                       (mf->v4 && v4coSS[0] < 
ps->screen_min[0] )) ||
+                                       
+                                  (v1coSS[0] > ps->screen_max[0] &&
+                                       v2coSS[0] > ps->screen_max[0] &&
+                                       v3coSS[0] > ps->screen_max[0] &&
+                                       (mf->v4 && v4coSS[0] > 
ps->screen_max[0] )) ||
+                                       
+                                  (v1coSS[1] < ps->screen_min[1] &&
+                                       v2coSS[1] < ps->screen_min[1] &&
+                                       v3coSS[1] < ps->screen_min[1] &&
+                                       (mf->v4 && v4coSS[1] < 
ps->screen_min[1] )) ||
+                                       
+                                  (v1coSS[1] > ps->screen_max[1] &&
+                                       v2coSS[1] > ps->screen_max[1] &&
+                                       v3coSS[1] > ps->screen_max[1] &&
+                                       (mf->v4 && v4coSS[1] > 
ps->screen_max[1] ))
+                       ) {
+                               continue;
+                       }
+                       
+#endif //PROJ_DEBUG_WINCLIP
 
                        if (ps->do_backfacecull) {
                                /* 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);
+                               if (mf->v4)     CalcNormFloat4(v1coSS, v2coSS, 
v3coSS, v4coSS, f_no);
+                               else            CalcNormFloat(v1coSS, v2coSS, 
v3coSS, f_no);
                                
-                               if (ps->is_ortho) {
-                                       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;
-                                       }
+                               if (f_no[2] < 0.0) {
+                                       continue;
                                }
                        }
                        


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to