Commit: 2d16cb2f12d165488f82b97a92cca90400c272af
Author: Lukas Tönne
Date:   Wed Aug 13 10:43:25 2014 +0200
Branches: hair_system
https://developer.blender.org/rB2d16cb2f12d165488f82b97a92cca90400c272af

Use a larger OpenGL buffer for optimized hair drawing.

The size of 1024 hairs is quite arbitrary, we might want to chose a max.
hair count based on the total number of steps/draw elements instead.

===================================================================

M       source/blender/editors/space_view3d/drawhair.c

===================================================================

diff --git a/source/blender/editors/space_view3d/drawhair.c 
b/source/blender/editors/space_view3d/drawhair.c
index a215220..a23bd22 100644
--- a/source/blender/editors/space_view3d/drawhair.c
+++ b/source/blender/editors/space_view3d/drawhair.c
@@ -90,21 +90,28 @@ static void draw_hair_line(HairSystem *hsys)
        }
 }
 
+#define USE_BUFFERS
+
 static void draw_hair_render(HairSystem *hsys)
 {
+       /* number of hairs drawn with one glDrawElements call */
+       static const int hair_buffer_size = 1024; /* XXX arbitrary */
+       
        static unsigned int vertex_glbuf = 0;
        static unsigned int elem_glbuf = 0;
        
        int maxverts, maxelems;
-       
        float (*vertex_data)[3];
        unsigned int *elem_data;
        
        HairRenderIterator iter;
+       unsigned int vertex_offset;
+       unsigned int elem_offset;
+       int num_buffered_hairs = 0;
        
        BKE_hair_render_iter_init(&iter, hsys);
-       maxverts = iter.maxsteps;
-       maxelems = 2 * (iter.maxsteps - 1);
+       maxverts = iter.maxsteps * hair_buffer_size;
+       maxelems = 2 * (iter.maxsteps - 1) * hair_buffer_size;
        if (maxelems < 1) {
                BKE_hair_render_iter_end(&iter);
                return;
@@ -112,8 +119,6 @@ static void draw_hair_render(HairSystem *hsys)
        
        glColor3f(0.4f, 0.7f, 1.0f);
        
-#define USE_BUFFERS
-       
 #ifdef USE_BUFFERS
        /* set up OpenGL buffers */
        if (!vertex_glbuf) {
@@ -136,16 +141,15 @@ static void draw_hair_render(HairSystem *hsys)
 //     glEnable(GL_LIGHTING);
        
        while (BKE_hair_render_iter_valid_hair(&iter)) {
-               int totelems;
-               unsigned int vertex_offset = 0;
-               unsigned int elem_offset = 0;
-               
-#ifdef USE_BUFFERS
-               vertex_data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
-               elem_data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
-#endif
                BKE_hair_render_iter_init_hair(&iter);
-               totelems = 2 * (iter.totsteps-1);
+               
+               if (num_buffered_hairs == 0) {
+                       /* initialize buffers */
+                       vertex_data = glMapBuffer(GL_ARRAY_BUFFER, 
GL_WRITE_ONLY);
+                       elem_data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, 
GL_WRITE_ONLY);
+                       vertex_offset = 0;
+                       elem_offset = 0;
+               }
                
                for (; BKE_hair_render_iter_valid_step(&iter); 
BKE_hair_render_iter_next(&iter)) {
                        float radius;
@@ -164,13 +168,39 @@ static void draw_hair_render(HairSystem *hsys)
                        elem_offset += 2;
                }
                
+               ++num_buffered_hairs;
+               
+               if (num_buffered_hairs >= hair_buffer_size) {
+                       num_buffered_hairs = 0;
+                       
+                       /* finalize buffers and draw */
+#ifdef USE_BUFFERS
+                       glUnmapBuffer(GL_ARRAY_BUFFER);
+                       glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
+                       
+//                     glShadeModel(GL_SMOOTH);
+                       glDrawElements(GL_LINES, elem_offset, GL_UNSIGNED_INT, 
NULL);
+#else
+                       {
+                               int u;
+                               glBegin(GL_LINES);
+                               for (u = 0; u < totelems; ++u) {
+                                       glVertex3fv(vertex_data[elem_data[u]]);
+                               }
+                               glEnd();
+                       }
+#endif
+               }
+       }
+       
+       if (num_buffered_hairs > 0) {
+               /* finalize buffers and draw */
 #ifdef USE_BUFFERS
                glUnmapBuffer(GL_ARRAY_BUFFER);
                glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
                
-               /* draw */
-//             glShadeModel(GL_SMOOTH);
-               glDrawElements(GL_LINES, totelems, GL_UNSIGNED_INT, NULL);
+//                     glShadeModel(GL_SMOOTH);
+               glDrawElements(GL_LINES, elem_offset, GL_UNSIGNED_INT, NULL);
 #else
                {
                        int u;
@@ -196,10 +226,11 @@ static void draw_hair_render(HairSystem *hsys)
 #endif
        
        BKE_hair_render_iter_end(&iter);
-       
-#undef USE_BUFFERS
 }
 
+#undef USE_BUFFERS
+
+
 static void count_hairs(HairSystem *hsys, int *totpoints, int *validhairs)
 {
        HairCurve *hair;

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

Reply via email to