Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-09-03 21:22:29 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-09-03 21:22:29 +0400
commita77e3482f227ef8dc32b64e3b64dd30dc87cb9b9 (patch)
tree6c2afb9952cc9e4ff03a559e17373b2e5606010c /source/blender/blenkernel
parente0c7d270d944878bac16f3d19eba5a162efbbaa7 (diff)
Saturday morning first cup of coffee hack (yeah, its a late
morning) - fun for the whole family, boolean mesh modifier... doesn't work with layered modifiers yet (just uses base mesh), although may god have mercy on your soul if you want to run boolean on a subsurf anyway - added displistmesh_add_edges This exposes a bug in boolean, apparently the output is somehow random (hash on alloc'd pointer value perhaps) which is sortof lame. It also makes more apparent the desire for some level of control over dep graph evaluation during editmode (at the moment dep graph is reevaluated for a mesh object in editmode, but since mesh changes are on editmesh other objects don't really see any change, so it is a wasted recalc).
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_booleanops.h12
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/BKE_mesh.h1
-rw-r--r--source/blender/blenkernel/intern/displist.c41
-rw-r--r--source/blender/blenkernel/intern/mesh.c18
-rw-r--r--source/blender/blenkernel/intern/modifier.c71
6 files changed, 102 insertions, 42 deletions
diff --git a/source/blender/blenkernel/BKE_booleanops.h b/source/blender/blenkernel/BKE_booleanops.h
index c3dcb320b5b..f033dd70003 100644
--- a/source/blender/blenkernel/BKE_booleanops.h
+++ b/source/blender/blenkernel/BKE_booleanops.h
@@ -55,6 +55,8 @@ NewBooleanMesh(
int op_type
);
+struct DispListMesh *NewBooleanMeshDLM(struct Object *ob, struct Object *ob_select, int int_op_type);
+
/**
* Functions exposed for use by BKE_booleanops_mesh
@@ -81,16 +83,6 @@ FreeMeshDescriptors(
struct CSG_VertexIteratorDescriptor * vertex_it
);
-extern
- int
-ConvertCSGDescriptorsToMeshObject(
- struct Object *ob,
- struct CSG_MeshPropertyDescriptor * props,
- struct CSG_FaceIteratorDescriptor * face_it,
- struct CSG_VertexIteratorDescriptor * vertex_it,
- float parinv[][4]
-);
-
/**
* This little function adds a new mesh object
* to the blender object list. It uses ob to duplicate
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 021b584036f..2dcf4bfe1be 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -151,6 +151,7 @@ void reshadeall_displist(void);
void filldisplist(struct ListBase *dispbase, struct ListBase *to);
void mesh_create_shadedColors(struct Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r);
+void displistmesh_add_edges(DispListMesh *dlm);
#endif
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 90c5dec19b4..998f3fda59d 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -68,6 +68,7 @@ void set_mesh(struct Object *ob, struct Mesh *me);
void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
void nurbs_to_mesh(struct Object *ob);
void mcol_to_tface(struct Mesh *me, int freedata);
+struct MCol *tface_to_mcol_p(struct TFace *tface, int totface);
void tface_to_mcol(struct Mesh *me);
void free_dverts(struct MDeformVert *dvert, int totvert);
void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 077060b7890..d18c205d825 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -66,6 +66,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
#include "BKE_bad_level_calls.h"
#include "BKE_utildefines.h"
@@ -2049,3 +2050,43 @@ static void boundbox_displist(Object *ob)
}
}
+void displistmesh_add_edges(DispListMesh *dlm)
+{
+ EdgeHash *eh = BLI_edgehash_new();
+ EdgeHashIterator *ehi;
+ int i;
+
+ for (i=0; i<dlm->totface; i++) {
+ MFace *mf = &dlm->mface[i];
+
+ if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
+ BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
+ BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
+
+ if (mf->v4) {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
+ BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
+ BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
+ } else {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
+ BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
+ }
+ }
+
+ dlm->totedge = BLI_edgehash_size(eh);
+ dlm->medge = MEM_callocN(dlm->totedge*sizeof(*dlm->medge), "medge");
+
+ ehi = BLI_edgehashIterator_new(eh);
+ for (i=0; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
+ MEdge *med = &dlm->medge[i++];
+
+ BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
+
+ med->flag = ME_EDGEDRAW|ME_EDGERENDER;
+ }
+ BLI_edgehashIterator_free(ehi);
+
+ BLI_edgehash_free(eh, NULL);
+}
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3e1e11c6950..fbd15267ead 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -952,22 +952,26 @@ void nurbs_to_mesh(Object *ob)
}
-void tface_to_mcol(Mesh *me)
+MCol *tface_to_mcol_p(TFace *tface, int totface)
{
- TFace *tface;
- unsigned int *mcol;
+ unsigned int *mcol, *mcoldata;
int a;
- me->mcol= MEM_mallocN(4*sizeof(int)*me->totface, "nepmcol");
- mcol= (unsigned int *)me->mcol;
+ mcol= mcoldata= MEM_mallocN(4*sizeof(int)*totface, "nepmcol");
- a= me->totface;
- tface= me->tface;
+ a= totface;
while(a--) {
memcpy(mcol, tface->col, 16);
mcol+= 4;
tface++;
}
+
+ return (MCol*) mcoldata;
+}
+
+void tface_to_mcol(Mesh *me)
+{
+ me->mcol = tface_to_mcol_p(me->tface, me->totface);
}
void mcol_to_tface(Mesh *me, int freedata)
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index b937c4fb71d..cc24f420098 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -5,7 +5,6 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_arithb.h"
-#include "BLI_edgehash.h"
#include "MEM_guardedalloc.h"
@@ -22,6 +21,7 @@
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_booleanops.h"
#include "BKE_displist.h"
#include "BKE_modifier.h"
#include "BKE_lattice.h"
@@ -804,9 +804,6 @@ static void *decimateModifier_applyModifier(ModifierData *md, Object *ob, void *
dmd->faceCount = 0;
if(LOD_LoadMesh(&lod) ) {
if( LOD_PreprocessMesh(&lod) ) {
- EdgeHash *eh;
- EdgeHashIterator *ehi;
-
/* we assume the decim_faces tells how much to reduce */
while(lod.face_num > numTris*dmd->percent) {
@@ -826,7 +823,6 @@ static void *decimateModifier_applyModifier(ModifierData *md, Object *ob, void *
VECCOPY(mv->co, vbCo);
}
- eh = BLI_edgehash_new();
for(a=0; a<lod.face_num; a++) {
MFace *mf = &ndlm->mface[a];
int *tri = &lod.triangle_index_buffer[a*3];
@@ -834,28 +830,9 @@ static void *decimateModifier_applyModifier(ModifierData *md, Object *ob, void *
mf->v2 = tri[1];
mf->v3 = tri[2];
test_index_face(mface, NULL, NULL, 3);
-
- if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
- BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
- BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v1, mf->v3))
- BLI_edgehash_insert(eh, mf->v1, mf->v3, NULL);
}
- ndlm->totedge = BLI_edgehash_size(eh);
- ndlm->medge = MEM_callocN(ndlm->totedge*sizeof(MEdge), "mdge");
- ehi = BLI_edgehashIterator_new(eh);
- for (a=0; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- MEdge *med = &ndlm->medge[a++];
-
- BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
-
- med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- }
- BLI_edgehashIterator_free(ehi);
-
- BLI_edgehash_free(eh, NULL);
+ displistmesh_add_edges(ndlm);
}
else {
modifier_setError(md, "Out of memory.");
@@ -1130,6 +1107,42 @@ static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *der
sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos, numVerts);
}
+/* Boolean */
+
+static int booleanModifier_isDisabled(ModifierData *md)
+{
+ BooleanModifierData *bmd = (BooleanModifierData*) md;
+
+ return !bmd->object;
+}
+
+static void booleanModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+ BooleanModifierData *bmd = (BooleanModifierData*) md;
+
+ walk(userData, ob, &bmd->object);
+}
+
+static void booleanModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+{
+ BooleanModifierData *bmd = (BooleanModifierData*) md;
+
+ if (bmd->object) {
+ DagNode *curNode = dag_get_node(forest, bmd->object);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+ }
+}
+
+static void *booleanModifier_applyModifier(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int useRenderParams, int isFinalCalc)
+{
+ // XXX doesn't handle derived data
+ BooleanModifierData *bmd = (BooleanModifierData*) md;
+ DispListMesh *dlm = NewBooleanMeshDLM(bmd->object, ob, 1+bmd->operation);
+
+ return derivedmesh_from_displistmesh(dlm, NULL);
+}
+
/***/
static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES];
@@ -1248,6 +1261,14 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_RequiresOriginalData;
mti->deformVerts = softbodyModifier_deformVerts;
+ mti = INIT_TYPE(Boolean);
+ mti->type = eModifierTypeType_Nonconstructive;
+ mti->flags = eModifierTypeFlag_AcceptsMesh;
+ mti->isDisabled = booleanModifier_isDisabled;
+ mti->applyModifier = booleanModifier_applyModifier;
+ mti->foreachObjectLink = booleanModifier_foreachObjectLink;
+ mti->updateDepgraph = booleanModifier_updateDepgraph;
+
typeArrInit = 0;
#undef INIT_TYPE
}