[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53912] trunk/blender/source/blender: Skip hidden faces in PBVH BMesh ray intersection test

Nicholas Bishop nicholasbishop at gmail.com
Sat Jan 19 17:10:26 CET 2013


Revision: 53912
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53912
Author:   nicholasbishop
Date:     2013-01-19 16:10:21 +0000 (Sat, 19 Jan 2013)
Log Message:
-----------
Skip hidden faces in PBVH BMesh ray intersection test

Moved the GPU function gpu_bmesh_face_visible() to BKE_paint and
inverted the test to match equivalent tests for other mesh types:
paint_is_bmesh_face_hidden().

Changed BKE_pbvh_bmesh_node_save_orig() to not save hidden faces into
the triangle array.

Modified the non-use-original branch of pbvh_bmesh_node_raycast() to
skip hidden faces.

Fixes bug #33914:
projects.blender.org/tracker/index.php?func=detail&aid=33914&group_id=9&atid=498

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_paint.h
    trunk/blender/source/blender/blenkernel/intern/paint.c
    trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/blenkernel/BKE_paint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_paint.h	2013-01-19 07:41:15 UTC (rev 53911)
+++ trunk/blender/source/blender/blenkernel/BKE_paint.h	2013-01-19 16:10:21 UTC (rev 53912)
@@ -34,6 +34,7 @@
 
 struct bContext;
 struct BMesh;
+struct BMFace;
 struct Brush;
 struct MDisps;
 struct MeshElemMap;
@@ -72,6 +73,7 @@
 int paint_is_face_hidden(const struct MFace *f, const struct MVert *mvert);
 int paint_is_grid_face_hidden(const unsigned int *grid_hidden,
                               int gridsize, int x, int y);
+int paint_is_bmesh_face_hidden(struct BMFace *f);
 
 /* paint masks */
 float paint_grid_paint_mask(const struct GridPaintMask *gpm, unsigned level,

Modified: trunk/blender/source/blender/blenkernel/intern/paint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/paint.c	2013-01-19 07:41:15 UTC (rev 53911)
+++ trunk/blender/source/blender/blenkernel/intern/paint.c	2013-01-19 16:10:21 UTC (rev 53912)
@@ -47,6 +47,8 @@
 #include "BKE_paint.h"
 #include "BKE_subsurf.h"
 
+#include "bmesh.h"
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -224,6 +226,22 @@
 	        BLI_BITMAP_GET(grid_hidden, (y + 1) * gridsize + x));
 }
 
+/* Return TRUE if all vertices in the face are visible, FALSE otherwise */
+int paint_is_bmesh_face_hidden(BMFace *f)
+{
+	BMLoop *l_iter;
+	BMLoop *l_first;
+
+	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+	do {
+		if (BM_elem_flag_test(l_iter->v, BM_ELEM_HIDDEN)) {
+			return true;
+		}
+	} while ((l_iter = l_iter->next) != l_first);
+
+	return false;
+}
+
 float paint_grid_paint_mask(const GridPaintMask *gpm, unsigned level,
                             unsigned x, unsigned y)
 {

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-19 07:41:15 UTC (rev 53911)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-19 16:10:21 UTC (rev 53912)
@@ -28,6 +28,7 @@
 #include "BKE_ccg.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
+#include "BKE_paint.h"
 #include "BKE_pbvh.h"
 
 #include "GPU_buffers.h"
@@ -936,10 +937,9 @@
 			BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 
 			BLI_assert(f->len == 3);
-			if (f->len == 3) {
+			if (f->len == 3 && !paint_is_bmesh_face_hidden(f)) {
 				BMVert *v_tri[3];
 
-				// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v_tri, 3);
 				BM_face_as_array_vert_tri(f, v_tri);
 				hit |= ray_face_intersection(ray_start, ray_normal,
 				                             v_tri[0]->co,
@@ -1071,7 +1071,9 @@
 }
 
 /* In order to perform operations on the original node coordinates
- * (such as raycast), store the node's triangles and vertices.*/
+ * (currently just raycast), store the node's triangles and vertices.
+ *
+ * Skips triangles that are hidden. */
 void BKE_pbvh_bmesh_node_save_orig(PBVHNode *node)
 {
 	GHashIterator gh_iter;
@@ -1109,6 +1111,9 @@
 	GHASH_ITER (gh_iter, node->bm_faces) {
 		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 
+		if (paint_is_bmesh_face_hidden(f))
+			continue;
+
 #if 0
 		BMIter bm_iter;
 		BMVert *v;

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2013-01-19 07:41:15 UTC (rev 53911)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2013-01-19 16:10:21 UTC (rev 53912)
@@ -1922,22 +1922,6 @@
 	return totvert;
 }
 
-/* Return TRUE if all vertices in the face are visible, FALSE otherwise */
-static int gpu_bmesh_face_visible(BMFace *f)
-{
-	BMLoop *l_iter;
-	BMLoop *l_first;
-
-	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-	do {
-		if (BM_elem_flag_test(l_iter->v, BM_ELEM_HIDDEN)) {
-			return false;
-		}
-	} while ((l_iter = l_iter->next) != l_first);
-
-	return true;
-}
-
 /* Return the total number of visible faces */
 static int gpu_bmesh_face_visible_count(GHash *bm_faces)
 {
@@ -1947,7 +1931,7 @@
 	GHASH_ITER (gh_iter, bm_faces) {
 		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 
-		if (gpu_bmesh_face_visible(f))
+		if (!paint_is_bmesh_face_hidden(f))
 			totface++;
 	}
 
@@ -2014,7 +1998,7 @@
 
 				BLI_assert(f->len == 3);
 
-				if (gpu_bmesh_face_visible(f)) {
+				if (!paint_is_bmesh_face_hidden(f)) {
 					BMVert *v[3];
 					float fmask = 0;
 					int i;
@@ -2068,7 +2052,7 @@
 			GHASH_ITER (gh_iter, bm_faces) {
 				BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 
-				if (gpu_bmesh_face_visible(f)) {
+				if (!paint_is_bmesh_face_hidden(f)) {
 					BMLoop *l_iter;
 					BMLoop *l_first;
 




More information about the Bf-blender-cvs mailing list