[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14072] trunk/blender/source/blender/ render/intern:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Mar 12 21:22:05 CET 2008


Revision: 14072
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14072
Author:   blendix
Date:     2008-03-12 21:22:05 +0100 (Wed, 12 Mar 2008)

Log Message:
-----------

Baking now does material texture anti-aliasing if the OSA button is
enabled, result of that is mainly visible for image textures.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/occlusion.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c
    trunk/blender/source/blender/render/intern/source/shadeinput.c

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2008-03-12 20:22:05 UTC (rev 14072)
@@ -275,7 +275,7 @@
 	Object *ob, *par;
 	int index, psysindex, lay;
 
-	float mat[4][4], imat[3][3];
+	float mat[4][4], nmat[3][3]; /* nmat is inverse mat tranposed */
 	short flag;
 
 	float dupliorco[3], dupliuv[2];

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -4164,7 +4164,8 @@
 			Mat4MulMat4(obi->mat, imat, obimat);
 
 			Mat3CpyMat4(nmat, obi->mat);
-			Mat3Inv(obi->imat, nmat);
+			Mat3Inv(obi->nmat, nmat);
+			Mat3Transp(obi->nmat);
 
 			if(!first) {
 				re->totvert += obr->totvert;
@@ -4193,7 +4194,8 @@
 	Mat4MulMat4(obi->mat, imat, obimat);
 
 	Mat3CpyMat4(nmat, obi->mat);
-	Mat3Inv(obi->imat, nmat);
+	Mat3Inv(obi->nmat, nmat);
+	Mat3Transp(obi->nmat);
 
 	re->totvert += obr->totvert;
 	re->totvlak += obr->totvlak;
@@ -5511,7 +5513,6 @@
 
 	/* renderdata setup and exceptions */
 	re->r= scene->r;
-	re->r.mode &= ~R_OSA;
 	re->flag |= R_GLOB_NOPUNOFLIP;
 	re->excludeob= actob;
 	if(type == RE_BAKE_LIGHT)

Modified: trunk/blender/source/blender/render/intern/source/envmap.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/envmap.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/envmap.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -245,7 +245,8 @@
 			Mat4One(obi->mat);
 
 		Mat3CpyMat4(cmat, obi->mat);
-		Mat3Inv(obi->imat, cmat);
+		Mat3Inv(obi->nmat, cmat);
+		Mat3Transp(obi->nmat);
 
 		/* indicate the renderer has to use transform matrices */
 		if(mode==0)

Modified: trunk/blender/source/blender/render/intern/source/occlusion.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/occlusion.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/occlusion.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -324,17 +324,8 @@
 		normal[1]= -vlr->n[1];
 		normal[2]= -vlr->n[2];
 
-		if(obi->flag & R_TRANSFORMED) {
-			float xn, yn, zn, (*imat)[3]= obi->imat;
-
-			xn= normal[0];
-			yn= normal[1];
-			zn= normal[2];
-
-			normal[0]= imat[0][0]*xn + imat[0][1]*yn + imat[0][2]*zn;
-			normal[1]= imat[1][0]*xn + imat[1][1]*yn + imat[1][2]*zn;
-			normal[2]= imat[2][0]*xn + imat[2][1]*yn + imat[2][2]*zn;
-		}
+		if(obi->flag & R_TRANSFORMED)
+			Mat3MulVecfl(obi->nmat, normal);
 	}
 
 	if(area) {

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -29,6 +29,7 @@
 /* system includes */
 #include <stdio.h>
 #include <math.h>
+#include <float.h>
 #include <string.h>
 
 /* External modules: */
@@ -1800,6 +1801,8 @@
 	
 	int usemask;
 	char *rect_mask; /* bake pixel mask */
+
+	float dxco[3], dyco[3];
 } BakeShade;
 
 /* bake uses a char mask to know what has been baked */
@@ -1899,6 +1902,7 @@
 	shi->xs= x;
 	shi->ys= y;
 	
