foo
[vrlugburz] / src / mesh.h
1 #ifndef MESH_H_
2 #define MESH_H_
3
4 #include "cgmath/cgmath.h"
5 #include "geom.h"
6
7 enum {
8         MESH_ATTR_VERTEX,
9         MESH_ATTR_NORMAL,
10         MESH_ATTR_TANGENT,
11         MESH_ATTR_TEXCOORD
12 };
13
14 struct vertex {
15         cgm_vec3 pos;
16         cgm_vec3 norm;
17         cgm_vec3 tang;
18         cgm_vec2 tex;
19 };
20
21 enum {
22         TEX_DIFFUSE,
23         TEX_SPECULAR,
24         TEX_NORMAL,
25
26         NUM_TEX_SLOTS
27 };
28
29 struct material {
30         char *name;
31
32         cgm_vec3 color;
33         cgm_vec3 spec;
34         float shininess;
35
36         unsigned int tex[NUM_TEX_SLOTS];
37
38         struct material *next;
39 };
40
41 struct mesh {
42         char *name;
43
44         struct vertex *varr;
45         unsigned int *iarr;
46         int num_verts, num_idx;
47         int max_verts, max_idx;
48
49         struct material *mtl;
50
51         struct aabox bb;
52         int bbvalid;
53
54         unsigned int vbo, ibo;
55         int vbovalid;
56
57         struct mesh *next;
58 };
59
60 struct meshgroup {
61         /* doesn't own the meshes */
62         struct mesh **meshes;
63         int num_meshes, max_meshes;
64
65         struct aabox bb;
66         int bbvalid;
67
68         int num_verts, num_idx;
69         unsigned int vbo, ibo;
70         int vbovalid;
71 };
72
73 void init_mesh(struct mesh *m);
74 void destroy_mesh(struct mesh *m);
75 void clear_mesh(struct mesh *m);
76 int copy_mesh(struct mesh *dest, struct mesh *src);
77
78 void init_meshgroup(struct meshgroup *mg);
79 void destroy_meshgroup(struct meshgroup *mg);
80 void clear_meshgroup(struct meshgroup *mg);
81
82 void calc_mesh_bounds(struct mesh *m);
83
84 int add_mesh_vertex(struct mesh *m, struct vertex *v);
85 int add_mesh_index(struct mesh *m, int idx);
86 int add_mesh_face(struct mesh *m, int va, int vb, int vc);
87
88 int add_meshgroup_mesh(struct meshgroup *mg, struct mesh *m);
89
90 void draw_mesh(struct mesh *m);
91 void draw_meshgroup(struct meshgroup *mg);
92
93 void xform_mesh(struct mesh *mesh, float *mat);
94
95 #endif  /* MESH_H_ */