[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38867] trunk/blender/source/blender/ blenlib/intern/pbvh.c: == PBVH ==
Nicholas Bishop
nicholasbishop at gmail.com
Sun Jul 31 04:34:54 CEST 2011
Revision: 38867
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38867
Author: nicholasbishop
Date: 2011-07-31 02:34:53 +0000 (Sun, 31 Jul 2011)
Log Message:
-----------
== PBVH ==
OK, after that failure of committing a bunch of old junk, hopefully
this is what I actually meant to commit :)
* Added big comments to some of the fields in struct PBVHNode. I
always forget the details of these, so finally wrote it down
properly.
* Changed types of PBVHNode.face_vert_indices and PBVHNode.flag to
better reflect their contents.
* There should be no functional changes here.
Modified Paths:
--------------
trunk/blender/source/blender/blenlib/intern/pbvh.c
Modified: trunk/blender/source/blender/blenlib/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/pbvh.c 2011-07-31 02:24:06 UTC (rev 38866)
+++ trunk/blender/source/blender/blenlib/intern/pbvh.c 2011-07-31 02:34:53 UTC (rev 38867)
@@ -26,7 +26,6 @@
-
#include "DNA_meshdata_types.h"
#include "MEM_guardedalloc.h"
@@ -85,26 +84,62 @@
/* Opaque handle for drawing code */
void *draw_buffers;
- int *vert_indices;
-
/* Voxel bounds */
BB vb;
BB orig_vb;
- /* For internal nodes */
+ /* For internal nodes, the offset of the children in the PBVH
+ 'nodes' array. */
int children_offset;
- /* Pointer into bvh prim_indices */
+ /* Pointer into the PBVH prim_indices array and the number of
+ primitives used by this leaf node.
+
+ Used for leaf nodes in both mesh- and multires-based PBVHs.
+ */
int *prim_indices;
- int *face_vert_indices;
+ unsigned int totprim;
- unsigned int totprim;
+ /* Array of indices into the mesh's MVert array. Contains the
+ indices of all vertices used by faces that are within this
+ node's bounding box.
+
+ Note that a vertex might be used by a multiple faces, and
+ these faces might be in different leaf nodes. Such a vertex
+ will appear in the vert_indices array of each of those leaf
+ nodes.
+
+ In order to support cases where you want access to multiple
+ nodes' vertices without duplication, the vert_indices array
+ is ordered such that the first part of the array, up to
+ index 'uniq_verts', contains "unique" vertex indices. These
+ vertices might not be truly unique to this node, but if
+ they appear in another node's vert_indices array, they will
+ be above that node's 'uniq_verts' value.
+
+ Used for leaf nodes in a mesh-based PBVH (not multires.)
+ */
+ int *vert_indices;
unsigned int uniq_verts, face_verts;
- char flag;
+ /* An array mapping face corners into the vert_indices
+ array. The array is sized to match 'totprim', and each of
+ the face's corners gets an index into the vert_indices
+ array, in the same order as the corners in the original
+ MFace. The fourth value should not be used if the original
+ face is a triangle.
- float tmin; // used for raycasting, is how close bb is to the ray point
+ Used for leaf nodes in a mesh-based PBVH (not multires.)
+ */
+ int (*face_vert_indices)[4];
+ /* Indicates whether this node is a leaf or not; also used for
+ marking various updates that need to be applied. */
+ PBVHNodeFlags flag : 8;
+
+ /* Used for raycasting: how close bb is to the ray point. */
+ float tmin;
+
int proxy_count;
PBVHProxyNode* proxies;
};
@@ -339,15 +374,15 @@
node->uniq_verts = node->face_verts = 0;
totface= node->totprim;
- node->face_vert_indices = MEM_callocN(sizeof(int) *
- 4*totface, "bvh node face vert indices");
+ node->face_vert_indices = MEM_callocN(sizeof(int) * 4*totface,
+ "bvh node face vert indices");
for(i = 0; i < totface; ++i) {
MFace *f = bvh->faces + node->prim_indices[i];
int sides = f->v4 ? 4 : 3;
for(j = 0; j < sides; ++j) {
- node->face_vert_indices[i*4 + j]=
+ node->face_vert_indices[i][j]=
map_insert_vert(bvh, map, &node->face_verts,
&node->uniq_verts, (&f->v1)[j]);
}
@@ -373,9 +408,17 @@
BLI_ghashIterator_free(iter);
- for(i = 0; i < totface*4; ++i)
- if(node->face_vert_indices[i] < 0)
- node->face_vert_indices[i]= -node->face_vert_indices[i] + node->uniq_verts - 1;
+ for(i = 0; i < totface; ++i) {
+ MFace *f = bvh->faces + node->prim_indices[i];
+ int sides = f->v4 ? 4 : 3;
+
+ for(j = 0; j < sides; ++j) {
+ if(node->face_vert_indices[i][j] < 0)
+ node->face_vert_indices[i][j]=
+ -node->face_vert_indices[i][j] +
+ node->uniq_verts - 1;
+ }
+ }
if(!G.background) {
node->draw_buffers =
@@ -1340,20 +1383,20 @@
if(bvh->faces) {
MVert *vert = bvh->verts;
int *faces= node->prim_indices;
- int *face_verts= node->face_vert_indices;
int totface= node->totprim;
int i;
for(i = 0; i < totface; ++i) {
MFace *f = bvh->faces + faces[i];
+ int *face_verts = node->face_vert_indices[i];
if(origco) {
/* intersect with backuped original coordinates */
hit |= ray_face_intersection(ray_start, ray_normal,
- origco[face_verts[i*4+0]],
- origco[face_verts[i*4+1]],
- origco[face_verts[i*4+2]],
- f->v4? origco[face_verts[i*4+3]]: NULL,
+ origco[face_verts[0]],
+ origco[face_verts[1]],
+ origco[face_verts[2]],
+ f->v4? origco[face_verts[3]]: NULL,
dist);
}
else {
More information about the Bf-blender-cvs
mailing list