diff options
author | Brian Paul <brianp@vmware.com> | 2014-10-30 09:18:36 -0600 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2014-11-01 08:59:27 -0600 |
commit | f3383fdb2d401e9f1f4423a35dfb319b407ad18d (patch) | |
tree | d39d1b5bf5ae95f453427f26074a353db9092431 | |
parent | 88aa72ef863e9c757af11c788d38e8500e4e873f (diff) |
geom-stipple-lines: use VBO, specify number of verts on cmd line
If no command line argument is given, draw 50 points (25 lines).
-rw-r--r-- | src/glsl/geom-stipple-lines.c | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/src/glsl/geom-stipple-lines.c b/src/glsl/geom-stipple-lines.c index 8b051a34..fa24605f 100644 --- a/src/glsl/geom-stipple-lines.c +++ b/src/glsl/geom-stipple-lines.c @@ -21,8 +21,7 @@ static GLboolean Anim = GL_TRUE; static GLboolean UseGeomShader = GL_TRUE; static GLfloat Xrot = 0, Yrot = 0; static int uViewportSize = -1, uStippleFactor = -1, uStipplePattern = -1; -static const int NumPoints = 50; -static float Points[100][3], Colors[100][3]; +static int NumPoints = 50; static const GLushort StipplePattern = 0x10ff; static GLuint StippleFactor = 2; @@ -66,8 +65,6 @@ SetStippleUniform(GLint factor, GLushort pattern) static void Redisplay(void) { - int i; - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPushMatrix(); @@ -83,12 +80,7 @@ Redisplay(void) glEnable(GL_LINE_STIPPLE); } - glBegin(GL_LINES); - for (i = 0; i < NumPoints; i++) { - glColor3fv(Colors[i]); - glVertex3fv(Points[i]); - } - glEnd(); + glDrawArrays(GL_LINES, 0, NumPoints / 2); glPopMatrix(); @@ -174,17 +166,36 @@ Key(unsigned char key, int x, int y) static void -MakePoints(void) +MakePointsVBO(void) { + struct vert { + GLfloat pos[3]; + GLfloat color[3]; + }; + struct vert *v; + GLuint vbo; int i; + + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, NumPoints * sizeof(struct vert), + NULL, GL_STATIC_DRAW); + + v = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); for (i = 0; i < NumPoints; i++) { - Colors[i][0] = (rand() % 1000) / 1000.0; - Colors[i][1] = (rand() % 1000) / 1000.0; - Colors[i][2] = (rand() % 1000) / 1000.0; - Points[i][0] = ((rand() % 2000) - 1000.0) / 500.0; - Points[i][1] = ((rand() % 2000) - 1000.0) / 500.0; - Points[i][2] = ((rand() % 2000) - 1000.0) / 500.0; + v[i].color[0] = (rand() % 1000) / 1000.0; + v[i].color[1] = (rand() % 1000) / 1000.0; + v[i].color[2] = (rand() % 1000) / 1000.0; + v[i].pos[0] = ((rand() % 2000) - 1000.0) / 500.0; + v[i].pos[1] = ((rand() % 2000) - 1000.0) / 500.0; + v[i].pos[2] = ((rand() % 2000) - 1000.0) / 500.0; } + glUnmapBuffer(GL_ARRAY_BUFFER); + + glVertexPointer(3, GL_FLOAT, sizeof(struct vert), (void *) 0); + glEnable(GL_VERTEX_ARRAY); + glColorPointer(3, GL_FLOAT, sizeof(struct vert), (void *) sizeof(float[3])); + glEnable(GL_COLOR_ARRAY); } @@ -299,7 +310,7 @@ Init(void) glLineStipple(StippleFactor, StipplePattern); SetStippleUniform(StippleFactor, StipplePattern); - MakePoints(); + MakePointsVBO(); } @@ -307,6 +318,18 @@ int main(int argc, char *argv[]) { glutInit(&argc, argv); + + if (argc > 1) { + int n = atoi(argv[1]); + if (n > 0) { + NumPoints = n; + } + else { + printf("Invalid number of points\n"); + return 1; + } + } + glutInitWindowSize(WinWidth, WinHeight); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); Win = glutCreateWindow(argv[0]); |