[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13789] trunk/blender/source/blender/ render/intern/source/convertblender.c:
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Feb 20 21:37:20 CET 2008
Revision: 13789
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13789
Author: blendix
Date: 2008-02-20 21:37:20 +0100 (Wed, 20 Feb 2008)
Log Message:
-----------
Fix for bug #6897: radiosity or autosmooth + displace gave different results
than regular displace.
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-02-20 20:15:00 UTC (rev 13788)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c 2008-02-20 20:37:20 UTC (rev 13789)
@@ -2161,11 +2161,11 @@
return 0;
}
-static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale)
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3])
{
MTFace *tface;
short texco= shi->mat->texco;
- float sample=0;
+ float sample=0, displace[3];
char *name;
int i;
@@ -2174,6 +2174,15 @@
/* vertex normal is used for textures type 'col' and 'var' */
VECCOPY(shi->vn, vr->n);
+ if(mat)
+ Mat4MulVecfl(mat, shi->co);
+
+ if(imat) {
+ shi->vn[0]= imat[0][0]*vr->n[0]+imat[0][1]*vr->n[1]+imat[0][2]*vr->n[2];
+ shi->vn[1]= imat[1][0]*vr->n[0]+imat[1][1]*vr->n[1]+imat[1][2]*vr->n[2];
+ shi->vn[2]= imat[2][0]*vr->n[0]+imat[2][1]*vr->n[1]+imat[2][2]*vr->n[2];
+ }
+
if (texco & TEXCO_UV) {
shi->totuv= 0;
shi->actuv= obr->actmtface;
@@ -2219,11 +2228,18 @@
//printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
//vr->co[0], vr->co[1], vr->co[2]);
+
+ displace[0]= shi->displace[0] * scale[0];
+ displace[1]= shi->displace[1] * scale[1];
+ displace[2]= shi->displace[2] * scale[2];
+ if(mat)
+ Mat3MulVecfl(imat, displace);
+
/* 0.5 could become button once? */
- vr->co[0] += shi->displace[0] * scale[0] ;
- vr->co[1] += shi->displace[1] * scale[1] ;
- vr->co[2] += shi->displace[2] * scale[2] ;
+ vr->co[0] += displace[0];
+ vr->co[1] += displace[1];
+ vr->co[2] += displace[2];
//printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
@@ -2241,7 +2257,7 @@
return;
}
-static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale)
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale, float mat[][4], float imat[][3])
{
ShadeInput shi;
@@ -2260,17 +2276,17 @@
/* Displace the verts, flag is set when done */
if (!vlr->v1->flag)
- displace_render_vert(re, obr, &shi, vlr->v1,0, scale);
+ displace_render_vert(re, obr, &shi, vlr->v1,0, scale, mat, imat);
if (!vlr->v2->flag)
- displace_render_vert(re, obr, &shi, vlr->v2, 1, scale);
+ displace_render_vert(re, obr, &shi, vlr->v2, 1, scale, mat, imat);
if (!vlr->v3->flag)
- displace_render_vert(re, obr, &shi, vlr->v3, 2, scale);
+ displace_render_vert(re, obr, &shi, vlr->v3, 2, scale, mat, imat);
if (vlr->v4) {
if (!vlr->v4->flag)
- displace_render_vert(re, obr, &shi, vlr->v4, 3, scale);
+ displace_render_vert(re, obr, &shi, vlr->v4, 3, scale, mat, imat);
/* closest in displace value. This will help smooth edges. */
if ( fabs(vlr->v1->accum - vlr->v3->accum) > fabs(vlr->v2->accum - vlr->v4->accum))
@@ -2287,7 +2303,7 @@
}
}
-static void do_displacement(Render *re, ObjectRen *obr)
+static void do_displacement(Render *re, ObjectRen *obr, float mat[][4], float imat[][3])
{
VertRen *vr;
VlakRen *vlr;
@@ -2312,7 +2328,7 @@
for(i=0; i<obr->totvlak; i++){
vlr=RE_findOrAddVlak(obr, i);
- displace_render_face(re, obr, vlr, scale);
+ displace_render_face(re, obr, vlr, scale, mat, imat);
}
/* Recalc vertex normals */
@@ -3277,7 +3293,10 @@
if(!timeoffset) {
if (test_for_displace(re, ob ) ) {
calc_vertexnormals(re, obr, 0);
- do_displacement(re, obr);
+ if(do_autosmooth)
+ do_displacement(re, obr, mat, imat);
+ else
+ do_displacement(re, obr, NULL, NULL);
}
if(do_autosmooth) {
@@ -3956,7 +3975,7 @@
I will look at means to have autosmooth enabled for all object types
and have it as general postprocess, like displace */
if(ob->type!=OB_MESH && test_for_displace(re, ob))
- do_displacement(re, obr);
+ do_displacement(re, obr, NULL, NULL);
if(!timeoffset) {
/* phong normal interpolation can cause error in tracing
More information about the Bf-blender-cvs
mailing list