Revision: 20762
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20762
Author:   khughes
Date:     2009-06-09 19:04:50 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
Tools
-----
Bugfix #18835: negatively scaled objects resulted in incorrect boolean
output.  Commit to trunk instead of tagged release this time :-p

Modified Paths:
--------------
    trunk/blender/source/blender/src/booleanops.c

Modified: trunk/blender/source/blender/src/booleanops.c
===================================================================
--- trunk/blender/source/blender/src/booleanops.c       2009-06-09 16:52:02 UTC 
(rev 20761)
+++ trunk/blender/source/blender/src/booleanops.c       2009-06-09 17:04:50 UTC 
(rev 20762)
@@ -164,6 +164,7 @@
        DerivedMesh *dm;
        int pos;
        int offset;
+       int flip;
 } FaceIt;
 
 static void FaceIt_Destruct(CSG_FaceIteratorDescriptor * iterator)
@@ -190,9 +191,15 @@
        MFace *mfaces = face_it->dm->getFaceArray(face_it->dm);
        MFace *mface = &mfaces[face_it->pos];
 
-       face->vertex_index[0] = mface->v1;
+       /* reverse face vertices if necessary */
        face->vertex_index[1] = mface->v2;
-       face->vertex_index[2] = mface->v3;
+       if( face_it->flip == 0 ) {
+               face->vertex_index[0] = mface->v1;
+               face->vertex_index[2] = mface->v3;
+       } else {
+               face->vertex_index[2] = mface->v1;
+               face->vertex_index[0] = mface->v3;
+       }
        if (mface->v4) {
                face->vertex_index[3] = mface->v4;
                face->vertex_number = 4;
@@ -216,7 +223,7 @@
 }      
 
 static void FaceIt_Construct(
-       CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset)
+       CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset, Object 
*ob)
 {
        FaceIt *it;
        if (output == 0) return;
@@ -231,6 +238,25 @@
        it->offset = offset;
        it->pos = 0;
 
+       /* determine if we will need to reverse order of face vertices */
+       if (ob->size[0] < 0.0f) {
+               if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) {
+                       it->flip = 1;
+               } else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) {
+                       it->flip = 1;
+               } else {
+                       it->flip = 0;
+               }
+       } else {
+               if (ob->size[1] < 0.0f && ob->size[2] < 0.0f) {
+                       it->flip = 0;
+               } else if (ob->size[1] >= 0.0f && ob->size[2] >= 0.0f) {
+                       it->flip = 0;
+               } else {
+                       it->flip = 1;
+               }
+       }
+
        // assign iterator function pointers.
        output->Step = FaceIt_Step;
        output->Fill = FaceIt_Fill;
@@ -429,7 +455,7 @@
        struct CSG_VertexIteratorDescriptor * vertex_it)
 {
        VertexIt_Construct(vertex_it,dm, ob);
-       FaceIt_Construct(face_it,dm,face_offset);
+       FaceIt_Construct(face_it,dm,face_offset,ob);
 }
        
 static void FreeMeshDescriptors(


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to