goat3d

annotate src/goat3d.h @ 55:af1310ed212b

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