labyrinth

annotate src/mesh.c @ 3:45b91185b298

android port
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 01 May 2015 04:36:50 +0300
parents 8ba79034e8a6
children c8826e5ebec1
rev   line source
nuclear@3 1 #include <stdlib.h>
nuclear@3 2 #include "opengl.h"
nuclear@0 3 #include "mesh.h"
nuclear@0 4 #include "objfile.h"
nuclear@0 5
nuclear@0 6 /* use objfile to load mesh data (vertices, normals, and texcoords)
nuclear@0 7 * from a wavefront|OBJ file.
nuclear@0 8 */
nuclear@0 9 struct mesh *load_mesh(const char *fname)
nuclear@0 10 {
nuclear@0 11 int i;
nuclear@0 12 struct mesh *m;
nuclear@0 13 struct objfile *obj;
nuclear@0 14
nuclear@0 15 if(!(obj = objf_load(fname))) {
nuclear@0 16 return 0;
nuclear@0 17 }
nuclear@0 18 m = malloc(sizeof *m);
nuclear@0 19 m->num_verts = objf_vertex_count(obj);
nuclear@0 20
nuclear@0 21 m->vert = malloc(m->num_verts * sizeof *m->vert);
nuclear@0 22 m->norm = malloc(m->num_verts * sizeof *m->norm);
nuclear@0 23 m->tc = malloc(m->num_verts * sizeof *m->tc);
nuclear@0 24
nuclear@0 25 for(i=0; i<m->num_verts; i++) {
nuclear@0 26 float *v = objf_vertex(obj, i);
nuclear@0 27 float *n = objf_normal(obj, i);
nuclear@0 28 float *t = objf_texcoord(obj, i);
nuclear@0 29
nuclear@0 30 m->vert[i].x = v[0];
nuclear@0 31 m->vert[i].y = v[1];
nuclear@0 32 m->vert[i].z = v[2];
nuclear@0 33
nuclear@0 34 m->norm[i].x = n[0];
nuclear@0 35 m->norm[i].y = n[1];
nuclear@0 36 m->norm[i].z = n[2];
nuclear@0 37
nuclear@0 38 m->tc[i].x = t[0];
nuclear@0 39 m->tc[i].y = t[1];
nuclear@0 40 }
nuclear@0 41 objf_free(obj);
nuclear@0 42 return m;
nuclear@0 43 }
nuclear@0 44
nuclear@0 45 void free_mesh(struct mesh *m)
nuclear@0 46 {
nuclear@0 47 if(m) {
nuclear@0 48 free(m->vert);
nuclear@0 49 free(m->norm);
nuclear@0 50 free(m->tc);
nuclear@0 51 free(m);
nuclear@0 52 }
nuclear@0 53 }
nuclear@0 54
nuclear@0 55 void render_mesh(struct mesh *m)
nuclear@0 56 {
nuclear@0 57 glEnableClientState(GL_VERTEX_ARRAY);
nuclear@0 58 glEnableClientState(GL_NORMAL_ARRAY);
nuclear@0 59 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
nuclear@0 60
nuclear@0 61 glVertexPointer(3, GL_FLOAT, 0, m->vert);
nuclear@0 62 glNormalPointer(GL_FLOAT, 0, m->norm);
nuclear@0 63 glTexCoordPointer(2, GL_FLOAT, 0, m->tc);
nuclear@0 64
nuclear@0 65 glDrawArrays(GL_TRIANGLES, 0, m->num_verts);
nuclear@0 66
nuclear@0 67 glDisableClientState(GL_VERTEX_ARRAY);
nuclear@0 68 glDisableClientState(GL_NORMAL_ARRAY);
nuclear@0 69 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
nuclear@0 70 }