[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19795] trunk/blender/source/blender: Booleans: Should work with modifier stack now.
Daniel Genrich
daniel.genrich at gmx.net
Sun Apr 19 19:47:09 CEST 2009
Revision: 19795
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19795
Author: genscher
Date: 2009-04-19 19:47:09 +0200 (Sun, 19 Apr 2009)
Log Message:
-----------
Booleans: Should work with modifier stack now. Please report (new) problems. Thanks
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h
trunk/blender/source/blender/blenkernel/BKE_booleanops.h
trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c
trunk/blender/source/blender/blenkernel/intern/modifier.c
trunk/blender/source/blender/src/booleanops.c
Modified: trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h 2009-04-19 17:29:07 UTC (rev 19794)
+++ trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h 2009-04-19 17:47:09 UTC (rev 19795)
@@ -160,8 +160,8 @@
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;
Modified: trunk/blender/source/blender/blenkernel/BKE_booleanops.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_booleanops.h 2009-04-19 17:29:07 UTC (rev 19794)
+++ trunk/blender/source/blender/blenkernel/BKE_booleanops.h 2009-04-19 17:47:09 UTC (rev 19795)
@@ -42,8 +42,7 @@
/* 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
Modified: trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c
===================================================================
--- trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c 2009-04-19 17:29:07 UTC (rev 19794)
+++ trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c 2009-04-19 17:47:09 UTC (rev 19795)
@@ -240,7 +240,8 @@
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;};
Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c 2009-04-19 17:29:07 UTC (rev 19794)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c 2009-04-19 17:47:09 UTC (rev 19795)
@@ -6140,24 +6140,46 @@
{
// 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 */
static void particleSystemModifier_initData(ModifierData *md)
{
@@ -8311,6 +8333,7 @@
mti->applyModifier = booleanModifier_applyModifier;
mti->foreachObjectLink = booleanModifier_foreachObjectLink;
mti->updateDepgraph = booleanModifier_updateDepgraph;
+ mti->requiredDataMask = booleanModifier_requiredDataMask;
mti = INIT_TYPE(MeshDeform);
mti->type = eModifierTypeType_OnlyDeform;
Modified: trunk/blender/source/blender/src/booleanops.c
===================================================================
--- trunk/blender/source/blender/src/booleanops.c 2009-04-19 17:29:07 UTC (rev 19794)
+++ trunk/blender/source/blender/src/booleanops.c 2009-04-19 17:47:09 UTC (rev 19795)
@@ -68,7 +68,7 @@
*/
typedef struct {
- Mesh *mesh;
+ DerivedMesh *dm;
Object *ob;
int pos;
} VertexIt;
@@ -96,13 +96,13 @@
static int VertexIt_Done(CSG_IteratorPtr it)
{
VertexIt * iterator = (VertexIt *)it;
- return(iterator->pos >= iterator->mesh->totvert);
+ return(iterator->pos >= iterator->dm->getNumVerts(iterator->dm));
}
static void VertexIt_Fill(CSG_IteratorPtr it, CSG_IVertex *vert)
{
VertexIt * iterator = (VertexIt *)it;
- MVert *verts = iterator->mesh->mvert;
+ MVert *verts = iterator->dm->getVertArray(iterator->dm);
float global_pos[3];
@@ -130,7 +130,7 @@
iterator->pos = 0;
}
-static void VertexIt_Construct(CSG_VertexIteratorDescriptor *output, Object *ob)
+static void VertexIt_Construct(CSG_VertexIteratorDescriptor *output, DerivedMesh *dm, Object *ob)
{
VertexIt *it;
@@ -142,8 +142,8 @@
return;
}
// assign blender specific variables
- it->ob = ob;
- it->mesh = ob->data;
+ it->dm = dm;
+ it->ob = ob; // needed for obmat transformations
it->pos = 0;
@@ -152,7 +152,7 @@
output->Fill = VertexIt_Fill;
output->Done = VertexIt_Done;
output->Reset = VertexIt_Reset;
- output->num_elements = it->mesh->totvert;
+ output->num_elements = it->dm->getNumVerts(it->dm);
output->it = it;
}
@@ -161,7 +161,7 @@
*/
typedef struct {
- Mesh *mesh;
+ DerivedMesh *dm;
int pos;
int offset;
} FaceIt;
@@ -180,14 +180,14 @@
{
// assume CSG_IteratorPtr is of the correct type.
FaceIt * iterator = (FaceIt *)it;
- return(iterator->pos >= iterator->mesh->totface);
+ return(iterator->pos >= iterator->dm->getNumFaces(iterator->dm));
}
static void FaceIt_Fill(CSG_IteratorPtr it, CSG_IFace *face)
{
// assume CSG_IteratorPtr is of the correct type.
FaceIt *face_it = (FaceIt *)it;
- MFace *mfaces = face_it->mesh->mface;
+ MFace *mfaces = face_it->dm->getFaceArray(face_it->dm);
MFace *mface = &mfaces[face_it->pos];
face->vertex_index[0] = mface->v1;
@@ -216,7 +216,7 @@
}
static void FaceIt_Construct(
- CSG_FaceIteratorDescriptor *output, Object *ob, int offset)
+ CSG_FaceIteratorDescriptor *output, DerivedMesh *dm, int offset)
{
FaceIt *it;
if (output == 0) return;
@@ -227,7 +227,7 @@
return ;
}
// assign blender specific variables
- it->mesh = ob->data;
+ it->dm = dm;
it->offset = offset;
it->pos = 0;
@@ -236,7 +236,7 @@
output->Fill = FaceIt_Fill;
output->Done = FaceIt_Done;
output->Reset = FaceIt_Reset;
- output->num_elements = it->mesh->totface;
+ output->num_elements = it->dm->getNumFaces(it->dm);
output->it = it;
}
@@ -280,7 +280,7 @@
}
static void InterpCSGFace(
- DerivedMesh *dm, Mesh *orig_me, int index, int orig_index, int nr,
+ DerivedMesh *dm, DerivedMesh *orig_dm, int index, int orig_index, int nr,
float mapmat[][4])
{
float obco[3], *co[4], *orig_co[4], w[4][4];
@@ -288,13 +288,13 @@
int j;
mface = CDDM_get_face(dm, index);
- orig_mface = orig_me->mface + orig_index;
+ orig_mface = orig_dm->getFaceArray(orig_dm) + orig_index;
// get the vertex coordinates from the original mesh
- orig_co[0] = (orig_me->mvert + orig_mface->v1)->co;
- orig_co[1] = (orig_me->mvert + orig_mface->v2)->co;
- orig_co[2] = (orig_me->mvert + orig_mface->v3)->co;
- orig_co[3] = (orig_mface->v4)? (orig_me->mvert + orig_mface->v4)->co: NULL;
+ orig_co[0] = (orig_dm->getVertArray(orig_dm) + orig_mface->v1)->co;
+ orig_co[1] = (orig_dm->getVertArray(orig_dm) + orig_mface->v2)->co;
+ orig_co[2] = (orig_dm->getVertArray(orig_dm) + orig_mface->v3)->co;
+ orig_co[3] = (orig_mface->v4)? (orig_dm->getVertArray(orig_dm) + orig_mface->v4)->co: NULL;
// get the vertex coordinates from the new derivedmesh
co[0] = CDDM_get_vert(dm, mface->v1)->co;
@@ -312,7 +312,7 @@
InterpWeightsQ3Dfl(orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco, w[j]);
}
- CustomData_interp(&orig_me->fdata, &dm->faceData, &orig_index, NULL, (float*)w, 1, index);
+ CustomData_interp(&orig_dm->faceData, &dm->faceData, &orig_index, NULL, (float*)w, 1, index);
}
/* Iterate over the CSG Output Descriptors and create a new DerivedMesh
@@ -324,27 +324,28 @@
float mapmat[][4],
Material **mat,
int *totmat,
+ DerivedMesh *dm1,
Object *ob1,
+ DerivedMesh *dm2,
Object *ob2)
{
- DerivedMesh *dm;
+ DerivedMesh *result, *orig_dm;
GHash *material_hash = NULL;
Mesh *me1= (Mesh*)ob1->data;
Mesh *me2= (Mesh*)ob2->data;
int i;
// create a new DerivedMesh
- dm = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements);
+ result = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements);
+ CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH,
+ CD_DEFAULT, face_it->num_elements);
+ CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH,
+ CD_DEFAULT, face_it->num_elements);
- CustomData_merge(&me1->fdata, &dm->faceData, CD_MASK_DERIVEDMESH,
- CD_DEFAULT, face_it->num_elements);
- CustomData_merge(&me2->fdata, &dm->faceData, CD_MASK_DERIVEDMESH,
- CD_DEFAULT, face_it->num_elements);
-
// step through the vertex iterators:
for (i = 0; !vertex_it->Done(vertex_it->it); i++) {
CSG_IVertex csgvert;
- MVert *mvert = CDDM_get_vert(dm, i);
+ MVert *mvert = CDDM_get_vert(result, i);
// retrieve a csg vertex from the boolean module
vertex_it->Fill(vertex_it->it, &csgvert);
@@ -375,15 +376,16 @@
face_it->Step(face_it->it);
// find the original mesh and data
- orig_ob = (csgface.orig_face < me1->totface)? ob1: ob2;
+ orig_ob = (csgface.orig_face < dm1->getNumFaces(dm1))? ob1: ob2;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list