[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