summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2014-10-30 09:18:36 -0600
committerBrian Paul <brianp@vmware.com>2014-11-01 08:59:27 -0600
commitf3383fdb2d401e9f1f4423a35dfb319b407ad18d (patch)
treed39d1b5bf5ae95f453427f26074a353db9092431
parent88aa72ef863e9c757af11c788d38e8500e4e873f (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.c59
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]);