Booleans: Should work with modifier stack now. Please report (new) problems. Thanks

This commit is contained in:
2009-04-19 17:47:09 +00:00
parent 6bc162e679
commit 904483c96c
5 changed files with 100 additions and 67 deletions

View File

@@ -160,8 +160,8 @@ void bglEnd(void);
struct Object;
/* booleanops.c */
struct DerivedMesh *NewBooleanDerivedMesh(struct Object *ob,
struct Object *ob_select, int int_op_type);
struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, struct DerivedMesh *dm_select, struct Object *ob_select,
int int_op_type);
/* verse_*.c */
struct VerseVert;

View File

@@ -42,8 +42,7 @@ int NewBooleanMesh(struct Base *base, struct Base *base_select, int op);
/* Performs a boolean between two mesh objects, it is assumed that both objects
are in fact mesh object. On success returns a DerivedMesh. On failure
returns NULL and reports an error. */
struct DerivedMesh *NewBooleanDerivedMesh(struct Object *ob,
struct Object *ob_select,
int op);
struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, struct DerivedMesh *dm_select, struct Object *ob_select,
int int_op_type);
#endif

View File

@@ -240,7 +240,8 @@ void bglVertex3f(float x, float y, float z) {}
void bglEnd(void) {}
/* booleanops.c */
struct DerivedMesh *NewBooleanDerivedMesh(struct Object *ob, struct Object *ob_select, int int_op_type) { return 0; }
struct DerivedMesh *NewBooleanDerivedMesh(struct DerivedMesh *dm, struct Object *ob, struct DerivedMesh *dm_select, struct Object *ob_select,
int int_op_type) { return 0; }
/* LOD_decimation.cpp */
int LOD_LoadMesh(struct LOD_Decimation_Info* info) { return 0;};

View File

@@ -6140,22 +6140,44 @@ static DerivedMesh *booleanModifier_applyModifier(
{
// XXX doesn't handle derived data
BooleanModifierData *bmd = (BooleanModifierData*) md;
DerivedMesh *dm = mesh_get_derived_final(bmd->object, CD_MASK_BAREMESH);
/* we do a quick sanity check */
if(((Mesh *)ob->data)->totface > 3
&& bmd->object && ((Mesh *)bmd->object->data)->totface > 3) {
DerivedMesh *result = NewBooleanDerivedMesh(bmd->object, ob,
if(derivedData->getNumFaces(derivedData) > 3
&& bmd->object && dm->getNumFaces(dm) > 3) {
DerivedMesh *result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob,
1 + bmd->operation);
if(dm)
dm->release(dm);
/* if new mesh returned, return it; otherwise there was
* an error, so delete the modifier object */
if(result)
return result;
else
bmd->object = NULL;
}
}
if(dm)
dm->release(dm);
return derivedData;
return derivedData;
}
CustomDataMask booleanModifier_requiredDataMask(ModifierData *md)
{
CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
dataMask |= (1 << CD_MDEFORMVERT);
/* particles only need this if they are after a non deform modifier, and
* the modifier stack will only create them in that case. */
// dataMask |= CD_MASK_ORIGSPACE;
// dataMask |= CD_MASK_ORCO;
return dataMask;
}
/* Particles */
@@ -8311,6 +8333,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->applyModifier = booleanModifier_applyModifier;
mti->foreachObjectLink = booleanModifier_foreachObjectLink;
mti->updateDepgraph = booleanModifier_updateDepgraph;
mti->requiredDataMask = booleanModifier_requiredDataMask;
mti = INIT_TYPE(MeshDeform);
mti->type = eModifierTypeType_OnlyDeform;