diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-02 17:36:26 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-02 17:36:26 +0400 |
commit | 41cd2d8e841fbbc85aad715ecfcf58848c6831e6 (patch) | |
tree | 59bf948a7a321bb076b08c6ed73c38b8af7a2cc6 /source/blender/render | |
parent | 40b3c3a4e68f853284fc4fa5e58694f85e1e07db (diff) |
Fix #33040: baking selected to active could miss at pixels at the edge of faces
when there was a tiny mismatch between low and high poly models, maybe because
of float precision when editing the mesh. Added a small epsilon now to avoid this.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 217fcc3c4ac..9fe2620747c 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -2376,10 +2376,28 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v) v2= vlr->v2->co; v3= vlr->v3->co; } - - /* renderco */ + l= 1.0f-u-v; + + /* shrink barycentric coordinates inwards slightly to avoid some issues + * where baking selected to active might just miss the other face at the + * near the edge of a face */ + if (bs->actob) { + const float eps = 1.0f - 1e-4f; + float invsum; + + u = (u - 0.5f)*eps + 0.5f; + v = (v - 0.5f)*eps + 0.5f; + l = (l - 0.5f)*eps + 0.5f; + + invsum = 1.0f/(u + v + l); + + u *= invsum; + v *= invsum; + l *= invsum; + } + /* renderco */ shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0]; shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1]; shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2]; |