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

Log Message:
-----------
Tools
-----
Bugfix #18835: negatively scaled objects resulted in incorrect boolean
output.

Modified Paths:
--------------
    tags/blender-2.49-release/source/blender/src/booleanops.c

Modified: tags/blender-2.49-release/source/blender/src/booleanops.c
===================================================================
--- tags/blender-2.49-release/source/blender/src/booleanops.c   2009-06-09 
04:39:33 UTC (rev 20742)
+++ tags/blender-2.49-release/source/blender/src/booleanops.c   2009-06-09 
05:17:32 UTC (rev 20743)
@@ -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
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to