2 * Test GL_ARB_vertex_buffer_object
9 #define GL_GLEXT_PROTOTYPES
16 #define NUM_OBJECTS 10
26 static struct object Objects
[NUM_OBJECTS
];
27 static GLuint NumObjects
;
29 static GLfloat Xrot
= 0, Yrot
= 0, Zrot
= 0;
30 static GLboolean Anim
= GL_TRUE
;
33 static void CheckError(int line
)
35 GLenum err
= glGetError();
37 printf("GL Error %d at line %d\n", (int) err
, line
);
42 static void DrawObject( const struct object
*obj
)
44 glBindBufferARB(GL_ARRAY_BUFFER_ARB
, obj
->BufferID
);
45 glVertexPointer(3, GL_FLOAT
, 0, (void *) obj
->VertexOffset
);
46 glEnable(GL_VERTEX_ARRAY
);
47 glColorPointer(3, GL_FLOAT
, 0, (void *) obj
->ColorOffset
);
48 glEnable(GL_COLOR_ARRAY
);
49 glDrawArrays(GL_LINE_LOOP
, 0, obj
->NumVerts
);
53 static void Idle( void )
55 Zrot
= 0.05 * glutGet(GLUT_ELAPSED_TIME
);
60 static void Display( void )
64 glClear( GL_COLOR_BUFFER_BIT
);
66 for (i
= 0; i
< NumObjects
; i
++) {
67 float x
= 5.0 * ((float) i
/ (NumObjects
-1) - 0.5);
69 glTranslatef(x
, 0, 0);
70 glRotatef(Xrot
, 1, 0, 0);
71 glRotatef(Yrot
, 0, 1, 0);
72 glRotatef(Zrot
, 0, 0, 1);
74 DrawObject(Objects
+ i
);
84 static void Reshape( int width
, int height
)
86 float ar
= (float) width
/ (float) height
;
87 glViewport( 0, 0, width
, height
);
88 glMatrixMode( GL_PROJECTION
);
90 glFrustum( -ar
, ar
, -1.0, 1.0, 5.0, 25.0 );
91 glMatrixMode( GL_MODELVIEW
);
93 glTranslatef( 0.0, 0.0, -15.0 );
97 static void Key( unsigned char key
, int x
, int y
)
99 const GLfloat step
= 3.0;
124 static void SpecialKey( int key
, int x
, int y
)
126 const GLfloat step
= 3.0;
148 static void MakeObject1(struct object
*obj
)
152 glGenBuffersARB(1, &obj
->BufferID
);
153 glBindBufferARB(GL_ARRAY_BUFFER_ARB
, obj
->BufferID
);
154 glBufferDataARB(GL_ARRAY_BUFFER_ARB
, 1000, NULL
, GL_STATIC_DRAW_ARB
);
155 v
= (GLfloat
*) glMapBufferARB(GL_ARRAY_BUFFER_ARB
, GL_READ_WRITE_ARB
);
158 v
[0] = -1; v
[1] = -1; v
[2] = 0;
159 v
[3] = 1; v
[4] = -1; v
[5] = 0;
160 v
[6] = 1; v
[7] = 1; v
[8] = 0;
161 v
[9] = -1; v
[10] = 1; v
[11] = 0;
163 c
[0] = 1; c
[1] = 0; c
[2] = 0;
164 c
[3] = 1; c
[4] = 0; c
[5] = 0;
165 c
[6] = 1; c
[7] = 0; c
[8] = 1;
166 c
[9] = 1; c
[10] = 0; c
[11] = 1;
168 obj
->VertexOffset
= 0;
169 obj
->ColorOffset
= 3 * sizeof(GLfloat
) * obj
->NumVerts
;
171 glUnmapBufferARB(GL_ARRAY_BUFFER_ARB
);
175 static void MakeObject2(struct object
*obj
)
179 glGenBuffersARB(1, &obj
->BufferID
);
180 glBindBufferARB(GL_ARRAY_BUFFER_ARB
, obj
->BufferID
);
181 glBufferDataARB(GL_ARRAY_BUFFER_ARB
, 1000, NULL
, GL_STATIC_DRAW_ARB
);
182 v
= (GLfloat
*) glMapBufferARB(GL_ARRAY_BUFFER_ARB
, GL_READ_WRITE_ARB
);
185 v
[0] = -1; v
[1] = -1; v
[2] = 0;
186 v
[3] = 1; v
[4] = -1; v
[5] = 0;
187 v
[6] = 0; v
[7] = 1; v
[8] = 0;
189 c
[0] = 0; c
[1] = 1; c
[2] = 0;
190 c
[3] = 0; c
[4] = 1; c
[5] = 0;
191 c
[6] = 1; c
[7] = 1; c
[8] = 0;
193 obj
->VertexOffset
= 0;
194 obj
->ColorOffset
= 3 * sizeof(GLfloat
) * obj
->NumVerts
;
196 glUnmapBufferARB(GL_ARRAY_BUFFER_ARB
);
200 static void MakeObject3(struct object
*obj
)
204 glGenBuffersARB(1, &obj
->BufferID
);
205 glBindBufferARB(GL_ARRAY_BUFFER_ARB
, obj
->BufferID
);
206 glBufferDataARB(GL_ARRAY_BUFFER_ARB
, 1000, NULL
, GL_STATIC_DRAW_ARB
);
207 v
= (GLfloat
*) glMapBufferARB(GL_ARRAY_BUFFER_ARB
, GL_READ_WRITE_ARB
);
210 v
[0] = -1; v
[1] = -0.5; v
[2] = 0;
211 v
[3] = 1; v
[4] = -0.5; v
[5] = 0;
212 v
[6] = 1; v
[7] = 0.5; v
[8] = 0;
213 v
[9] = -1; v
[10] = 0.5; v
[11] = 0;
215 c
[0] = 0; c
[1] = 0; c
[2] = 1;
216 c
[3] = 0; c
[4] = 0; c
[5] = 1;
217 c
[6] = 0; c
[7] = 1; c
[8] = 1;
218 c
[9] = 0; c
[10] = 1; c
[11] = 1;
220 obj
->VertexOffset
= 0;
221 obj
->ColorOffset
= 3 * sizeof(GLfloat
) * obj
->NumVerts
;
223 glUnmapBufferARB(GL_ARRAY_BUFFER_ARB
);
228 static void Init( void )
230 if (!glutExtensionSupported("GL_ARB_vertex_buffer_object")) {
231 printf("GL_ARB_vertex_buffer_object not found!\n");
234 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER
));
236 MakeObject1(Objects
+ 0);
237 MakeObject2(Objects
+ 1);
238 MakeObject3(Objects
+ 2);
243 int main( int argc
, char *argv
[] )
245 glutInit( &argc
, argv
);
246 glutInitWindowPosition( 0, 0 );
247 glutInitWindowSize( 600, 300 );
248 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
249 glutCreateWindow(argv
[0]);
250 glutReshapeFunc( Reshape
);
251 glutKeyboardFunc( Key
);
252 glutSpecialFunc( SpecialKey
);
253 glutDisplayFunc( Display
);