[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17475] branches/projection-paint/source/ blender/src/imagepaint.c: disabled painting to offscreen buckets, was causing priblems when zooming in on large models.

Campbell Barton ideasman42 at gmail.com
Sun Nov 16 19:25:16 CET 2008


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





More information about the Bf-blender-cvs mailing list