Revision: 16554
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16554
Author:   jaguarandi
Date:     2008-09-16 17:41:13 +0200 (Tue, 16 Sep 2008)

Log Message:
-----------
Added SSLevels options to all shrinkwrap modes (before it was only available to 
projection mode)
Added BVHTree cache at derivedMesh level

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_bvhutils.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/bvhutils.c
    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/src/buttons_editing.c

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_DerivedMesh.h    
2008-09-16 15:28:07 UTC (rev 16553)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_DerivedMesh.h    
2008-09-16 15:41:13 UTC (rev 16554)
@@ -44,6 +44,7 @@
 
 #include "DNA_customdata_types.h"
 #include "BKE_customdata.h"
+#include "BKE_bvhutils.h"
 
 struct MVert;
 struct MEdge;
@@ -69,6 +70,7 @@
        int numVertData, numEdgeData, numFaceData;
        int needsFree; /* checked on ->release, is set to 0 for cached results 
*/
        int deformedOnly; /* set by modifier stack if only deformed from 
original */
+       BVHCache bvhCache;
 
        /* Misc. Queries */
 

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_bvhutils.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_bvhutils.h       
2008-09-16 15:28:07 UTC (rev 16553)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_bvhutils.h       
2008-09-16 15:41:13 UTC (rev 16554)
@@ -31,6 +31,7 @@
 #define BKE_BVHUTILS_H
 
 #include "BLI_kdopbvh.h"
+#include "BLI_linklist.h"
 
 /*
  * This header encapsulates necessary code to buld a BVH
@@ -52,7 +53,7 @@
        BVHTree_RayCastCallback      raycast_callback;
 
        /* Mesh represented on this BVHTree */
-       struct DerivedMesh *mesh; 
+       struct DerivedMesh *mesh;
 
        /* Vertex array, so that callbacks have instante access to data */
        struct MVert *vert;
@@ -61,6 +62,9 @@
        /* radius for raycast */
        float sphere_radius;
 
+       /* Private data */
+       int cached;
+
 } BVHTreeFromMesh;
 
 /*
@@ -74,7 +78,7 @@
  * 
  * free_bvhtree_from_mesh should be called when the tree is no longer needed.
  */
-void bvhtree_from_mesh_verts(struct BVHTreeFromMesh *data, struct DerivedMesh 
*mesh, float epsilon, int tree_type, int axis);
+BVHTree* bvhtree_from_mesh_verts(struct BVHTreeFromMesh *data, struct 
DerivedMesh *mesh, float epsilon, int tree_type, int axis);
 
 /*
  * Builds a bvh tree where nodes are the faces of the given mesh.
@@ -84,15 +88,50 @@
  * so that the coordinates and rays are first translated on the mesh local 
coordinates.
  * Reason for this is that later bvh_from_mesh_* might use a cache system and 
so it becames possible to reuse
  * a BVHTree.
+ *
+ * The returned value is the same as in data->tree, its only returned to make 
it easier to test
+ * the success 
  * 
  * free_bvhtree_from_mesh should be called when the tree is no longer needed.
  */
-void bvhtree_from_mesh_faces(struct BVHTreeFromMesh *data, struct DerivedMesh 
*mesh, float epsilon, int tree_type, int axis);
+BVHTree* bvhtree_from_mesh_faces(struct BVHTreeFromMesh *data, struct 
DerivedMesh *mesh, float epsilon, int tree_type, int axis);
 
 /*
  * Frees data allocated by a call to bvhtree_from_mesh_*.
  */
 void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data);
 
+
+/*
+ * BVHCache
+ */
+
+//Using local coordinates
+#define BVHTREE_FROM_FACES             0
+#define BVHTREE_FROM_VERTICES  1
+
+typedef LinkNode* BVHCache;
+
+
+/*
+ * Queries a bvhcache for the chache bvhtree of the request type
+ */
+BVHTree *bvhcache_find(BVHCache *cache, int type);
+
+/*
+ * Inserts a BVHTree of the given type under the cache
+ * After that the caller no longer needs to worry when to free the BVHTree
+ * as that will be done when the cache is freed.
+ *
+ * A call to this assumes that there was no previous cached tree of the given 
type
+ */
+void bvhcache_insert(BVHCache *cache, BVHTree *tree, int type);
+
+/*
+ * inits and frees a bvhcache
+ */
+void bvhcache_init(BVHCache *cache);
+void bvhcache_free(BVHCache *cache);
+
 #endif
 

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h     
2008-09-16 15:28:07 UTC (rev 16553)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h     
2008-09-16 15:41:13 UTC (rev 16554)
@@ -95,6 +95,8 @@
 
 struct Object;
 struct DerivedMesh;
