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;
 

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

Reply via email to