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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to