Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-03-13 21:16:23 +0300
committerTon Roosendaal <ton@blender.org>2006-03-13 21:16:23 +0300
commit4a673d1d9bddb2f3423630397364082a75a0745a (patch)
treea6796767d63830dadbc102cce8152bcf187f6a7b /source
parentf913a53b0a6e5aa0b16d3c88733276c0369e4e7b (diff)
Autosmooth fix: if original Mesh has same amount of faces and vertices
as the one resulting from Modifiers, it uses that data to calculate autosmooth for. This prevents weird stuff on rendering softbody for example.
Diffstat (limited to 'source')
-rw-r--r--source/blender/render/intern/source/convertblender.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 724d78c2709..f8af1433d16 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -641,6 +641,7 @@ static VertRen *as_findvertex(VlakRen *vlr, VertRen *ver, ASvert *asv, float thr
}
/* note; autosmooth happens in object space still, after applying autosmooth we rotate */
+/* note2; actually, when original mesh and displist are equal sized, face normals are from original mesh */
static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak, int degr)
{
ASvert *asv, *asverts, *asvertoffs;
@@ -656,6 +657,9 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
thresh= cos( M_PI*(0.5f+(float)degr)/180.0 );
+ /* step zero: give faces normals of original mesh, if this is provided */
+
+
/* step one: construct listbase of all vertices and pointers to faces */
for(a=startvlak; a<re->totvlak; a++) {
vlr= RE_findOrAddVlak(re, a);
@@ -1562,7 +1566,8 @@ static void init_render_mesh(Render *re, Object *ob, int only_verts)
float *orco=0;
int a, a1, ok, need_orco=0, need_stress=0, need_tangent=0, totvlako, totverto, vertofs;
int end, do_autosmooth=0, totvert = 0, dm_needsfree;
- int useFluidmeshNormals = 0; // NT fluidsim, use smoothed normals?
+ int useFluidmeshNormals= 0; // NT fluidsim, use smoothed normals?
+ int use_original_normals= 0;
me= ob->data;
@@ -1626,6 +1631,10 @@ static void init_render_mesh(Render *re, Object *ob, int only_verts)
mvert= dlm->mvert;
totvert= dlm->totvert;
+ /* attempt to autsmooth on original mesh, only without subsurf */
+ if(do_autosmooth && me->totvert==totvert && me->totface==dlm->totface)
+ use_original_normals= 1;
+
ms = (totvert==me->totvert)?me->msticky:NULL;
ma= give_render_material(re, ob, 1);
@@ -1738,10 +1747,21 @@ static void init_render_mesh(Render *re, Object *ob, int only_verts)
else vlr->v4= 0;
/* render normals are inverted in render */
- if(vlr->v4)
- len= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
- else
- len= CalcNormFloat(vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ if(use_original_normals) {
+ MFace *mf= me->mface+a;
+ MVert *mv= me->mvert;
+
+ if(vlr->v4)
+ len= CalcNormFloat4( mv[mf->v4].co, mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co, vlr->n);
+ else
+ len= CalcNormFloat(mv[mf->v3].co, mv[mf->v2].co, mv[mf->v1].co, vlr->n);
+ }
+ else {
+ if(vlr->v4)
+ len= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ else
+ len= CalcNormFloat(vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ }
vlr->mat= ma;
vlr->flag= flag;