Mercurial > hg > forks > bilotrip-mj12
view src/vertex-attribute.c @ 10:1ae09f1ddaa9
Move additional dynamic libraries under lib/
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 05 Aug 2013 15:02:32 +0300 |
parents | 785057719d9b |
children | 217cd6863772 |
line wrap: on
line source
/* ============================================================================ * Freetype GL - A C OpenGL Freetype engine * Platform: Any * WWW: http://code.google.com/p/freetype-gl/ * ---------------------------------------------------------------------------- * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are * those of the authors and should not be interpreted as representing official * policies, either expressed or implied, of Nicolas P. Rougier. * ============================================================================ */ #include <assert.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include "vec234.h" #include "platform.h" #include "vertex-attribute.h" // ---------------------------------------------------------------------------- vertex_attribute_t * vertex_attribute_new( GLchar * name, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLvoid *pointer ) { vertex_attribute_t *attribute = (vertex_attribute_t *) malloc (sizeof(vertex_attribute_t)); assert( size > 0 ); attribute->name = (GLchar *) strdup( name ); attribute->index = -1; attribute->size = size; attribute->type = type; attribute->normalized = normalized; attribute->stride = stride; attribute->pointer = pointer; return attribute; } // ---------------------------------------------------------------------------- void vertex_attribute_delete( vertex_attribute_t * self ) { assert( self ); free( self->name ); free( self ); } #include "ansidecl.h" #include <stddef.h> extern size_t strlen (const char*); extern PTR malloc (size_t); extern PTR memcpy (PTR, const PTR, size_t); char * strndup (const char *s, size_t n) { char *result; size_t len = strlen (s); if (n < len) len = n; result = (char *) malloc (len + 1); if (!result) return 0; result[len] = '\0'; return (char *) memcpy (result, s, len); } // ---------------------------------------------------------------------------- vertex_attribute_t * vertex_attribute_parse( char *format ) { GLenum type = 0; int size; int normalized = 0; char ctype; char *name; vertex_attribute_t *attr; char *p = strchr(format, ':'); if( p != NULL) { name = strndup(format, p-format); if( *(++p) == '\0' ) { fprintf( stderr, "No size specified for '%s' attribute\n", name ); free( name ); return 0; } size = *p - '0'; if( *(++p) == '\0' ) { fprintf( stderr, "No format specified for '%s' attribute\n", name ); free( name ); return 0; } ctype = *p; if( *(++p) != '\0' ) { if( *p == 'n' ) { normalized = 1; } } } else { fprintf(stderr, "Vertex attribute format not understood ('%s')\n", format ); return 0; } switch( ctype ) { case 'b': type = GL_BYTE; break; case 'B': type = GL_UNSIGNED_BYTE; break; case 's': type = GL_SHORT; break; case 'S': type = GL_UNSIGNED_SHORT; break; case 'i': type = GL_INT; break; case 'I': type = GL_UNSIGNED_INT; break; case 'f': type = GL_FLOAT; break; default: type = 0; break; } attr = vertex_attribute_new( name, size, type, normalized, 0, 0 ); free( name ); return attr; } // ---------------------------------------------------------------------------- void vertex_attribute_enable( vertex_attribute_t *attr ) { if( attr->index == -1 ) { GLint program; glGetIntegerv( GL_CURRENT_PROGRAM, &program ); if( program == 0) { return; } attr->index = glGetAttribLocation( program, attr->name ); if( attr->index == -1 ) { return; } } glEnableVertexAttribArray( attr->index ); glVertexAttribPointer( attr->index, attr->size, attr->type, attr->normalized, attr->stride, attr->pointer ); }