Revision: 27515
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27515
Author: blendix
Date: 2010-03-15 13:35:14 +0100 (Mon, 15 Mar 2010)
Log Message:
-----------
Render Branch: make displacement work with flat shading, previously would not
have properly set normal giving strange result, though in general it's best to
use smooth shading for displacement to avoid discontinuities at the edges.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/source/object_mesh.c
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c
2010-03-15 12:02:10 UTC (rev 27514)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c
2010-03-15 12:35:14 UTC (rev 27515)
@@ -1209,9 +1209,10 @@
return 0;
}
-static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi,
VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3], float
*sample)
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi,
VertRen *vr, int vindex, float *scale, float mat[][4], float nmat[][3], float
*sample)
{
MTFace *tface;
+ VlakRen *vlr= shi->primitive.vlr;
short texco= shi->material.mat->texco;
float displace[3], *orco;
char *name;
@@ -1220,22 +1221,18 @@
/* shi->geometry.co is current render coord, just make sure at least
some vector is here */
copy_v3_v3(shi->geometry.co, vr->co);
/* vertex normal is used for textures type 'col' and 'var' */
- copy_v3_v3(shi->geometry.vn, vr->n);
+ copy_v3_v3(shi->geometry.vn, (vlr->flag & R_SMOOTH)? vr->n: vlr->n);
if(mat)
mul_m4_v3(mat, shi->geometry.co);
+ if(nmat)
+ mul_m3_v3(nmat, shi->geometry.vn);
- if(imat) {
- shi->geometry.vn[0]=
imat[0][0]*vr->n[0]+imat[0][1]*vr->n[1]+imat[0][2]*vr->n[2];
- shi->geometry.vn[1]=
imat[1][0]*vr->n[0]+imat[1][1]*vr->n[1]+imat[1][2]*vr->n[2];
- shi->geometry.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->texture.totuv= 0;
shi->texture.actuv= obr->actmtface;
- for (i=0; (tface=render_vlak_get_tface(obr, shi->primitive.vlr,
i, &name, 0)); i++) {
+ for (i=0; (tface=render_vlak_get_tface(obr, vlr, i, &name, 0));
i++) {
ShadeInputUV *suv= &shi->texture.uv[i];
/* shi.uv needs scale correction from tface uv */
@@ -1280,7 +1277,7 @@
mul_v3_v3(displace, scale);
if(mat)
- mul_m3_v3(imat, displace);
+ mul_m3_v3(nmat, displace);
/* 0.5 could become button once? */
vr->co[0] += displace[0];
@@ -1298,7 +1295,7 @@
sample[vr->index]= dot_v3v3(shi->texture.displace,
shi->texture.displace);
}
-static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr,
float *scale, float mat[][4], float imat[][3], float *sample)
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr,
float *scale, float mat[][4], float nmat[][3], float *sample)
{
ShadeInput shi;
VertRen *v1= vlr->v1;
@@ -1331,17 +1328,17 @@
/* Displace the verts, flag is set when done */
if(!v1->flag)
- displace_render_vert(re, obr, &shi, v1,0, scale, mat, imat,
sample);
+ displace_render_vert(re, obr, &shi, v1,0, scale, mat, nmat,
sample);
if(!v2->flag)
- displace_render_vert(re, obr, &shi, v2, 1, scale, mat, imat,
sample);
+ displace_render_vert(re, obr, &shi, v2, 1, scale, mat, nmat,
sample);
if(!v3->flag)
- displace_render_vert(re, obr, &shi, v3, 2, scale, mat, imat,
sample);
+ displace_render_vert(re, obr, &shi, v3, 2, scale, mat, nmat,
sample);
if(v4) {
if(!v4->flag)
- displace_render_vert(re, obr, &shi, v4, 3, scale, mat,
imat, sample);
+ displace_render_vert(re, obr, &shi, v4, 3, scale, mat,
nmat, sample);
/* closest in displace value. This will help smooth
edges. */
if(fabs(sample[v1->index] - sample[v3->index]) >
fabs(sample[v2->index] - sample[v4->index]))
@@ -1361,10 +1358,17 @@
Object *obt;
VlakRen *vlr;
VertRen *vr;
- float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample;
+ float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample, nmat[3][3];
int i;
sample= MEM_callocN(sizeof(float)*obr->totvert, "do_displacement
sample");
+
+ if(imat) {
+ copy_m3_m3(nmat, imat);
+ transpose_m3(nmat);
+ }
+ else
+ unit_m3(nmat);
/* Object Size with parenting */
obt=obr->ob;
@@ -1382,7 +1386,7 @@
for(i=0; i<obr->totvlak; i++){
vlr=render_object_vlak_get(obr, i);
- displace_render_face(re, obr, vlr, scale, mat, imat, sample);
+ displace_render_face(re, obr, vlr, scale, mat, nmat, sample);
}
MEM_freeN(sample);
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs