[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