goat3d

view src/goat3d.h @ 45:8da36540e2e9

fixed memory leak in readxml and reversed error return
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 08 Dec 2013 02:27:32 +0200
parents da3f335e0069
children 498ca7ac7047
line source
1 #ifndef GOAT3D_H_
2 #define GOAT3D_H_
4 #include <stdio.h>
5 #include <stdlib.h>
7 #ifdef WIN32
8 #define GOAT3DAPI __declspec(dllexport)
9 #else
10 #define GOAT3DAPI
11 #endif
13 #define GOAT3D_MAT_ATTR_DIFFUSE "diffuse"
14 #define GOAT3D_MAT_ATTR_SPECULAR "specular"
15 #define GOAT3D_MAT_ATTR_SHININESS "shininess"
16 #define GOAT3D_MAT_ATTR_NORMAL "normal"
17 #define GOAT3D_MAT_ATTR_BUMP "bump"
18 #define GOAT3D_MAT_ATTR_REFLECTION "reflection"
19 #define GOAT3D_MAT_ATTR_TRANSMISSION "transmission"
20 #define GOAT3D_MAT_ATTR_IOR "ior"
21 #define GOAT3D_MAT_ATTR_ALPHA "alpha"
23 enum goat3d_mesh_attrib {
24 GOAT3D_MESH_ATTR_VERTEX,
25 GOAT3D_MESH_ATTR_NORMAL,
26 GOAT3D_MESH_ATTR_TANGENT,
27 GOAT3D_MESH_ATTR_TEXCOORD,
28 GOAT3D_MESH_ATTR_SKIN_WEIGHT,
29 GOAT3D_MESH_ATTR_SKIN_MATRIX,
30 GOAT3D_MESH_ATTR_COLOR,
32 NUM_GOAT3D_MESH_ATTRIBS
33 };
35 enum goat3d_node_type {
36 GOAT3D_NODE_NULL,
37 GOAT3D_NODE_MESH,
38 GOAT3D_NODE_LIGHT,
39 GOAT3D_NODE_CAMERA
40 };
42 /* immediate mode mesh construction primitive type */
43 enum goat3d_im_primitive {
44 GOAT3D_TRIANGLES,
45 GOAT3D_QUADS
46 };
49 enum goat3d_option {
50 GOAT3D_OPT_SAVEXML, /* save in XML format */
52 NUM_GOAT3D_OPTIONS
53 };
55 struct goat3d;
56 struct goat3d_material;
57 struct goat3d_mesh;
58 struct goat3d_light;
59 struct goat3d_camera;
60 struct goat3d_node;
62 struct goat3d_io {
63 void *cls; /* closure data */
65 long (*read)(void *buf, size_t bytes, void *uptr);
66 long (*write)(const void *buf, size_t bytes, void *uptr);
67 long (*seek)(long offs, int whence, void *uptr);
68 };
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
74 /* construction/destruction */
75 GOAT3DAPI struct goat3d *goat3d_create(void);
76 GOAT3DAPI void goat3d_free(struct goat3d *g);
78 GOAT3DAPI void goat3d_setopt(struct goat3d *g, enum goat3d_option opt, int val);
79 GOAT3DAPI int goat3d_getopt(const struct goat3d *g, enum goat3d_option opt);
81 /* load/save */
82 GOAT3DAPI int goat3d_load(struct goat3d *g, const char *fname);
83 GOAT3DAPI int goat3d_save(const struct goat3d *g, const char *fname);
85 GOAT3DAPI int goat3d_load_file(struct goat3d *g, FILE *fp);
86 GOAT3DAPI int goat3d_save_file(const struct goat3d *g, FILE *fp);
88 GOAT3DAPI int goat3d_load_io(struct goat3d *g, struct goat3d_io *io);
89 GOAT3DAPI int goat3d_save_io(const struct goat3d *g, struct goat3d_io *io);
91 /* misc scene properties */
92 GOAT3DAPI int goat3d_set_name(struct goat3d *g, const char *name);
93 GOAT3DAPI const char *goat3d_get_name(const struct goat3d *g);
95 GOAT3DAPI void goat3d_set_ambient(struct goat3d *g, const float *ambient);
96 GOAT3DAPI void goat3d_set_ambient3f(struct goat3d *g, float ar, float ag, float ab);
97 GOAT3DAPI const float *goat3d_get_ambient(const struct goat3d *g);
99 /* materials */
100 GOAT3DAPI void goat3d_add_mtl(struct goat3d *g, struct goat3d_material *mtl);
102 GOAT3DAPI struct goat3d_material *goat3d_create_mtl(void);
103 GOAT3DAPI void goat3d_destroy_mtl(struct goat3d_material *mtl);
105 GOAT3DAPI void goat3d_set_mtl_name(struct goat3d_material *mtl, const char *name);
106 GOAT3DAPI const char *goat3d_get_mtl_name(const struct goat3d_material *mtl);
108 GOAT3DAPI void goat3d_set_mtl_attrib(struct goat3d_material *mtl, const char *attrib, const float *val);
109 GOAT3DAPI void goat3d_set_mtl_attrib1f(struct goat3d_material *mtl, const char *attrib, float val);
110 GOAT3DAPI void goat3d_set_mtl_attrib3f(struct goat3d_material *mtl, const char *attrib, float r, float g, float b);
111 GOAT3DAPI void goat3d_set_mtl_attrib4f(struct goat3d_material *mtl, const char *attrib, float r, float g, float b, float a);
112 GOAT3DAPI const float *goat3d_get_mtl_attrib(struct goat3d_material *mtl, const char *attrib);
114 GOAT3DAPI void goat3d_set_mtl_attrib_map(struct goat3d_material *mtl, const char *attrib, const char *mapname);
115 GOAT3DAPI const char *goat3d_get_mtl_attrib_map(struct goat3d_material *mtl, const char *attrib);
117 /* meshes */
118 GOAT3DAPI void goat3d_add_mesh(struct goat3d *g, struct goat3d_mesh *mesh);
119 GOAT3DAPI int goat3d_get_mesh_count(struct goat3d *g);
120 GOAT3DAPI struct goat3d_mesh *goat3d_get_mesh(struct goat3d *g, int idx);
121 GOAT3DAPI struct goat3d_mesh *goat3d_get_mesh_by_name(struct goat3d *g, const char *name);
123 GOAT3DAPI struct goat3d_mesh *goat3d_create_mesh(void);
124 GOAT3DAPI void goat3d_destroy_mesh(struct goat3d_mesh *mesh);
126 GOAT3DAPI void goat3d_set_mesh_name(struct goat3d_mesh *mesh, const char *name);
127 GOAT3DAPI const char *goat3d_get_mesh_name(const struct goat3d_mesh *mesh);
129 GOAT3DAPI void goat3d_set_mesh_mtl(struct goat3d_mesh *mesh, struct goat3d_material *mtl);
130 GOAT3DAPI struct goat3d_material *goat3d_get_mesh_mtl(struct goat3d_mesh *mesh);
132 GOAT3DAPI int goat3d_get_mesh_attrib_count(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib);
133 GOAT3DAPI int goat3d_get_mesh_face_count(struct goat3d_mesh *mesh);
135 /* sets all the data for a single vertex attribute array in one go.
136 * vnum is the number of *vertices* to be set, not the number of floats, ints or whatever
137 * data is expected to be something different depending on the attribute:
138 * - GOAT3D_MESH_ATTR_VERTEX - 3 floats per vertex
139 * - GOAT3D_MESH_ATTR_NORMAL - 3 floats per vertex
140 * - GOAT3D_MESH_ATTR_TANGENT - 3 floats per vertex
141 * - GOAT3D_MESH_ATTR_TEXCOORD - 2 floats per vertex
142 * - GOAT3D_MESH_ATTR_SKIN_WEIGHT - 4 floats per vertex
143 * - GOAT3D_MESH_ATTR_SKIN_MATRIX - 4 ints per vertex
144 * - GOAT3D_MESH_ATTR_COLOR - 4 floats per vertex
145 */
146 GOAT3DAPI void goat3d_set_mesh_attribs(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib,
147 const void *data, int vnum);
148 GOAT3DAPI void goat3d_add_mesh_attrib1f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, float val);
149 GOAT3DAPI void goat3d_add_mesh_attrib3f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib,
150 float x, float y, float z);
151 GOAT3DAPI void goat3d_add_mesh_attrib4f(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib,
152 float x, float y, float z, float w);
153 /* returns a pointer to the beginning of the requested mesh attribute array */
154 GOAT3DAPI void *goat3d_get_mesh_attribs(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib);
155 /* returns a pointer to the requested mesh attribute */
156 GOAT3DAPI void *goat3d_get_mesh_attrib(struct goat3d_mesh *mesh, enum goat3d_mesh_attrib attrib, int idx);
158 /* sets all the faces in one go. data is an array of 3 int vertex indices per face */
159 GOAT3DAPI void goat3d_set_mesh_faces(struct goat3d_mesh *mesh, const int *data, int fnum);
160 GOAT3DAPI void goat3d_add_mesh_face(struct goat3d_mesh *mesh, int a, int b, int c);
161 /* returns a pointer to the beginning of the face index array */
162 GOAT3DAPI int *goat3d_get_mesh_faces(struct goat3d_mesh *mesh);
163 /* returns a pointer to a face index */
164 GOAT3DAPI int *goat3d_get_mesh_face(struct goat3d_mesh *mesh, int idx);
166 /* immediate mode OpenGL-like interface for setting mesh data
167 * NOTE: using this interface will result in no vertex sharing between faces
168 * NOTE2: the immedate mode interface is not thread-safe, either use locks, or don't
169 * use it at all in multithreaded situations.
170 */
171 GOAT3DAPI void goat3d_begin(struct goat3d_mesh *mesh, enum goat3d_im_primitive prim);
172 GOAT3DAPI void goat3d_end(void);
173 GOAT3DAPI void goat3d_vertex3f(float x, float y, float z);
174 GOAT3DAPI void goat3d_normal3f(float x, float y, float z);
175 GOAT3DAPI void goat3d_tangent3f(float x, float y, float z);
176 GOAT3DAPI void goat3d_texcoord2f(float x, float y);
177 GOAT3DAPI void goat3d_skin_weight4f(float x, float y, float z, float w);
178 GOAT3DAPI void goat3d_skin_matrix4i(int x, int y, int z, int w);
179 GOAT3DAPI void goat3d_color3f(float x, float y, float z);
180 GOAT3DAPI void goat3d_color4f(float x, float y, float z, float w);
182 /* lights */
183 GOAT3DAPI void goat3d_add_light(struct goat3d *g, struct goat3d_light *lt);
184 GOAT3DAPI int goat3d_get_light_count(struct goat3d *g);
185 GOAT3DAPI struct goat3d_light *goat3d_get_light(struct goat3d *g, int idx);
186 GOAT3DAPI struct goat3d_light *goat3d_get_light_by_name(struct goat3d *g, const char *name);
188 GOAT3DAPI struct goat3d_light *goat3d_create_light(void);
189 GOAT3DAPI void goat3d_destroy_light(struct goat3d_light *lt);
191 /* cameras */
192 GOAT3DAPI void goat3d_add_camera(struct goat3d *g, struct goat3d_camera *cam);
193 GOAT3DAPI int goat3d_get_camera_count(struct goat3d *g);
194 GOAT3DAPI struct goat3d_camera *goat3d_get_camera(struct goat3d *g, int idx);
195 GOAT3DAPI struct goat3d_camera *goat3d_get_camera_by_name(struct goat3d *g, const char *name);
197 GOAT3DAPI struct goat3d_camera *goat3d_create_camera(void);
198 GOAT3DAPI void goat3d_destroy_camera(struct goat3d_camera *cam);
200 /* nodes */
201 GOAT3DAPI void goat3d_add_node(struct goat3d *g, struct goat3d_node *node);
202 GOAT3DAPI int goat3d_get_node_count(struct goat3d *g);
203 GOAT3DAPI struct goat3d_node *goat3d_get_node(struct goat3d *g, int idx);
204 GOAT3DAPI struct goat3d_node *goat3d_get_node_by_name(struct goat3d *g, const char *name);
206 GOAT3DAPI struct goat3d_node *goat3d_create_node(void);
207 GOAT3DAPI void goat3d_destroy_node(struct goat3d_node *node);
209 GOAT3DAPI void goat3d_set_node_name(struct goat3d_node *node, const char *name);
210 GOAT3DAPI const char *goat3d_get_node_name(const struct goat3d_node *node);
212 GOAT3DAPI void goat3d_set_node_object(struct goat3d_node *node, enum goat3d_node_type type, void *obj);
213 GOAT3DAPI void *goat3d_get_node_object(const struct goat3d_node *node);
214 GOAT3DAPI enum goat3d_node_type goat3d_get_node_type(const struct goat3d_node *node);
216 GOAT3DAPI void goat3d_add_node_child(struct goat3d_node *node, struct goat3d_node *child);
217 GOAT3DAPI int goat3d_get_node_child_count(const struct goat3d_node *node);
218 GOAT3DAPI struct goat3d_node *goat3d_get_node_child(const struct goat3d_node *node, int idx);
220 GOAT3DAPI void goat3d_set_node_position(struct goat3d_node *node, float x, float y, float z, long tmsec);
221 GOAT3DAPI void goat3d_set_node_rotation(struct goat3d_node *node, float qx, float qy, float qz, float qw, long tmsec);
222 GOAT3DAPI void goat3d_set_node_scaling(struct goat3d_node *node, float sx, float sy, float sz, long tmsec);
223 GOAT3DAPI void goat3d_set_node_pivot(struct goat3d_node *node, float px, float py, float pz);
225 GOAT3DAPI void goat3d_get_node_position(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, long tmsec);
226 GOAT3DAPI void goat3d_get_node_rotation(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, float *wptr, long tmsec);
227 GOAT3DAPI void goat3d_get_node_scaling(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr, long tmsec);
228 GOAT3DAPI void goat3d_get_node_pivot(const struct goat3d_node *node, float *xptr, float *yptr, float *zptr);
230 GOAT3DAPI void goat3d_get_node_matrix(const struct goat3d_node *node, float *matrix, long tmsec);
232 #ifdef __cplusplus
233 }
234 #endif
236 #endif /* GOAT3D_H_ */