2 * See Licensing and Copyright notice in naev.h
8 * @brief Handles OpenGL vbos.
19 #define BUFFER_OFFSET(i) ((char *)NULL + (i)) /**< Taken from OpengL spec. */
25 typedef enum gl_vboType_e
{
26 NGL_VBO_NULL
, /**< No VBO type. */
27 NGL_VBO_STREAM
, /**< VBO streaming type. */
28 NGL_VBO_STATIC
/**< VBO static type. */
33 * @brief Contains the VBO.
36 GLuint id
; /**< VBO ID. */
37 gl_vboType type
; /**< VBO type. */
38 GLsizei size
; /**< VBO size. */
39 char* data
; /**< VBO data. */
43 static int has_vbo
= 0; /**< Whether or not has VBO. */
49 static gl_vbo
* gl_vboCreate( GLenum target
, GLsizei size
, void* data
, GLenum usage
);
53 * @brief Initializes the OpenGL VBO subsystem.
55 * @return 0 on success.
59 if (nglGenBuffers
!= NULL
)
67 * @brief Exits the OpenGL VBO subsystem.
69 void gl_exitVBO (void)
76 * @brief Creates a VBO.
78 * @param target Target to create to (usually GL_ARRAY_BUFFER).
79 * @param size Size of the buffer (in bytes).
80 * @param data The actual datat to use.
81 * @param usage Usage to use.
82 * @return ID of the vbo.
84 static gl_vbo
* gl_vboCreate( GLenum target
, GLsizei size
, void* data
, GLenum usage
)
89 vbo
= malloc( sizeof(gl_vbo
) );
90 memset( vbo
, 0, sizeof(gl_vbo
) );
96 /* Create the buffer. */
97 nglGenBuffers( 1, &vbo
->id
);
99 /* Upload the data. */
100 nglBindBuffer( target
, vbo
->id
);
101 nglBufferData( target
, size
, data
, usage
);
102 nglBindBuffer( target
, 0 );
106 vbo
->data
= malloc(size
);
108 memset( vbo
->data
, 0, size
);
110 memcpy( vbo
->data
, data
, size
);
113 /* Check for errors. */
121 * @brief Reloads new data or grows the size of the vbo.
123 * @param vbo VBO to get new data of.
124 * @param size Size of new data.
125 * @param data New data.
127 void gl_vboData( gl_vbo
*vbo
, GLsizei size
, void* data
)
135 if (vbo
->type
== NGL_VBO_STREAM
)
136 usage
= GL_STREAM_DRAW
;
137 else if (vbo
->type
== NGL_VBO_STATIC
)
138 usage
= GL_STATIC_DRAW
;
140 usage
= GL_STREAM_DRAW
;
143 nglBindBuffer( GL_ARRAY_BUFFER
, vbo
->id
);
144 nglBufferData( GL_ARRAY_BUFFER
, size
, data
, usage
);
148 vbo
->data
= realloc( vbo
->data
, size
);
150 memset( vbo
->data
, 0, size
);
152 memcpy( vbo
->data
, data
, size
);
155 /* Check for errors. */
161 * @brief Loads some data into the VBO.
163 * @param vbo VBO to load data into.
164 * @param offset Offset location of the data (in bytes).
165 * @param size Size of the data (in bytes).
166 * @param data Pointer to the data.
168 void gl_vboSubData( gl_vbo
*vbo
, GLint offset
, GLsizei size
, void* data
)
171 nglBindBuffer( GL_ARRAY_BUFFER
, vbo
->id
);
172 nglBufferSubData( GL_ARRAY_BUFFER
, offset
, size
, data
);
175 memcpy( &vbo
->data
[offset
], data
, size
);
178 /* Check for errors. */
184 * @brief Creates a stream vbo.
186 * @param size Size of the stream vbo (multiply by sizeof(type)).
187 * @param data Data for the VBO.
189 gl_vbo
* gl_vboCreateStream( GLsizei size
, void* data
)
193 vbo
= gl_vboCreate( GL_ARRAY_BUFFER
, size
, data
, GL_STREAM_DRAW
);
194 vbo
->type
= NGL_VBO_STREAM
;
196 /* Check for errors. */
204 * @brief Creates a stream vbo.
206 * @param size Size of the stream vbo (multiply by sizeof(type)).
207 * @param data Data for the VBO.
209 gl_vbo
* gl_vboCreateStatic( GLsizei size
, void* data
)
213 vbo
= gl_vboCreate( GL_ARRAY_BUFFER
, size
, data
, GL_STATIC_DRAW
);
214 vbo
->type
= NGL_VBO_STATIC
;
216 /* Check for errors. */
224 * @brief Maps a buffer.
226 * @param vbo VBO to map.
227 * @return The data contained in the vbo.
229 void* gl_vboMap( gl_vbo
*vbo
)
232 nglBindBuffer( GL_ARRAY_BUFFER
, vbo
->id
);
233 return nglMapBuffer( GL_ARRAY_BUFFER
, GL_WRITE_ONLY
);
241 * @brief Unmaps a buffer.
243 * @param vbo VBO to unmap.
245 void gl_vboUnmap( gl_vbo
*vbo
)
249 nglUnmapBuffer( GL_ARRAY_BUFFER
);
251 /* Check for errors. */
257 * @brief Activates a VBO.
259 * @param vbo VBO to activate.
260 * @param Should be one of GL_COLOR_ARRAY, GL_VERTEX_ARRAY, or GL_TEXTURE_COORD_ARRAY.
261 * @param size Specifies components per point.
262 * @param type Type of data (usually GL_FLOAT).
263 * @param stride Offset between consecutive points.
265 void gl_vboActivate( gl_vbo
*vbo
, GLuint
class, GLint size
, GLenum type
, GLsizei stride
)
267 gl_vboActivateOffset( vbo
, class, 0, size
, type
, stride
);
272 * @brief Activates a VBO's offset.
274 * @param vbo VBO to activate.
275 * @param class Should be one of GL_COLOR_ARRAY, GL_VERTEX_ARRAY,
276 * GL_TEXTURE_COORD_ARRAY, GL_TEXTURE0 or GL_TEXTURE1.
277 * @param offset Offset (in bytes).
278 * @param size Specifies components per point.
279 * @param type Type of data (usually GL_FLOAT).
280 * @param stride Offset between consecutive points.
282 void gl_vboActivateOffset( gl_vbo
*vbo
, GLuint
class, GLuint offset
,
283 GLint size
, GLenum type
, GLsizei stride
)
285 const GLvoid
*pointer
;
289 nglBindBuffer( GL_ARRAY_BUFFER
, vbo
->id
);
290 pointer
= BUFFER_OFFSET(offset
);
293 pointer
= &vbo
->data
[offset
];
295 /* Class specific. */
298 glEnableClientState(class);
299 glColorPointer( size
, type
, stride
, pointer
);
302 case GL_VERTEX_ARRAY
:
303 glEnableClientState(class);
304 glVertexPointer( size
, type
, stride
, pointer
);
307 case GL_TEXTURE_COORD_ARRAY
:
308 glEnableClientState(class);
309 glTexCoordPointer( size
, type
, stride
, pointer
);
313 nglClientActiveTexture( GL_TEXTURE0
);
314 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
315 glTexCoordPointer( size
, type
, stride
, pointer
);
319 nglClientActiveTexture( GL_TEXTURE1
);
320 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
321 glTexCoordPointer( size
, type
, stride
, pointer
);
325 WARN("Unknown VBO class.");
329 /* Check for errors. */
335 * @brief Deactivates the vbo stuff.
337 void gl_vboDeactivate (void)
340 nglBindBuffer(GL_ARRAY_BUFFER
, 0);
341 glDisableClientState(GL_VERTEX_ARRAY
);
342 glDisableClientState(GL_COLOR_ARRAY
);
343 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);
344 if (nglClientActiveTexture
!= NULL
) {
345 nglClientActiveTexture( GL_TEXTURE1
);
346 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);
347 nglClientActiveTexture( GL_TEXTURE0
);
348 glDisableClientState(GL_TEXTURE_COORD_ARRAY
);
351 /* Check for errors. */
357 * @brief Destroys a VBO.
359 * @param vbo VBO to destroy.
361 void gl_vboDestroy( gl_vbo
*vbo
)
365 nglDeleteBuffers( 1, &vbo
->id
);
369 /* Check for errors. */
378 * @brief Checks to see if the VBOs are supported by HW.
380 * @return 1 if VBOs are enabled and supported by HW.
382 int gl_vboIsHW (void)