+	shade_input_set_uv(shi);
 	shade_input_set_normals(shi);
 
 	/* no normal flip */
@@ -2081,6 +2085,55 @@
 	return hit;
 }
 
+static void bake_set_vlr_dxyco(BakeShade *bs, float *uv1, float *uv2, float *uv3)
+{
+	VlakRen *vlr= bs->vlr;
+	float A, d1, d2, d3, *v1, *v2, *v3;
+
+	if(bs->quad) {
+		v1= vlr->v1->co;
+		v2= vlr->v3->co;
+		v3= vlr->v4->co;
+	}
+	else {
+		v1= vlr->v1->co;
+		v2= vlr->v2->co;
+		v3= vlr->v3->co;
+	}
+
+	/* formula derived from barycentric coordinates:
+	 * (uvArea1*v1 + uvArea2*v2 + uvArea3*v3)/uvArea
+	 * then taking u and v partial derivatives to get dxco and dyco */
+	A= (uv2[0] - uv1[0])*(uv3[1] - uv1[1]) - (uv3[0] - uv1[0])*(uv2[1] - uv1[1]);
+
+	if(fabs(A) > FLT_EPSILON) {
+		A= 0.5f/A;
+
+		d1= uv2[1] - uv3[1];
+		d2= uv3[1] - uv1[1];
+		d3= uv1[1] - uv2[1];
+		bs->dxco[0]= (v1[0]*d1 + v2[0]*d2 + v3[0]*d3)*A;
+		bs->dxco[1]= (v1[1]*d1 + v2[1]*d2 + v3[1]*d3)*A;
+		bs->dxco[2]= (v1[2]*d1 + v2[2]*d2 + v3[2]*d3)*A;
+
+		d1= uv3[0] - uv2[0];
+		d2= uv1[0] - uv3[0];
+		d3= uv2[0] - uv1[0];
+		bs->dyco[0]= (v1[0]*d1 + v2[0]*d2 + v3[0]*d3)*A;
+		bs->dyco[1]= (v1[1]*d1 + v2[1]*d2 + v3[1]*d3)*A;
+		bs->dyco[2]= (v1[2]*d1 + v2[2]*d2 + v3[2]*d3)*A;
+	}
+	else {
+		bs->dxco[0]= bs->dxco[1]= bs->dxco[2]= 0.0f;
+		bs->dyco[0]= bs->dyco[1]= bs->dyco[2]= 0.0f;
+	}
+
+	if(bs->obi->flag & R_TRANSFORMED) {
+		Mat3MulVecfl(bs->obi->nmat, bs->dxco);
+		Mat3MulVecfl(bs->obi->nmat, bs->dyco);
+	}
+}
+
 static void do_bake_shade(void *handle, int x, int y, float u, float v)
 {
 	BakeShade *bs= handle;
@@ -2118,6 +2171,9 @@
 	if(obi->flag & R_TRANSFORMED)
 		Mat4MulVecfl(obi->mat, shi->co);
 	
+	VECCOPY(shi->dxco, bs->dxco);
+	VECCOPY(shi->dyco, bs->dyco);
+
 	quad= bs->quad;
 	bake_set_shade_input(obi, vlr, shi, quad, 0, x, y, u, v);
 
@@ -2302,10 +2358,12 @@
 	/* UV indices have to be corrected for possible quad->tria splits */
 	i1= 0; i2= 1; i3= 2;
 	vlr_set_uv_indices(vlr, &i1, &i2, &i3);
+	bake_set_vlr_dxyco(bs, vec[i1], vec[i2], vec[i3]);
 	zspan_scanconvert(bs->zspan, bs, vec[i1], vec[i2], vec[i3], do_bake_shade);
 	
 	if(vlr->v4) {
 		bs->quad= 1;
+		bake_set_vlr_dxyco(bs, vec[0], vec[2], vec[3]);
 		zspan_scanconvert(bs->zspan, bs, vec[0], vec[2], vec[3], do_bake_shade);
 	}
 }

Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -442,18 +442,13 @@
 int RE_vlakren_get_normal(Render *re, ObjectInstanceRen *obi, VlakRen *vlr, float *nor)
 {
 	float xn, yn, zn, v1[3];
-	float (*imat)[3]= obi->imat;
+	float (*nmat)[3]= obi->nmat;
 	int flipped= 0;
 
 	if(obi->flag & R_TRANSFORMED) {
-		xn= vlr->n[0];
-		yn= vlr->n[1];
-		zn= vlr->n[2];
+		VECCOPY(nor, vlr->n);
 		
-		/* transpose! */
-		nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
-		nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
-		nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+		Mat3MulVecfl(nmat, nor);
 		Normalize(nor);
 	}
 	else
@@ -1332,7 +1327,8 @@
 	if(mat) {
 		Mat4CpyMat4(obi->mat, mat);
 		Mat3CpyMat4(mat3, mat);
-		Mat3Inv(obi->imat, mat3);
+		Mat3Inv(obi->nmat, mat3);
+		Mat3Transp(obi->nmat);
 		obi->flag |= R_DUPLI_TRANSFORMED;
 	}
 

Modified: trunk/blender/source/blender/render/intern/source/shadeinput.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/shadeinput.c	2008-03-12 19:55:37 UTC (rev 14071)
+++ trunk/blender/source/blender/render/intern/source/shadeinput.c	2008-03-12 20:22:05 UTC (rev 14072)
@@ -217,19 +217,6 @@
 	}
 }
 
