[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15154] trunk/blender/source/blender/ render/intern/source/convertblender.c: made the quad split-direction options force splitting since planer quads with UV distortion would get very different results depending on the split direction .

Campbell Barton ideasman42 at gmail.com
Sun Jun 8 00:45:07 CEST 2008


Revision: 15154
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15154
Author:   campbellbarton
Date:     2008-06-08 00:44:18 +0200 (Sun, 08 Jun 2008)

Log Message:
-----------
made the quad split-direction options force splitting since planer quads with UV distortion would get very different results depending on the split direction.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-06-07 18:19:27 UTC (rev 15153)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-06-07 22:44:18 UTC (rev 15154)
@@ -3935,9 +3935,60 @@
 	}
 }
 
-static void check_non_flat_quads(ObjectRen *obr, int quad_flip)
+/* split quads for pradictable baking
+ * dir 1 == (0,1,2) (0,2,3),  2 == (1,3,0) (1,2,3) 
+ */
+static void split_quads(ObjectRen *obr, int dir) 
 {
 	VlakRen *vlr, *vlr1;
+	int a;
+
+	for(a=obr->totvlak-1; a>=0; a--) {
+		vlr= RE_findOrAddVlak(obr, a);
+		
+		/* test if rendering as a quad or triangle, skip wire */
+		if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) {
+			
+			if(vlr->v4) {
+
+				vlr1= RE_vlakren_copy(obr, vlr);
+				vlr1->flag |= R_FACE_SPLIT;
+				
+				if( dir==2 ) vlr->flag |= R_DIVIDE_24;
+				else vlr->flag &= ~R_DIVIDE_24;
+
+				/* new vertex pointers */
+				if (vlr->flag & R_DIVIDE_24) {
+					vlr1->v1= vlr->v2;
+					vlr1->v2= vlr->v3;
+					vlr1->v3= vlr->v4;
+
+					vlr->v3 = vlr->v4;
+					
+					vlr1->flag |= R_DIVIDE_24;
+				}
+				else {
+					vlr1->v1= vlr->v1;
+					vlr1->v2= vlr->v3;
+					vlr1->v3= vlr->v4;
+					
+					vlr1->flag &= ~R_DIVIDE_24;
+				}
+				vlr->v4 = vlr1->v4 = NULL;
+				
+				/* new normals */
+				CalcNormFloat(vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+				CalcNormFloat(vlr1->v3->co, vlr1->v2->co, vlr1->v1->co, vlr1->n);
+			}
+			/* clear the flag when not divided */
+			else vlr->flag &= ~R_DIVIDE_24;
+		}
+	}
+}
+
+static void check_non_flat_quads(ObjectRen *obr)
+{
+	VlakRen *vlr, *vlr1;
 	VertRen *v1, *v2, *v3, *v4;
 	float nor[3], xn, flen;
 	int a;
@@ -4003,22 +4054,16 @@
 					vlr1= RE_vlakren_copy(obr, vlr);
 					vlr1->flag |= R_FACE_SPLIT;
 					
-					if (quad_flip==0) { /* nonzero quad_flip is used to force dividing one way */
-						/* split direction based on vnorms */
-						CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, nor);
-						d1= nor[0]*vlr->v1->n[0] + nor[1]*vlr->v1->n[1] + nor[2]*vlr->v1->n[2];
+					/* split direction based on vnorms */
+					CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, nor);
+					d1= nor[0]*vlr->v1->n[0] + nor[1]*vlr->v1->n[1] + nor[2]*vlr->v1->n[2];
 
-						CalcNormFloat(vlr->v2->co, vlr->v3->co, vlr->v4->co, nor);
-						d2= nor[0]*vlr->v2->n[0] + nor[1]*vlr->v2->n[1] + nor[2]*vlr->v2->n[2];
-					
-						if( fabs(d1) < fabs(d2) ) vlr->flag |= R_DIVIDE_24;
-						else vlr->flag &= ~R_DIVIDE_24;
-					} else if (quad_flip==1) {
-						vlr->flag &= ~R_DIVIDE_24;
-					} else { /* quad_flip == 3 */
-						vlr->flag |= R_DIVIDE_24;
-					}
-					
+					CalcNormFloat(vlr->v2->co, vlr->v3->co, vlr->v4->co, nor);
+					d2= nor[0]*vlr->v2->n[0] + nor[1]*vlr->v2->n[1] + nor[2]*vlr->v2->n[2];
+				
+					if( fabs(d1) < fabs(d2) ) vlr->flag |= R_DIVIDE_24;
+					else vlr->flag &= ~R_DIVIDE_24;
+
 					/* new vertex pointers */
 					if (vlr->flag & R_DIVIDE_24) {
 						vlr1->v1= vlr->v2;
@@ -4072,11 +4117,11 @@
 			if((re->r.mode & R_RAYTRACE) && (re->r.mode & R_SHADOW)) 
 				set_phong_threshold(obr);
 			
-			if (re->flag & R_BAKING) {
+			if (re->flag & R_BAKING && re->r.bake_quad_split != 0) {
 				/* Baking lets us define a quad split order */
-				check_non_flat_quads(obr, re->r.bake_quad_split);
+				split_quads(obr, re->r.bake_quad_split);
 			} else {
-				check_non_flat_quads(obr, 0);
+				check_non_flat_quads(obr);
 			}
 			
 			set_fullsample_flag(re, obr);





More information about the Bf-blender-cvs mailing list