Booleans: Should work with modifier stack now. Please report (new) problems. Thanks
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user