[Bf-blender-cvs] [2d16cb2] hair_system: Use a larger OpenGL buffer for optimized hair drawing.
Lukas Tönne
noreply at git.blender.org
Wed Aug 13 10:43:55 CEST 2014
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;
More information about the Bf-blender-cvs
mailing list