forked from bartvdbraak/blender
Tools
----- Bugfix #18835: negatively scaled objects resulted in incorrect boolean output. Commit to trunk instead of tagged release this time :-p
This commit is contained in:
parent
e29c9bc4da
commit
61889df87b
@ -164,6 +164,7 @@ typedef struct {
|
|||||||
DerivedMesh *dm;
|
DerivedMesh *dm;
|
||||||
int pos;
|
int pos;
|
||||||
int offset;
|
int offset;
|
||||||
|
int flip;
|
||||||
} FaceIt;
|
} FaceIt;
|
||||||
|
|
||||||
static void FaceIt_Destruct(CSG_FaceIteratorDescriptor * iterator)
|
static void FaceIt_Destruct(CSG_FaceIteratorDescriptor * iterator)
|
||||||
@ -190,9 +191,15 @@ static void FaceIt_Fill(CSG_IteratorPtr it, CSG_IFace *face)
|
|||||||
MFace *mfaces = face_it->dm->getFaceArray(face_it->dm);
|
MFace *mfaces = face_it->dm->getFaceArray(face_it->dm);
|
||||||
MFace *mface = &mfaces[face_it->pos];
|
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[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) {
|
if (mface->v4) {
|
||||||
face->vertex_index[3] = mface->v4;
|
face->vertex_index[3] = mface->v4;
|
||||||
face->vertex_number = 4;
|
face->vertex_number = 4;
|
||||||
@ -216,7 +223,7 @@ static void FaceIt_Reset(CSG_IteratorPtr it)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void FaceIt_Construct(
|
static void FaceIt_Construct(
|
||||||
CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset)
|
CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset, Object *ob)
|
||||||
{
|
{
|
||||||
FaceIt *it;
|
FaceIt *it;
|
||||||
if (output == 0) return;
|
if (output == 0) return;
|
||||||
@ -231,6 +238,25 @@ static void FaceIt_Construct(
|
|||||||
it->offset = offset;
|
it->offset = offset;
|
||||||
it->pos = 0;
|
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.
|
// assign iterator function pointers.
|
||||||
output->Step = FaceIt_Step;
|
output->Step = FaceIt_Step;
|
||||||
output->Fill = FaceIt_Fill;
|
output->Fill = FaceIt_Fill;
|
||||||
@ -429,7 +455,7 @@ static void BuildMeshDescriptors(
|
|||||||
struct CSG_VertexIteratorDescriptor * vertex_it)
|
struct CSG_VertexIteratorDescriptor * vertex_it)
|
||||||
{
|
{
|
||||||
VertexIt_Construct(vertex_it,dm, ob);
|
VertexIt_Construct(vertex_it,dm, ob);
|
||||||
FaceIt_Construct(face_it,dm,face_offset);
|
FaceIt_Construct(face_it,dm,face_offset,ob);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FreeMeshDescriptors(
|
static void FreeMeshDescriptors(
|
||||||
|
Loading…
Reference in New Issue
Block a user