-static void normal_transform(float imat[][3], float *nor)
-{
-	float xn, yn, zn;
-
-	xn= nor[0];
-	yn= nor[1];
-	zn= nor[2];
-
-	nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
-	nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
-	nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
-}
-
 /* copy data from face to ShadeInput, general case */
 /* indices 0 1 2 3 only */
 void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen *vlr, short i1, short i2, short i3)
@@ -269,9 +256,9 @@
 		VECCOPY(shi->n3, shi->v3->n);
 
 		if(obi->flag & R_TRANSFORMED) {
-			normal_transform(obi->imat, shi->n1);
-			normal_transform(obi->imat, shi->n2);
-			normal_transform(obi->imat, shi->n3);
+			Mat3MulVecfl(obi->nmat, shi->n1);
+			Mat3MulVecfl(obi->nmat, shi->n2);
+			Mat3MulVecfl(obi->nmat, shi->n3);
 		}
 
 		if(!(vlr->flag & (R_NOPUNOFLIP|R_TANGENT))) {
@@ -858,7 +845,7 @@
 				shi->tang[2]= (tl*s3[2] - tu*s1[2] - tv*s2[2]);
 
 				if(obi->flag & R_TRANSFORMED)
-					normal_transform(obi->imat, shi->tang);
+					Mat3MulVecfl(obi->nmat, shi->tang);
 
 				Normalize(shi->tang);
 				VECCOPY(shi->nmaptang, shi->tang);
@@ -878,7 +865,7 @@
 				shi->nmaptang[2]= (tl*s3[2] - tu*s1[2] - tv*s2[2]);
 
 				if(obi->flag & R_TRANSFORMED)
-					normal_transform(obi->imat, shi->nmaptang);
+					Mat3MulVecfl(obi->nmat, shi->nmaptang);
 
 				Normalize(shi->nmaptang);
 			}
@@ -891,7 +878,7 @@
 		if(surfnor) {
 			VECCOPY(shi->surfnor, surfnor)
 			if(obi->flag & R_TRANSFORMED)
-				normal_transform(obi->imat, shi->surfnor);
+				Mat3MulVecfl(obi->nmat, shi->surfnor);
 		}
 		else
 			VECCOPY(shi->surfnor, shi->vn)





More information about the Bf-blender-cvs mailing list