+struct MVert;
+struct MDeformVert;
 struct ShrinkwrapModifierData;
 struct BVHTree;
 
@@ -104,8 +106,10 @@
        ShrinkwrapModifierData *smd;    //shrinkwrap modifier data
 
        struct Object *ob;                              //object we are 
applying shrinkwrap to
-       struct DerivedMesh *original;   //mesh before shrinkwrap
 
+       MVert *vert;                                    //Array of verts being 
projected (to fetch normals or other data) 
+       MDeformVert *dvert;                             //Array to get vertexs 
weights
+       int vgroup;
        float (*vertexCos)[3];                  //vertexs being shrinkwraped
        int numVerts;
 

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/DerivedMesh.c 
2008-09-16 15:28:07 UTC (rev 16553)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/DerivedMesh.c 
2008-09-16 15:41:13 UTC (rev 16554)
@@ -78,6 +78,7 @@
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
 #include "BKE_particle.h"
+#include "BKE_bvhutils.h"
 
 #include "BLO_sys_types.h" // for intptr_t support
 
@@ -188,6 +189,8 @@
        dm->getVertDataArray = DM_get_vert_data_layer;
        dm->getEdgeDataArray = DM_get_edge_data_layer;
        dm->getFaceDataArray = DM_get_face_data_layer;
