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 }
|