Sculpt Branch:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 11 Dec 2009 14:16:17 +0000 (14:16 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 11 Dec 2009 14:16:17 +0000 (14:16 +0000)
* Added detection if VBO extension is supported.
* Redraw other 3d views after sculpting.
* Fix brush sometimes punching through mesh with very small polygons,
  added an extra epsilon to the ray-triangle intersection.

source/blender/blenlib/BLI_pbvh.h
source/blender/blenlib/intern/pbvh.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/gpu/intern/gpu_buffers.c

index e1e733c91dfad42cd7eda269b6bd582b0c8ede57..12c13de183cc345fd5b07ccebc1fe045b51f0ef2 100644 (file)
@@ -88,9 +88,9 @@ typedef enum {
 
        PBVH_UpdateNormals = 2,
        PBVH_UpdateBB = 4,
-       PBVH_UpdateOriginalBB = 4,
-       PBVH_UpdateDrawBuffers = 8,
-       PBVH_UpdateRedraw = 16
+       PBVH_UpdateOriginalBB = 8,
+       PBVH_UpdateDrawBuffers = 16,
+       PBVH_UpdateRedraw = 32
 } PBVHNodeFlags;
 
 void BLI_pbvh_node_mark_update(PBVHNode *node);
index 960888260ce391a3456dd9f96622007b42c97bd1..f0464438b68c02dcdf8a5e45d4202b36b229021f 100644 (file)
@@ -1142,8 +1142,8 @@ static int ray_face_intersection(float ray_start[3], float ray_normal[3],
        {       
                float dist = FLT_MAX;
                        
-               if(!isect_ray_tri_v3(ray_start, ray_normal, t0, t1, t2,
-                                        &dist, NULL))
+               if(!isect_ray_tri_threshold_v3(ray_start, ray_normal, t0, t1, t2,
+                                        &dist, NULL, 0.001f))
                        dist = FLT_MAX;
 
                if(dist >= 0 && dist < *fdist) {
@@ -1232,32 +1232,26 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3],
        return hit;
 }
 
-#if 0
-static int nodes_drawn = 0;
-static int is_partial = 0;
-/* XXX: Just a temporary replacement for the real drawing code */
-static void draw_partial_cb(PBVHNode *node, void *data)
+//#include <GL/glew.h>
 
+void BLI_pbvh_node_draw(PBVHNode *node, void *data)
+{
+#if 0
        /* XXX: Just some quick code to show leaf nodes in different colors */
-       /*float col[3]; int i;
-       if(is_partial) {
+       float col[3]; int i;
+
+       if(0) { //is_partial) {
                col[0] = (rand() / (float)RAND_MAX); col[1] = col[2] = 0.6;
        }
        else {
-               srand((long long)data_v);
+               srand((long long)node);
                for(i = 0; i < 3; ++i)
                        col[i] = (rand() / (float)RAND_MAX) * 0.3 + 0.7;
        }
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
 
-       glColor3f(1, 0, 0);*/
-       GPU_draw_buffers(BLI_pbvh_node_get_draw_buffers(node));
-       ++nodes_drawn;
-}
+       glColor3f(1, 0, 0);
 #endif
-
-void BLI_pbvh_node_draw(PBVHNode *node, void *data)
-{
        GPU_draw_buffers(node->draw_buffers);
 }
 
index c715dc97cde2ea327e80dafbc02e815056f6ad54..8b705ff5b5e2e425a885b0f5d4d4ee4cf30cec97 100644 (file)
@@ -2054,6 +2054,8 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *stroke)
                BLI_pbvh_update(ss->tree, PBVH_UpdateOriginalBB, NULL);
 
                if(ss->refkb) sculpt_key_to_mesh(ss->refkb, ob);
+
+               WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
        }
 }
 
index af220487ab19a3f6194adf4c6cd6d9c0bb005ff3..33aa4168ff8bdf560e3ebfbd99f8fb3b28eb07fc 100644 (file)
@@ -457,10 +457,12 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
        /* Count the number of triangles */
        for(i = 0, tottri = 0; i < totface; ++i)
                tottri += mface[face_indices[i]].v4 ? 2 : 1;
+       
+       if(GL_ARB_vertex_buffer_object)
+               glGenBuffersARB(1, &buffers->index_buf);
 
        if(buffers->index_buf) {
                /* Generate index buffer object */
-               glGenBuffersARB(1, &buffers->index_buf);
                glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffers->index_buf);
                glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
                                 sizeof(unsigned short) * tottri * 3, NULL, GL_STATIC_DRAW_ARB);
@@ -503,7 +505,7 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
                glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
        }
 
-       if(buffers->vert_buf)
+       if(buffers->index_buf)
                glGenBuffersARB(1, &buffers->vert_buf);
        GPU_update_mesh_buffers(buffers, mvert, vert_indices, totvert);
 
@@ -567,7 +569,9 @@ void *GPU_build_grid_buffers(DMGridData **grids,
        totquad= (gridsize-1)*(gridsize-1)*totgrid;
 
        /* Generate index buffer object */
-       glGenBuffersARB(1, &buffers->index_buf);
+       if(GL_ARB_vertex_buffer_object)
+               glGenBuffersARB(1, &buffers->index_buf);
+
        if(buffers->index_buf) {
                glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffers->index_buf);