+
+       bvhcache_init(&dm->bvhCache);
 }
 
 void DM_init(DerivedMesh *dm,
@@ -224,6 +227,8 @@
 int DM_release(DerivedMesh *dm)
 {
        if (dm->needsFree) {
+               bvhcache_free(&dm->bvhCache);
+
                CustomData_free(&dm->vertData, dm->numVertData);
                CustomData_free(&dm->edgeData, dm->numEdgeData);
                CustomData_free(&dm->faceData, dm->numFaceData);
@@ -2735,6 +2740,7 @@
        Mesh *me = ob->data;
        float min[3], max[3];
 
+       printf("Building DerivedMesh for %s\n", ob->id.name);
        clear_mesh_caches(ob);
 
        if(ob!=G.obedit) {

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/bvhutils.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/bvhutils.c    
2008-09-16 15:28:07 UTC (rev 16553)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/bvhutils.c    
2008-09-16 15:41:13 UTC (rev 16554)
@@ -30,6 +30,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
+#include <assert.h>
 
 #include "BKE_bvhutils.h"
 
@@ -45,6 +46,8 @@
 #include "BKE_global.h"
 
 #include "BLI_arithb.h"
+#include "BLI_linklist.h"
+#include "MEM_guardedalloc.h"
 
 /* Math stuff for ray casting on mesh faces and for nearest surface */
 
@@ -480,30 +483,47 @@
  * BVH builders
  */
 // Builds a bvh tree.. where nodes are the vertexs of the given mesh
-void bvhtree_from_mesh_verts(BVHTreeFromMesh *data, DerivedMesh *mesh, float 
epsilon, int tree_type, int axis)
+BVHTree* bvhtree_from_mesh_verts(BVHTreeFromMesh *data, DerivedMesh *mesh, 
float epsilon, int tree_type, int axis)
 {
-       int i;
-       int numVerts= mesh->getNumVerts(mesh);
-       MVert *vert     = mesh->getVertDataArray(mesh, CD_MVERT);
-       BVHTree *tree = NULL;
+       BVHTree *tree = bvhcache_find(&mesh->bvhCache, BVHTREE_FROM_VERTICES);
 
-       memset(data, 0, sizeof(*data));
+       //Not in cache
+       if(tree == NULL)
+       {
+               int i;
+               int numVerts= mesh->getNumVerts(mesh);
+               MVert *vert     = mesh->getVertDataArray(mesh, CD_MVERT);
 
-       if(vert == NULL)
+               if(vert != NULL)
+               {
+                       tree = BLI_bvhtree_new(numVerts, epsilon, tree_type, 
axis);
+
+                       if(tree != NULL)
+                       {
+                               for(i = 0; i < numVerts; i++)
+                                       BLI_bvhtree_insert(tree, i, vert[i].co, 
1);
+
+                               BLI_bvhtree_balance(tree);
+
+                               //Save on cache for later use
+                               printf("BVHTree built and saved on cache\n");
+                               bvhcache_insert(&mesh->bvhCache, tree, 
BVHTREE_FROM_VERTICES);
+                       }
+               }
+       }
+       else
        {
-               printf("bvhtree cant be build: cant get a vertex array");
-               return;
+               printf("BVHTree is already build, using cached tree\n");
        }
 
-       tree = BLI_bvhtree_new(numVerts, epsilon, tree_type, axis);
-       if(tree != NULL)
-       {
-               for(i = 0; i < numVerts; i++)
-                       BLI_bvhtree_insert(tree, i, vert[i].co, 1);
 
-               BLI_bvhtree_balance(tree);
+       //Setup BVHTreeFromMesh
+       memset(data, 0, sizeof(*data));
+       data->tree = tree;
 
-               data->tree = tree;
+       if(data->tree)
+       {
+               data->cached = TRUE;
 
                //a NULL nearest callback works fine
                //remeber the min distance to point is the same as the min 
distance to BV of point
@@ -516,43 +536,62 @@
 
                data->sphere_radius = epsilon;
        }
+
+       return data->tree;
 }
 
 // Builds a bvh tree.. where nodes are the faces of the given mesh.
-void bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float 
epsilon, int tree_type, int axis)
+BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, 
float epsilon, int tree_type, int axis)
 {
-       int i;
-       int numFaces= mesh->getNumFaces(mesh);
-       MVert *vert     = mesh->getVertDataArray(mesh, CD_MVERT);
-       MFace *face = mesh->getFaceDataArray(mesh, CD_MFACE);
-       BVHTree *tree = NULL;
+       BVHTree *tree = bvhcache_find(&mesh->bvhCache, BVHTREE_FROM_FACES);
 
-       memset(data, 0, sizeof(*data));
-
-       if(vert == NULL && face == NULL)
+       //Not in cache
+       if(tree == NULL)
        {
-               printf("bvhtree cant be build: cant get a vertex/face array");
-               return;
-       }
+               int i;
+               int numFaces= mesh->getNumFaces(mesh);
+               MVert *vert     = mesh->getVertDataArray(mesh, CD_MVERT);
+               MFace *face = mesh->getFaceDataArray(mesh, CD_MFACE);
 
-       /* Create a bvh-tree of the given target */
-       tree = BLI_bvhtree_new(numFaces, epsilon, tree_type, axis);
-       if(tree != NULL)
-       {
-               for(i = 0; i < numFaces; i++)
+               if(vert != NULL && face != NULL)
                {
-                       float co[4][3];
-                       VECCOPY(co[0], vert[ face[i].v1 ].co);
-                       VECCOPY(co[1], vert[ face[i].v2 ].co);
-                       VECCOPY(co[2], vert[ face[i].v3 ].co);
-                       if(face[i].v4)
-                               VECCOPY(co[3], vert[ face[i].v4 ].co);
+                       /* Create a bvh-tree of the given target */
+                       tree = BLI_bvhtree_new(numFaces, epsilon, tree_type, 
axis);
+                       if(tree != NULL)
+                       {
+                               for(i = 0; i < numFaces; i++)
+                               {
+                                       float co[4][3];
+                                       VECCOPY(co[0], vert[ face[i].v1 ].co);
+                                       VECCOPY(co[1], vert[ face[i].v2 ].co);
+                                       VECCOPY(co[2], vert[ face[i].v3 ].co);
+                                       if(face[i].v4)
+                                               VECCOPY(co[3], vert[ face[i].v4 
].co);
                        
-                       BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+                                       BLI_bvhtree_insert(tree, i, co[0], 
face[i].v4 ? 4 : 3);
+                               }
+                               BLI_bvhtree_balance(tree);
+
+                               //Save on cache for later use
+                               printf("BVHTree built and saved on cache\n");

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to