[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