// ---------------------------------------------------------------------------- vertex_buffer_t * vertex_buffer_new( const char *format ) { size_t i, index = 0, stride = 0; const char *start = 0, *end = 0; char *pointer = 0; vertex_buffer_t *self = (vertex_buffer_t *) malloc (sizeof(vertex_buffer_t)); if( !self ) { return NULL; } self->format = strdup( format ); for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) { self->attributes[i] = 0; } start = format; do { end = (char *) (strchr(start+1, ':')); char *desc = 0; if (end == NULL) { desc = strdup(start); } else { desc = strdup(start); desc[end-start] = '0'; } vertex_attribute_t *attribute = vertex_attribute_parse( desc ); start = end+1; free(desc); attribute->pointer = pointer; stride += attribute->size*GL_TYPE_SIZE( attribute->type ); pointer+= attribute->size*GL_TYPE_SIZE( attribute->type ); self->attributes[index] = attribute; index++; } while ( end && (index < MAX_VERTEX_ATTRIBUTE) ); for( i=0; i<index; ++i ) { self->attributes[i]->stride = stride; } self->vertices = vector_new( stride ); self->vertices_id = 0; self->indices = vector_new( sizeof(GLuint) ); self->indices_id = 0; self->dirty = 1; return self; }
// ---------------------------------------------------------------------------- vertex_buffer_t * vertex_buffer_new( const char *format ) { size_t i, index = 0, stride = 0; const char *start = 0, *end = 0; GLchar *pointer = 0; vertex_buffer_t *self = (vertex_buffer_t *) malloc (sizeof(vertex_buffer_t)); if( !self ) { return NULL; } self->format = strdup( format ); for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) { self->attributes[i] = 0; } start = format; do { char *desc = 0; vertex_attribute_t *attribute; GLuint attribute_size = 0; end = (char *) (strchr(start+1, ',')); if (end == NULL) { desc = strdup( start ); } else { desc = strndup( start, end-start ); } attribute = vertex_attribute_parse( desc ); start = end+1; free(desc); attribute->pointer = pointer; switch( attribute->type ) { case GL_BOOL: attribute_size = sizeof(GLboolean); break; case GL_BYTE: attribute_size = sizeof(GLbyte); break; case GL_UNSIGNED_BYTE: attribute_size = sizeof(GLubyte); break; case GL_SHORT: attribute_size = sizeof(GLshort); break; case GL_UNSIGNED_SHORT: attribute_size = sizeof(GLushort); break; case GL_INT: attribute_size = sizeof(GLint); break; case GL_UNSIGNED_INT: attribute_size = sizeof(GLuint); break; case GL_FLOAT: attribute_size = sizeof(GLfloat); break; default: attribute_size = 0; } stride += attribute->size*attribute_size; pointer += attribute->size*attribute_size; self->attributes[index] = attribute; index++; } while ( end && (index < MAX_VERTEX_ATTRIBUTE) ); for( i=0; i<index; ++i ) { self->attributes[i]->stride = stride; } self->vertices = vector_new( stride ); self->vertices_id = 0; self->GPU_vsize = 0; self->indices = vector_new( sizeof(GLuint) ); self->indices_id = 0; self->GPU_isize = 0; self->items = vector_new( sizeof(ivec4) ); self->state = DIRTY; self->mode = GL_TRIANGLES; return self; }
// ---------------------------------------------------------------------------- vertex_buffer_t * vertex_buffer_new( const char *format ) { size_t i, index = 0, stride = 0; const char *start = 0, *end = 0; GLvoid *pointer = 0; vertex_buffer_t *self = (vertex_buffer_t *) malloc (sizeof(vertex_buffer_t)); if( !self ) { return NULL; } self->format = strdup( format ); for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) { self->attributes[i] = 0; } start = format; do { end = (char *) (strchr(start+1, ':')); char *desc = 0; if (end == NULL) { desc = strdup(start); } else { // strndup() was only added in OSX lion #ifdef __APPLE__ size_t len = end-start; desc = calloc( len+1, sizeof(char) ); memcpy( desc, start, len ); #else desc = strndup(start, end-start); #endif } vertex_attribute_t *attribute = vertex_attribute_parse( desc ); start = end+1; free(desc); attribute->pointer = pointer; stride += attribute->size*GL_TYPE_SIZE( attribute->type ); pointer+= attribute->size*GL_TYPE_SIZE( attribute->type ); self->attributes[index] = attribute; index++; } while ( end && (index < MAX_VERTEX_ATTRIBUTE) ); for( i=0; i<index; ++i ) { self->attributes[i]->stride = stride; } self->vertices = vector_new( stride ); self->vertices_id = 0; self->indices = vector_new( sizeof(GLuint) ); self->indices_id = 0; self->dirty = 1; return self; }
// ---------------------------------------------------------------------------- VertexBuffer * vertex_buffer_new( const char *format ) { size_t i, index = 0, stride = 0; const char *start = 0, *end = 0; GLvoid *pointer = 0; VertexBuffer *self = (VertexBuffer *) malloc (sizeof(VertexBuffer)); if( !self ) { return NULL; } self->format = strdup( format ); for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) { self->attributes[i] = 0; } start = format; do { end = (char *) (strchr(start+1, ':')); { char *desc = 0; if (end == NULL) { desc = strdup(start); } else { desc = strndup(start, end-start); } { VertexAttribute *attribute = vertex_attribute_parse( desc ); start = end+1; free(desc); attribute->pointer = pointer; stride += attribute->size*GL_TYPE_SIZE( attribute->type ); #ifdef _WIN32 pointer = (char *)pointer + attribute->size*GL_TYPE_SIZE( attribute->type ); #else pointer += attribute->size*GL_TYPE_SIZE( attribute->type ); #endif self->attributes[index] = attribute; index++; } } } while ( end && (index < MAX_VERTEX_ATTRIBUTE) ); for( i=0; i<index; ++i ) { self->attributes[i]->stride = stride; } self->vertices = vector_new( stride ); self->vertices_id = 0; self->indices = vector_new( sizeof(GLuint) ); self->indices_id = 0; self->dirty = 1; return self; }