diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-02-08 15:04:56 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-02-08 15:04:56 +0400 |
commit | f0db5e87350ebb984708d2147b92dcd7a2e72ab3 (patch) | |
tree | ec104ce60ea3882a60247d2ebf96cf9b51542c2d /source/blender/editors/mesh | |
parent | 65f454a16029dbe963b4700b6e4187671b81a4fe (diff) |
Fix for duplicated vertices in UV sphere when it's creating with large radius.
Issue was caused by not enough threshold limit used for removing doubles.
Switched to adoptive threshold value calculation based on smallest length
of segments in meridians and parallels.
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r-- | source/blender/editors/mesh/editmesh_add.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 64fa322f2a5..043e02ab1d0 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1036,6 +1036,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se float phi, phid, vec[3]; float q[4], cmat[3][3], nor[3]= {0.0, 0.0, 0.0}; short a, b; + float len, len2, vec2[3]; EM_clear_flag_all(em, SELECT); @@ -1117,7 +1118,19 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se rotateflag(em, 2, v1->co, cmat); } - removedoublesflag(em, 4, 0, 0.0001); + /* length of one segment on meridian */ + len= 2*dia*sinf(phid / 2.0f); + + /* length of one segment in shortest parallen */ + vec[0]= dia*sinf(phid); + vec[1]= 0.0; + vec[2]= dia*cosf(phid); + + mul_v3_m3v3(vec2, cmat, vec); + len2= len_v3v3(vec, vec2); + + /* use shortest segment length divided by 3 as merge threshold */ + removedoublesflag(em, 4, 0, MIN2(len, len2) / 3.0f); /* and now do imat */ eve= em->verts.first; |