goat3d

view src/goat3d.h @ 29:3d669155709d

- switched the unix build to use the internal vmath/anim as well - fixed a memory corruption issue which was caused by including the system-wide installed version of the anim.h header file - started the ass2goat assimp->goat3d converter
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 29 Sep 2013 21:53:03 +0300
parents 1c601bf07b86
children a5c5cec3cb88
line source
1 #ifndef GOAT3D_H_
2 #define GOAT3D_H_
4 #include <stdio.h>
5 #include <stdlib.h>
7 #define GOAT3D_MAT_ATTR_DIFFUSE "diffuse"
8 #define GOAT3D_MAT_ATTR_SPECULAR "specular"
9 #define GOAT3D_MAT_ATTR_SHININESS "shininess"
10 #define GOAT3D_MAT_ATTR_NORMAL "normal"
11 #define GOAT3D_MAT_ATTR_BUMP "bump"
12 #define GOAT3D_MAT_ATTR_REFLECTION "reflection"
13 #define GOAT3D_MAT_ATTR_TRANSMISSION "transmission"
14 #define GOAT3D_MAT_ATTR_IOR "ior"
16 enum goat3d_mesh_attrib {
17 GOAT3D_MESH_ATTR_VERTEX,
18 GOAT3D_MESH_ATTR_NORMAL,
19 GOAT3D_MESH_ATTR_TANGENT,
20 GOAT3D_MESH_ATTR_TEXCOORD,
21 GOAT3D_MESH_ATTR_SKIN_WEIGHT,
22 GOAT3D_MESH_ATTR_SKIN_MATRIX,
23 GOAT3D_MESH_ATTR_COLOR,
25 NUM_GOAT3D_MESH_ATTRIBS
26 };
28 enum goat3d_node_type {
29 GOAT3D_NODE_NULL,
30 GOAT3D_NODE_MESH,
31 GOAT3D_NODE_LIGHT,
32 GOAT3D_NODE_CAMERA
33 };
35 /* immediate mode mesh construction primitive type */
36 enum goat3d_im_primitive {
37 GOAT3D_TRIANGLES,
38 GOAT3D_QUADS
39 };
42 enum goat3d_option {
43 GOAT3D_OPT_SAVEXML, /* save in XML format */
45 NUM_GOAT3D_OPTIONS
46 };
48 struct goat3d;
49 struct goat3d_material;
50 struct goat3d_mesh;
51 struct goat3d_light;
52 struct goat3d_camera;
53 struct goat3d_node;
55 struct goat3d_io {
56 void *cls; /* closure data */
58 long (*read)(void *buf, size_t bytes, void *uptr);
59 long (*write)(const void *buf, size_t bytes, void *uptr);
60 long (*seek)(long offs, int whence, void *uptr);
61 };
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
67 /* construction/destruction */
68 struct goat3d *goat3d_create(void);
69 void goat3d_free(struct goat3d *g);
71 void goat3d_setopt(struct goat3d *g, enum goat3d_option opt, int val);
72 int goat3d_getopt(const struct goat3d *g, enum goat3d_option opt);
74 /* load/save */
75 int goat3d_load(struct goat3d *g, const char *fname);
76 int goat3d_save(const struct goat3d *g, const char *fname);
78 int goat3d_load_file(struct goat3d *g, FILE *fp);
79 int goat3d_save_file(const struct goat3d *g, FILE *fp);
81 int goat3d_load_io(struct goat3d *g, struct goat3d_io *io);
82 int goat3d_save_io(const struct goat3d *g, struct goat3d_io *io);
84 /* misc scene properties */
85 int goat3d_set_name(struct goat3d *g, const char *name);
86 const char *goat3d_get_name(const struct goat3d *g);
88 void goat3d_set_ambient(struct goat3d *g, const float *ambient);
89 void goat3d_set_ambient3f(struct goat3d *g, float ar, float ag, float ab);
90 const float *goat3d_get_ambient(const struct goat3d *g);
92 /* materials */
93 void goat3d_add_mtl(struct goat3d *g, struct goat3d_material *mtl);
95 struct goat3d_material *goat3d_create_mtl(void);
96 void goat3d_destroy_mtl(struct goat3d_material *mtl);
98 void goat3d_set_mtl_name(struct goat3d_material *mtl, const char *name);
99 const char *goat3d_get_mtl_name(const struct goat3d_material *mtl);
101 void goat3d_set_mtl_attrib(struct goat3d_material *mtl, const char *attrib, const float *val);
102 void goat3d_set_mtl_attrib1f(struct goat3d_material *mtl, const char *attrib, float val);
103 void goat3d_set_mtl_attrib3f(struct goat3d_material *mtl, const char *attrib, float r, float g, float b);
104 void goat3d_set_mtl_attrib4f(struct goat3d_material *mtl, const char *attrib, float r, float g, float b, float a);
105 const float *goat3d_get_mtl_attrib(struct goat3d_material *mtl, const char *attrib);
107 void goat3d_set_mtl_attrib_map(struct goat3d_material *mtl, const char *attrib, const char *mapname);
108 const char *goat3d_get_mtl_attrib_map(struct goat3d_material *mtl, const char *attrib);
110 /* meshes */
111 void goat3d_add_mesh(struct goat3d *g, struct goat3d_mesh *mesh);
112 int goat3d_get_mesh_count(struct goat3d *g);
113 struct goat3d_mesh *goat3d_get_mesh(struct goat3d *g, int idx);
114 struct goat3d_mesh *goat3d_get_mesh_by_name(struct goat3d *g, const char *name);
116 struct goat3d_mesh *goat3d_create_mesh(void);
117 void goat3d_destroy_mesh(struct goat3d_mesh *mesh);
119 void goat3d_set_mesh_name(struct goat3d_mesh *mesh, const char *name);
120 const char *goat3d_get_mesh_name(const struct goat3d_mesh *mesh);
122 void goat3d_set_mesh_mtl(struct goat3d_mesh *mesh, struct goat3d_material *mtl);
123 struct goat3d_material *goat3d_get_mesh_mtl(struct goat3d_mesh *mesh);
125 int goat3d_get_mesh_attrib_count(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib);
126 int goat3d_get_mesh_face_count(struct goat3d_mesh *mesh);
128 /* sets all the data for a single vertex attribute array in one go.
129 * vnum is the number of *vertices* to be set, not the number of floats, ints or whatever
130 * data is expected to be something different depending on the attribute:
131 * - GOAT3D_MESH_ATTR_VERTEX - 3 floats per vertex
132 * - GOAT3D_MESH_ATTR_NORMAL - 3 floats per vertex
133 * - GOAT3D_MESH_ATTR_TANGENT - 3 floats per vertex
134 * - GOAT3D_MESH_ATTR_TEXCOORD - 2 floats per vertex
135 * - GOAT3D_MESH_ATTR_SKIN_WEIGHT - 4 floats per vertex
136 * - GOAT3D_MESH_ATTR_SKIN_MATRIX - 4 ints per vertex
137 * - GOAT3D_MESH_ATTR_COLOR - 4 floats per vertex
138 */
139 void goat3d_set_mesh_attribs(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, const void *data, int vnum);
140 /* returns a pointer to the beginning of the requested mesh attribute array */
141 void *goat3d_get_mesh_attribs(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib);
142 /* returns a pointer to the requested mesh attribute */
143 void *goat3d_get_mesh_attrib(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, int idx);
145 /* sets all the faces in one go. data is an array of 3 int vertex indices per face */
146 void goat3d_set_mesh_faces(struct goat3d_mesh *mesh, const int *data, int fnum);
147 /* returns a pointer to the beginning of the face index array */
148 int *goat3d_get_mesh_faces(struct goat3d_mesh *mesh);
149 /* returns a pointer to a face index */
150 int *goat3d_get_mesh_face(struct goat3d_mesh *mesh, int idx);
152 /* immediate mode OpenGL-like interface for setting mesh data
153 * NOTE: using this interface will result in no vertex sharing between faces
154 * NOTE2: the immedate mode interface is not thread-safe, either use locks, or don't
155 * use it at all in multithreaded situations.
156 */
157 void goat3d_begin(struct goat3d_mesh *mesh, enum goat3d_im_primitive prim);
158 void goat3d_end(void);
159 void goat3d_vertex3f(float x, float y, float z);
160 void goat3d_normal3f(float x, float y, float z);
161 void goat3d_tangent3f(float x, float y, float z);
162 void goat3d_texcoord2f(float x, float y);
163 void goat3d_skin_weight4f(float x, float y, float z, float w);
164 void goat3d_skin_matrix4i(int x, int y, int z, int w);
165 void goat3d_color3f(float x, float y, float z);
166 void goat3d_color4f(float x, float y, float z, float w);
168 /* lights */
169 void goat3d_add_light(struct goat3d *g, struct goat3d_light *lt);
170 int goat3d_get_light_count(struct goat3d *g);
171 struct goat3d_light *goat3d_get_light(struct goat3d *g, int idx);
172 struct goat3d_light *goat3d_get_light_by_name(struct goat3d *g, const char *name);
174 struct goat3d_light *goat3d_create_light(void);
175 void goat3d_destroy_light(struct goat3d_light *lt);
177 /* cameras */
178 void goat3d_add_camera(struct goat3d *g, struct goat3d_camera *cam);
179 int goat3d_get_camera_count(struct goat3d *g);
180 struct goat3d_camera *goat3d_get_camera(struct goat3d *g, int idx);
181 struct goat3d_camera *goat3d_get_camera_by_name(struct goat3d *g, const char *name);
183 struct goat3d_camera *goat3d_create_camera(void);
184 void goat3d_destroy_camera(struct goat3d_camera *cam);
186 /* nodes */
187 void goat3d_add_node(struct goat3d *g, struct goat3d_node *node);
188 int goat3d_get_node_count(struct goat3d *g);
189 struct goat3d_node *goat3d_get_node(struct goat3d *g, int idx);
190 struct goat3d_node *goat3d_get_node_by_name(struct goat3d *g, const char *name);
192 struct goat3d_node *goat3d_create_node(void);
193 void goat3d_destroy_node(struct goat3d_node *node);
195 void goat3d_set_node_name(struct goat3d_node *node, const char *name);
196 const char *goat3d_get_node_name(const struct goat3d_node *node);
198 void goat3d_set_node_object(struct goat3d_node *node, enum goat3d_node_type type, void *obj);
199 void *goat3d_get_node_object(const struct goat3d_node *node);
200 enum goat3d_node_type goat3d_get_node_type(const struct goat3d_node *node);
202 void goat3d_add_node_child(struct goat3d_node *node, struct goat3d_node *child);
203 int goat3d_get_node_child_count(const struct goat3d_node *node);
204 struct goat3d_node *goat3d_get_node_child(const struct goat3d_node *node, int idx);
206 void goat3d_set_node_position(struct goat3d_node *node, float x, float y, float z, long tmsec);
207 void goat3d_set_node_rotation(struct goat3d_node *node, float qx, float qy, float qz, float qw, long tmsec);
208 void goat3d_set_node_scaling(struct goat3d_node *node, float sx, float sy, float sz, long tmsec);
209 void goat3d_set_node_pivot(struct goat3d_node *node, float px, float py, float pz);
211 void goat3d_get_node_position(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, long tmsec);
212 void goat3d_get_node_rotation(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, float *wptr, long tmsec);
213 void goat3d_get_node_scaling(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, long tmsec);
214 void goat3d_get_node_pivot(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr);
216 void goat3d_get_node_matrix(const struct goat3d_node *node, float *matrix, long tmsec);
218 #ifdef __cplusplus
219 }
220 #endif
222 #endif /* GOAT3D_H_ */