[Bf-committers] Patch for bug 1355
Jiri Hnidek
bf-committers@blender.org
Sat, 12 Jun 2004 14:12:30 +0200
Hi,
it works for me, but can you tell me: "What is meaning of variable
dotcent?" ;-)
Jiri
>Here is a patch for bug number 1355 the recalc normals inside and
>outside function was broken. It gave strange results in cases where
>the object origin was not at the selected mesh centroid. I added code
>to account for differing mesh and object centres.
>
>
>Index: source/blender/src/editmesh.c
>===================================================================
>RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh.c,v
>retrieving revision 1.88
>diff -u -r1.88 editmesh.c
>--- source/blender/src/editmesh.c 5 Jun 2004 05:55:14 -0000 1.88
>+++ source/blender/src/editmesh.c 11 Jun 2004 17:03:44 -0000
>@@ -1757,8 +1757,9 @@
> {
> EditMesh *em = G.editMesh;
> EditEdge *eed, *ed1, *ed2, *ed3, *ed4;
>+ EditVert *eve;
> EditVlak *evl, *startvl;
>- float maxx, nor[3], cent[3];
>+ float maxx, min[3], max[3], nor[3], cent[3], centm[3], dotcent;
> int totsel, found, foundone, direct, turn;
>
> /* based at a select-connected to witness loose objects */
>@@ -1820,17 +1821,43 @@
> evl= evl->next;
> }
>
>+ /* find our mesh centroid */
>+ INIT_MINMAX(min, max);
>+ eve= em->verts.first;
>+ while(eve) {
>+ DO_MINMAX(eve->co, min, max);
>+ eve= eve->next;
>+ }
>+ centm[0]= (min[0]+max[0])/2.0;
>+ centm[1]= (min[1]+max[1])/2.0;
>+ centm[2]= (min[2]+max[2])/2.0;
>+
> /* set first face correct: calc normal */
> CalcNormFloat(startvl->v1->co, startvl->v2->co, startvl->v3->co, nor);
>+ /* account for object centers not at mesh centroid */
>+ nor[0] = nor[0]-centm[0];
>+ nor[1] = nor[1]-centm[1];
>+ nor[2] = nor[2]-centm[2];
>+
> CalcCent3f(cent, startvl->v1->co, startvl->v2->co, startvl->v3->co);
>+ /* account for object centers not at mesh centroid */
>+ cent[0] = cent[0]-centm[0];
>+ cent[1] = cent[1]-centm[1];
>+ cent[2] = cent[2]-centm[2];
>+
>+ dotcent = cent[0]*cent[0]+cent[1]*cent[1]+cent[2]*cent[2];
>
> /* first normal is oriented this way or the other */
> if(select) {
> if(select==2) {
>- if(cent[0]*nor[0]+cent[1]*nor[1]+cent[2]*nor[2] > 0.0) flipvlak(startvl);
>+ if( cent[0]*nor[0]+cent[1]*nor[1]+cent[2]*nor[2] > 0.0 ) {
>+ flipvlak(startvl);
>+ }
> }
> else {
>- if(cent[0]*nor[0]+cent[1]*nor[1]+cent[2]*nor[2] < 0.0) flipvlak(startvl);
>+ if(cent[0]*nor[0]+cent[1]*nor[1]+cent[2]*nor[2] < 0.0) {
>+ flipvlak(startvl);
>+ }
> }
> }
> else if(cent[0]*nor[0]+cent[1]*nor[1]+cent[2]*nor[2] < 0.0) flipvlak(startvl);
>
>