[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15764] branches/soc-2008-jaguarandi/ source/blender: Converted shrinkwrap to a DeformOnly modifier
André Pinto
andresusanopinto at gmail.com
Fri Jul 25 20:48:24 CEST 2008
Revision: 15764
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15764
Author: jaguarandi
Date: 2008-07-25 20:48:24 +0200 (Fri, 25 Jul 2008)
Log Message:
-----------
Converted shrinkwrap to a DeformOnly modifier
*the options "remove faces", "merge" points were removed
*made shrinkwrap work with CVs (curves and nurbs surfaces)
*cleanup shrinkwrap code.. (removed bruteforces and raytree methods)
Modified Paths:
--------------
branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h 2008-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h 2008-07-25 18:48:24 UTC (rev 15764)
@@ -53,7 +53,8 @@
} SpaceTransform;
-void space_transform_setup(SpaceTransform *data, struct Object *local, struct Object *target);
+void space_transform_from_matrixs(SpaceTransform *data, float local[][4], float target[][4]);
+#define space_transform_setup(data, local, target) space_transform_from_matrixs(data, (local)->obmat, (target)->obmat)
void space_transform_apply (const SpaceTransform *data, float *co);
void space_transform_invert(const SpaceTransform *data, float *co);
@@ -93,9 +94,8 @@
// Builds a bvh tree where nodes are the faces of the given mesh. And configures BVHMesh if one is given.
struct BVHTree* bvhtree_from_mesh_faces(struct BVHTreeFromMesh *data, struct DerivedMesh *mesh, float epsilon, int tree_type, int axis);
+int normal_projection_project_vertex(char options, const float *vert, const float *dir, const SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata);
-
-
/* Shrinkwrap stuff */
struct Object;
struct DerivedMesh;
@@ -109,18 +109,15 @@
ShrinkwrapModifierData *smd; //shrinkwrap modifier data
struct Object *ob; //object we are applying shrinkwrap to
- struct DerivedMesh *original; //mesh before shrinkwrap (TODO clean this variable.. we don't really need it)
- struct BVHTree *original_tree; //BVHTree build with the original mesh (to be used on kept volume)
- struct BVHMeshCallbackUserdata *callback;
+ struct DerivedMesh *original; //mesh before shrinkwrap
- struct DerivedMesh *final; //initially a copy of original mesh.. mesh thats going to be shrinkwrapped
+ float (*vertexCos)[3]; //vertexs being shrinkwraped
+ int numVerts;
- struct DerivedMesh *target; //mesh we are shrinking to
-
- SpaceTransform local2target;
+ struct DerivedMesh *target; //mesh we are shrinking to
+ SpaceTransform local2target; //transform to move bettwem local and target space
float keptDist; //Distance to kept from target (units are in local space)
- //float *weights; //weights of vertexs
BitSet moved; //BitSet indicating if vertex has moved
} ShrinkwrapCalcData;
@@ -130,6 +127,7 @@
void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *data);
struct DerivedMesh *shrinkwrapModifier_do(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
#endif
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-07-25 18:48:24 UTC (rev 15764)
@@ -7198,7 +7198,6 @@
smd->shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE;
smd->shrinkOpts = MOD_SHRINKWRAP_ALLOW_DEFAULT_NORMAL;
smd->keptDist = 0.0f;
- smd->mergeDist = 0.0f;
smd->target = 0;
smd->cutPlane = 0;
@@ -7213,7 +7212,6 @@
tsmd->cutPlane = smd->cutPlane;
strcpy(tsmd->vgroup_name, smd->vgroup_name);
tsmd->keptDist = smd->keptDist;
- tsmd->mergeDist = smd->mergeDist;
tsmd->shrinkType = smd->shrinkType;
tsmd->shrinkOpts = smd->shrinkOpts;
}
@@ -7243,7 +7241,7 @@
walk(userData, ob, &smd->target);
walk(userData, ob, &smd->cutPlane);
}
-
+/*
static DerivedMesh *shrinkwrapModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
{
return shrinkwrapModifier_do((ShrinkwrapModifierData*)md,ob,derivedData,useRenderParams,isFinalCalc);
@@ -7253,7 +7251,27 @@
{
return shrinkwrapModifier_do((ShrinkwrapModifierData*)md,ob,derivedData,0,0);
}
+*/
+static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, derivedData, vertexCos, numVerts);
+}
+static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+ DerivedMesh *dm;
+
+ if(!derivedData && ob->type == OB_MESH)
+ dm = CDDM_from_editmesh(editData, ob->data);
+ else
+ dm = CDDM_copy(derivedData); //TODO: this is only needed if derevedData doenst supports getVertexArray
+
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
+
+ if(dm != derivedData)
+ dm->release(dm);
+}
+
static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
@@ -7645,8 +7663,9 @@
mti->applyModifier = explodeModifier_applyModifier;
mti = INIT_TYPE(Shrinkwrap);
- mti->type = eModifierTypeType_Nonconstructive;
+ mti->type = eModifierTypeType_OnlyDeform;
mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_AcceptsCVs
| eModifierTypeFlag_SupportsEditmode
| eModifierTypeFlag_EnableInEditmode;
@@ -7655,8 +7674,8 @@
mti->requiredDataMask = shrinkwrapModifier_requiredDataMask;
mti->isDisabled = shrinkwrapModifier_isDisabled;
mti->foreachObjectLink = shrinkwrapModifier_foreachObjectLink;
- mti->applyModifier = shrinkwrapModifier_applyModifier;
- mti->applyModifierEM = shrinkwrapModifier_applyModifierEM;
+ mti->deformVerts = shrinkwrapModifier_deformVerts;
+ mti->deformVertsEM = shrinkwrapModifier_deformVertsEM;
mti->updateDepgraph = shrinkwrapModifier_updateDepgraph;
mti = INIT_TYPE(SimpleDeform);
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c 2008-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c 2008-07-25 18:48:24 UTC (rev 15764)
@@ -136,10 +136,11 @@
}
/* Space transform */
-void space_transform_setup(SpaceTransform *data, struct Object *local, struct Object *target)
+void space_transform_from_matrixs(SpaceTransform *data, float local[4][4], float target[4][4])
{
- Mat4Invert(target->imat, target->obmat); //Invserse might be outdated
- Mat4MulSerie(data->local2target, target->imat, local->obmat, 0, 0, 0, 0, 0, 0);
+ float itarget[4][4];
+ Mat4Invert(itarget, target); //Invserse might be outdated
+ Mat4MulSerie(data->local2target, itarget, local, 0, 0, 0, 0, 0, 0);
Mat4Invert(data->target2local, data->local2target);
}
@@ -348,144 +349,11 @@
t3 = NULL;
} while(t2);
-
- //return hit->dist;
}
-/*
- * Raytree from mesh
- */
-static MVert *raytree_from_mesh_verts = NULL;
-static MFace *raytree_from_mesh_faces = NULL;
-static int raytree_check_always(Isect *is, int ob, RayFace *face)
-{
- return TRUE;
-}
-static void raytree_from_mesh_get_coords(RayFace *face, float **v1, float **v2, float **v3, float **v4)
-{
- MFace *mface= raytree_from_mesh_faces + (int)face/2 - 1 ;
-
- if(face == (RayFace*)(-1))
- {
- *v1 = NULL;
- *v2 = NULL;
- *v3 = NULL;
- *v4 = NULL;
- return;
- }
-
- //Nasty quad splitting
- if(((int)face) & 1) // we want the 2 triangle of the quad
- {
- *v1= raytree_from_mesh_verts[mface->v1].co;
- *v2= raytree_from_mesh_verts[mface->v3].co;
- *v3= raytree_from_mesh_verts[mface->v4].co;
- *v4= NULL;
- }
- else
- {
- *v1= raytree_from_mesh_verts[mface->v1].co;
- *v2= raytree_from_mesh_verts[mface->v2].co;
- *v3= raytree_from_mesh_verts[mface->v3].co;
- *v4= NULL;
- }
-}
-
/*
- * Creates a raytree from the given mesh
- * No copy of the mesh is done, so it must exist and remain
- * imutable as long the tree is intended to be used
- *
- * No more than 1 raytree can exist.. since this code uses a static variable
- * to pass data to raytree_from_mesh_get_coords
- */
-static RayTree* raytree_create_from_mesh(DerivedMesh *mesh)
-{
- int i;
- float min[3], max[3];
-
- RayTree*tree= NULL;
-
- int numFaces= mesh->getNumFaces(mesh);
- MFace *face = mesh->getFaceDataArray(mesh, CD_MFACE);
- int numVerts= mesh->getNumVerts(mesh);
-
- //Initialize static vars
- raytree_from_mesh_verts = mesh->getVertDataArray(mesh, CD_MVERT);
- raytree_from_mesh_faces = face;
-
-
- //calculate bounding box
- INIT_MINMAX(min, max);
-
- for(i=0; i<numVerts; i++)
- DO_MINMAX(raytree_from_mesh_verts[i].co, min, max);
-
- tree = RE_ray_tree_create(64, numFaces, min, max, raytree_from_mesh_get_coords, raytree_check_always, NULL, NULL);
- if(tree == NULL)
- return NULL;
-
- //Add faces to the RayTree (RayTree uses face=0, with some special value to setup things)
- for(i=1; i<=numFaces; i++)
- {
- RE_ray_tree_add_face(tree, 0, (RayFace*)(i*2) );
-
- //Theres some nasty thing with non-coplanar quads (that I can't find the issue)
- //so we split quads (an odd numbered face represents the second triangle of the quad)
- if(face[i-1].v4)
- RE_ray_tree_add_face(tree, 0, (RayFace*)(i*2+1));
- }
-
- RE_ray_tree_done(tree);
-
- return tree;
-}
-
-static void free_raytree_from_mesh(RayTree *tree)
-{
- raytree_from_mesh_verts = NULL;
- RE_ray_tree_free(tree);
-}
-
-/*
- * Cast a ray on the specified direction
- * Returns the distance the ray must travel until intersect something
- * Returns FLT_MAX in case of nothing intersection
- * if facenormal is given, it will be overwritted with the normal of the face the ray collided with
- */
-static float raytree_cast_ray(RayTree *tree, const float *coord, const float *direction, float *facenormal)
-{
- Isect isec;
- float *v1, *v2, *v3, *v4;
-
- /* Setup intersection */
- isec.mode = RE_RAY_MIRROR; /* We want closest intersection */
- isec.lay = -1;
- isec.face_last = NULL;
- isec.faceorig = (RayFace*)(-1);
- isec.labda = 1e10f;
-
- VECCOPY(isec.start, coord);
- VECCOPY(isec.vec, direction);
- VECADDFAC(isec.end, isec.start, isec.vec, isec.labda);
-
- if(!RE_ray_tree_intersect(tree, &isec))
- return FLT_MAX;
-
- if(facenormal)
- {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list