[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20762] trunk/blender/source/blender/src/ booleanops.c: Tools

Ken Hughes khughes at pacific.edu
Tue Jun 9 19:04:51 CEST 2009


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(





More information about the Bf-blender-cvs mailing list