[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20743] tags/blender-2.49-release/source/ blender/src/booleanops.c: Tools

Ken Hughes khughes at pacific.edu
Tue Jun 9 07:17:32 CEST 2009


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(





More information about the Bf-blender-cvs mailing list