#include <string.h>
#include <assert.h>
#include <math.h>
+#include "obj.h"
+
+#define MAXSTR 1024
+#define OPT_CLAMP 1
#ifndef CONF_NO_GL
-#ifdef __APPLE__
-# include <OpenGL/gl3.h>
+#ifdef OBJ_INDEX_IS_INT
+typedef GL_UNSIGNED_INT GL_INDEX_T;
#else
-# include <GL/glew.h>
+typedef GL_UNSIGNED_SHORT GL_INDEX_T;
#endif
#endif
-#define MAXSTR 1024
-
-/*============================================================================*/
-
-#define index_t unsigned int
-#define GL_INDEX_T GL_UNSIGNED_INT
-/*
-#define index_t unsigned short
-#define GL_INDEX_T GL_UNSIGNED_SHORT
-*/
-/*============================================================================*/
-
-#include "obj.h"
-
-struct obj_prop
-{
- char *str;
- int opt;
- unsigned int map;
-
- float c[4];
- float o[3];
- float s[3];
-};
-
-struct obj_mtrl
-{
- char *name;
-
- struct obj_prop kv[OBJ_PROP_COUNT];
-};
-
-struct obj_vert
-{
- float u[3];
- float n[3];
- float t[2];
- float v[3];
-};
-
-struct obj_poly
-{
- index_t vi[3];
-};
-
-struct obj_line
-{
- index_t vi[2];
-};
-
-struct obj_surf
-{
- int mi;
-
- int pc;
- int pm;
- int lc;
- int lm;
-
- unsigned int pibo;
- unsigned int libo;
-
- struct obj_poly *pv;
- struct obj_line *lv;
-};
-
-struct obj
-{
- unsigned int vao;
- unsigned int vbo;
-
- int mc;
- int mm;
- int vc;
- int vm;
- int sc;
- int sm;
-
- int uloc;
- int nloc;
- int tloc;
- int vloc;
-
- int cloc[OBJ_PROP_COUNT];
- int oloc[OBJ_PROP_COUNT];
- int Mloc[OBJ_PROP_COUNT];
-
- struct obj_mtrl *mv;
- struct obj_vert *vv;
- struct obj_surf *sv;
-};
-
-static void invalidate(obj *);
+static void invalidate(struct obj *);
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
-static void read_image(obj *O, int mi, int ki, const char *line,
+static void read_image(struct obj *O, int mi, int ki, const char *line,
const char *path)
{
unsigned int clamp = 0;
if (sscanf(line, "-clamp %s%n", val, &n) >= 1)
{
- clamp = (strcmp(val, "on") == 0) ? OBJ_OPT_CLAMP : 0;
+ clamp = (strcmp(val, "on") == 0) ? OPT_CLAMP : 0;
line += n;
}
obj_set_mtrl_s (O, mi, ki, s);
}
-static void read_color(obj *O, int mi, int ki, const char *line)
+static void read_color(struct obj *O, int mi, int ki, const char *line)
{
float c[4];
obj_set_mtrl_c(O, mi, ki, c);
}
-static void read_alpha(obj *O, int mi, int ki, const char *line)
+static void read_alpha(struct obj *O, int mi, int ki, const char *line)
{
float c[4];
float t;
static void read_mtl(const char *path,
const char *file,
- const char *name, obj *O, int mi)
+ const char *name, struct obj *O, int mi)
{
char pathname[MAXSTR];
static int read_usemtl(const char *path,
const char *file,
- const char *line, obj *O)
+ const char *line, struct obj *O)
{
char name[MAXSTR];
return 0;
}
-static int read_poly_vertices(const char *line, obj *O, int gi)
+static int read_poly_vertices(const char *line, struct obj *O, int gi)
{
const char *c = line;
return ic;
}
-static void read_f(const char *line, obj *O, int si, int gi)
+static void read_f(const char *line, struct obj *O, int si, int gi)
{
float n[3];
float t[3];
return 0;
}
-static int read_line_vertices(const char *line, obj *O)
+static int read_line_vertices(const char *line, struct obj *O)
{
const char *c = line;
return ic;
}
-static void read_l(const char *line, obj *O, int si)
+static void read_l(const char *line, struct obj *O, int si)
{
int i, li;
/*----------------------------------------------------------------------------*/
-static void read_obj(obj *O, const char *filename)
+static void read_obj(struct obj *O, const char *filename)
{
char buf[MAXSTR];
char key[MAXSTR];
if (sp->lv) free(sp->lv);
}
-static void obj_rel(obj *O)
+static void obj_rel(struct obj *O)
{
int si;
int mi;
/*============================================================================*/
-obj *obj_create(const char *filename)
+struct obj *obj_create(const char *filename)
{
- obj *O;
+ struct obj *O;
int i;
/* Allocate and initialize a new file. */
- if ((O = (obj *) calloc(1, sizeof (obj))))
+ if ((O = (struct obj *) calloc(1, sizeof (struct obj))))
{
if (filename)
{
return O;
}
-void obj_delete(obj *O)
+void obj_delete(struct obj *O)
{
assert(O);
/*----------------------------------------------------------------------------*/
-int obj_add_mtrl(obj *O)
+int obj_add_mtrl(struct obj *O)
{
unsigned int opt = 0;
return mi;
}
-int obj_add_vert(obj *O)
+int obj_add_vert(struct obj *O)
{
int vi;
return vi;
}
-int obj_add_poly(obj *O, int si)
+int obj_add_poly(struct obj *O, int si)
{
int pi;
return pi;
}
-int obj_add_line(obj *O, int si)
+int obj_add_line(struct obj *O, int si)
{
int li;
return li;
}
-int obj_add_surf(obj *O)
+int obj_add_surf(struct obj *O)
{
int si;
/*----------------------------------------------------------------------------*/
-int obj_num_mtrl(const obj *O)
+int obj_num_mtrl(const struct obj *O)
{
assert(O);
return O->mc;
}
-int obj_num_vert(const obj *O)
+int obj_num_vert(const struct obj *O)
{
assert(O);
return O->vc;
}
-int obj_num_poly(const obj *O, int si)
+int obj_num_poly(const struct obj *O, int si)
{
assert_surf(O, si);
return O->sv[si].pc;
}
-int obj_num_line(const obj *O, int si)
+int obj_num_line(const struct obj *O, int si)
{
assert_surf(O, si);
return O->sv[si].lc;
}
-int obj_num_surf(const obj *O)
+int obj_num_surf(const struct obj *O)
{
assert(O);
return O->sc;
/*----------------------------------------------------------------------------*/
-void obj_del_mtrl(obj *O, int mi)
+void obj_del_mtrl(struct obj *O, int mi)
{
int si;
}
}
-void obj_del_vert(obj *O, int vi)
+void obj_del_vert(struct obj *O, int vi)
{
int si;
int pi;
invalidate(O);
}
-void obj_del_poly(obj *O, int si, int pi)
+void obj_del_poly(struct obj *O, int si, int pi)
{
assert_poly(O, si, pi);
O->sv[si].pc--;
}
-void obj_del_line(obj *O, int si, int li)
+void obj_del_line(struct obj *O, int si, int li)
{
assert_line(O, si, li);
O->sv[si].lc--;
}
-void obj_del_surf(obj *O, int si)
+void obj_del_surf(struct obj *O, int si)
{
assert_surf(O, si);
return dst;
}
-void obj_set_mtrl_name(obj *O, int mi, const char *name)
+void obj_set_mtrl_name(struct obj *O, int mi, const char *name)
{
assert_mtrl(O, mi);
O->mv[mi].name = set_name(O->mv[mi].name, name);
}
-void obj_set_mtrl_map(obj *O, int mi, int ki, const char *str)
+void obj_set_mtrl_map(struct obj *O, int mi, int ki, const char *str)
{
assert_prop(O, mi, ki);
O->mv[mi].kv[ki].str = set_name(O->mv[mi].kv[ki].str, str);
}
-void obj_set_mtrl_opt(obj *O, int mi, int ki, unsigned int opt)
+void obj_set_mtrl_opt(struct obj *O, int mi, int ki, unsigned int opt)
{
assert_prop(O, mi, ki);
O->mv[mi].kv[ki].opt = opt;
}
-void obj_set_mtrl_c(obj *O, int mi, int ki, const float c[4])
+void obj_set_mtrl_c(struct obj *O, int mi, int ki, const float c[4])
{
assert_prop(O, mi, ki);
O->mv[mi].kv[ki].c[3] = c[3];
}
-void obj_set_mtrl_s(obj *O, int mi, int ki, const float s[3])
+void obj_set_mtrl_s(struct obj *O, int mi, int ki, const float s[3])
{
assert_prop(O, mi, ki);
O->mv[mi].kv[ki].s[2] = s[2];
}
-void obj_set_mtrl_o(obj *O, int mi, int ki, const float o[3])
+void obj_set_mtrl_o(struct obj *O, int mi, int ki, const float o[3])
{
assert_prop(O, mi, ki);
/*----------------------------------------------------------------------------*/
-static void invalidate(obj *O)
+static void invalidate(struct obj *O)
{
#ifndef CONF_NO_GL
if (O->vbo) glDeleteBuffers (1, &O->vbo);
O->vao = 0;
}
-void obj_set_vert_v(obj *O, int vi, const float v[3])
+void obj_set_vert_v(struct obj *O, int vi, const float v[3])
{
assert_vert(O, vi);
invalidate(O);
}
-void obj_set_vert_t(obj *O, int vi, const float t[2])
+void obj_set_vert_t(struct obj *O, int vi, const float t[2])
{
assert_vert(O, vi);
invalidate(O);
}
-void obj_set_vert_n(obj *O, int vi, const float n[3])
+void obj_set_vert_n(struct obj *O, int vi, const float n[3])
{
assert_vert(O, vi);
invalidate(O);
}
-void obj_set_vert_u(obj *O, int vi, const float u[3])
+void obj_set_vert_u(struct obj *O, int vi, const float u[3])
{
assert_vert(O, vi);
/*----------------------------------------------------------------------------*/
-void obj_set_poly(obj *O, int si, int pi, const int vi[3])
+void obj_set_poly(struct obj *O, int si, int pi, const int vi[3])
{
assert_poly(O, si, pi);
- O->sv[si].pv[pi].vi[0] = (index_t) vi[0];
- O->sv[si].pv[pi].vi[1] = (index_t) vi[1];
- O->sv[si].pv[pi].vi[2] = (index_t) vi[2];
+ O->sv[si].pv[pi].vi[0] = (obj_index_t) vi[0];
+ O->sv[si].pv[pi].vi[1] = (obj_index_t) vi[1];
+ O->sv[si].pv[pi].vi[2] = (obj_index_t) vi[2];
}
-void obj_set_line(obj *O, int si, int li, const int vi[2])
+void obj_set_line(struct obj *O, int si, int li, const int vi[2])
{
assert_line(O, si, li);
- O->sv[si].lv[li].vi[0] = (index_t) vi[0];
- O->sv[si].lv[li].vi[1] = (index_t) vi[1];
+ O->sv[si].lv[li].vi[0] = (obj_index_t) vi[0];
+ O->sv[si].lv[li].vi[1] = (obj_index_t) vi[1];
}
-void obj_set_surf(obj *O, int si, int mi)
+void obj_set_surf(struct obj *O, int si, int mi)
{
assert_surf(O, si);
/*----------------------------------------------------------------------------*/
-void obj_set_vert_loc(obj *O, int u, int n, int t, int v)
+void obj_set_vert_loc(struct obj *O, int u, int n, int t, int v)
{
assert(O);
invalidate(O);
}
-void obj_set_prop_loc(obj *O, int ki, int c, int o, int M)
+void obj_set_prop_loc(struct obj *O, int ki, int c, int o, int M)
{
assert(O);
assert(0 <= ki && ki < OBJ_PROP_COUNT);
/*============================================================================*/
-const char *obj_get_mtrl_name(const obj *O, int mi)
+const char *obj_get_mtrl_name(const struct obj *O, int mi)
{
assert_mtrl(O, mi);
return O->mv[mi].name;
}
-unsigned int obj_get_mtrl_map(const obj *O, int mi, int ki)
+unsigned int obj_get_mtrl_map(const struct obj *O, int mi, int ki)
{
assert_prop(O, mi, ki);
return O->mv[mi].kv[ki].map;
}
-unsigned int obj_get_mtrl_opt(const obj *O, int mi, int ki)
+unsigned int obj_get_mtrl_opt(const struct obj *O, int mi, int ki)
{
assert_prop(O, mi, ki);
return O->mv[mi].kv[ki].opt;
}
-void obj_get_mtrl_c(const obj *O, int mi, int ki, float *c)
+void obj_get_mtrl_c(const struct obj *O, int mi, int ki, float *c)
{
assert_prop(O, mi, ki);
c[3] = O->mv[mi].kv[ki].c[3];
}
-void obj_get_mtrl_s(const obj *O, int mi, int ki, float *s)
+void obj_get_mtrl_s(const struct obj *O, int mi, int ki, float *s)
{
assert_prop(O, mi, ki);
s[2] = O->mv[mi].kv[ki].s[2];
}
-void obj_get_mtrl_o(const obj *O, int mi, int ki, float *o)
+void obj_get_mtrl_o(const struct obj *O, int mi, int ki, float *o)
{
assert_prop(O, mi, ki);
/*----------------------------------------------------------------------------*/
-void obj_get_vert_v(const obj *O, int vi, float *v)
+void obj_get_vert_v(const struct obj *O, int vi, float *v)
{
assert_vert(O, vi);
v[2] = O->vv[vi].v[2];
}
-void obj_get_vert_t(const obj *O, int vi, float *t)
+void obj_get_vert_t(const struct obj *O, int vi, float *t)
{
assert_vert(O, vi);
t[1] = O->vv[vi].t[1];
}
-void obj_get_vert_n(const obj *O, int vi, float *n)
+void obj_get_vert_n(const struct obj *O, int vi, float *n)
{
assert_vert(O, vi);
/*----------------------------------------------------------------------------*/
-void obj_get_poly(const obj *O, int si, int pi, int *vi)
+void obj_get_poly(const struct obj *O, int si, int pi, int *vi)
{
assert_poly(O, si, pi);
vi[2] = (int) O->sv[si].pv[pi].vi[2];
}
-void obj_get_line(const obj *O, int si, int li, int *vi)
+void obj_get_line(const struct obj *O, int si, int li, int *vi)
{
assert_line(O, si, li);
vi[1] = (int) O->sv[si].lv[li].vi[1];
}
-int obj_get_surf(const obj *O, int si)
+int obj_get_surf(const struct obj *O, int si)
{
assert_surf(O, si);
return O->sv[si].mi;
/*============================================================================*/
-void obj_mini(obj *O)
+void obj_mini(struct obj *O)
{
int si;
int mi;
}
}
-void obj_norm(obj *O)
+void obj_norm(struct obj *O)
{
int vi;
int si;
}
}
-void obj_proc(obj *O)
+void obj_proc(struct obj *O)
{
int si;
int sj;
}
}
-void obj_init(obj *O)
+void obj_init(struct obj *O)
{
#ifndef CONF_NO_GL
if (O->vao == 0)
/*----------------------------------------------------------------------------*/
-int obj_cmp_vert(obj *O, int vi, int vj, float eps, float dot)
+int obj_cmp_vert(struct obj *O, int vi, int vj, float eps, float dot)
{
if (fabs(O->vv[vi].v[0] - O->vv[vj].v[0]) >= eps) return 0;
if (fabs(O->vv[vi].v[1] - O->vv[vj].v[1]) >= eps) return 0;
return 1;
}
-void obj_swp_vert(obj *O, int vi, int vj)
+void obj_swp_vert(struct obj *O, int vi, int vj)
{
int si;
int pi;
}
}
-void obj_uniq(obj *O, float eps, float dot, int verbose)
+void obj_uniq(struct obj *O, float eps, float dot, int verbose)
{
int vc = O->vc;
int vi;
/*----------------------------------------------------------------------------*/
-void obj_sort(obj *O, int qc)
+void obj_sort(struct obj *O, int qc)
{
const int vc = O->vc;
for (pi = 0; pi < pc; ++pi)
{
- const index_t *i = O->sv[si].pv[pi].vi;
+ const obj_index_t *i = O->sv[si].pv[pi].vi;
vv[i[0]].ic++;
vv[i[1]].ic++;
for (pi = 0; pi < pc; ++pi)
{
- const index_t *i = O->sv[si].pv[pi].vi;
+ const obj_index_t *i = O->sv[si].pv[pi].vi;
vv[i[0]].iv[vv[i[0]].ic++] = pi;
vv[i[1]].iv[vv[i[1]].ic++] = pi;
for (pi = 0; pi < pc; ++pi)
{
- const index_t *i = O->sv[si].pv[pi].vi;
+ const obj_index_t *i = O->sv[si].pv[pi].vi;
int qd = qs - qc;
int pj = vv[qv[qj]].iv[ii];
int dj = 0;
- const index_t *j = O->sv[si].pv[pj].vi;
+ const obj_index_t *j = O->sv[si].pv[pj].vi;
/* Recently-used vertex bonus. */
free(vv);
}
-float obj_acmr(obj *O, int qc)
+float obj_acmr(struct obj *O, int qc)
{
int *vs = (int *) malloc(O->vc * sizeof (int));
int qs = 1;
for (pi = 0; pi < O->sv[si].pc; ++pi)
{
- const index_t *i = O->sv[si].pv[pi].vi;
+ const obj_index_t *i = O->sv[si].pv[pi].vi;
if (qs - vs[i[0]] >= qc) { vs[i[0]] = qs++; nn++; }
if (qs - vs[i[1]] >= qc) { vs[i[1]] = qs++; nn++; }
#ifndef CONF_NO_GL
-static void obj_render_prop(const obj *O, int mi, int ki)
+static void obj_render_prop(const struct obj *O, int mi, int ki)
{
const struct obj_prop *kp = O->mv[mi].kv + ki;
/* Apply the property options. */
- if (kp->opt & OBJ_OPT_CLAMP)
+ if (kp->opt & OPT_CLAMP)
wrap = GL_CLAMP_TO_EDGE;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
else glBindTexture(GL_TEXTURE_2D, 0);
}
-void obj_render_mtrl(const obj *O, int mi)
+void obj_render_mtrl(const struct obj *O, int mi)
{
int ki;
glActiveTexture(GL_TEXTURE0);
}
-void obj_render_surf(const obj *O, int si)
+void obj_render_surf(const struct obj *O, int si)
{
const struct obj_surf *sp = O->sv + si;
}
}
-void obj_render(obj *O)
+void obj_render(struct obj *O)
{
int si;
#else
-void obj_render(obj *O)
+void obj_render(struct obj *O)
{
}
/*============================================================================*/
-void obj_bound(const obj *O, float *b)
+void obj_bound(const struct obj *O, float *b)
{
int vi;
/*============================================================================*/
-static void obj_write_map(FILE *fout, const obj *O, int mi, int ki, const char *s)
+static void obj_write_map(FILE *fout, const struct obj *O, int mi, int ki, const char *s)
{
struct obj_prop *kp = O->mv[mi].kv + ki;
/* Store all map options. */
- if ((kp->opt & OBJ_OPT_CLAMP) != 0) fprintf(fout, "-clamp on ");
+ if ((kp->opt & OPT_CLAMP) != 0) fprintf(fout, "-clamp on ");
/* Store the map offset, if any. */
}
}
-static void obj_write_mtl(const obj *O, const char *mtl)
+static void obj_write_mtl(const struct obj *O, const char *mtl)
{
FILE *fout;
int mi;
fclose(fout);
}
-static void obj_write_obj(const obj *O, const char *obj,
+static void obj_write_obj(const struct obj *O, const char *obj,
const char *mtl, int prec)
{
FILE *fout;
}
}
-void obj_write(const obj *O, const char *obj, const char *mtl, int prec)
+void obj_write(const struct obj *O, const char *obj, const char *mtl, int prec)
{
assert(O);
#ifndef UTIL3D_OBJ_H
#define UTIL3D_OBJ_H
+#ifndef CONF_NO_GL
+#ifdef __APPLE__
+# include <OpenGL/gl3.h>
+#else
+# include <GL/glew.h>
+#endif
+#endif
+
+/*============================================================================*/
+
+#define OBJ_INDEX_IS_INT
+
+#ifdef OBJ_INDEX_IS_INT
+typedef unsigned int obj_index_t;
+#else
+typedef unsigned short obj_index_t;
+#endif
+
+/*============================================================================*/
+
#ifdef __cplusplus
extern "C" {
#endif
OBJ_PROP_COUNT
};
-#define OBJ_OPT_CLAMP 1
+struct obj_prop
+{
+ char *str;
+ int opt;
+ unsigned int map;
-/*----------------------------------------------------------------------------*/
+ float c[4];
+ float o[3];
+ float s[3];
+};
+
+struct obj_mtrl
+{
+ char *name;
+
+ struct obj_prop kv[OBJ_PROP_COUNT];
+};
-typedef struct obj obj;
+struct obj_vert
+{
+ float u[3];
+ float n[3];
+ float t[2];
+ float v[3];
+};
+
+struct obj_poly
+{
+ obj_index_t vi[3];
+};
+
+struct obj_line
+{
+ obj_index_t vi[2];
+};
+
+struct obj_surf
+{
+ int mi;
+
+ int pc;
+ int pm;
+ int lc;
+ int lm;
+
+ unsigned int pibo;
+ unsigned int libo;
+
+ struct obj_poly *pv;
+ struct obj_line *lv;
+};
+
+struct obj
+{
+ unsigned int vao;
+ unsigned int vbo;
+
+ int mc;
+ int mm;
+ int vc;
+ int vm;
+ int sc;
+ int sm;
+
+ int uloc;
+ int nloc;
+ int tloc;
+ int vloc;
+
+ int cloc[OBJ_PROP_COUNT];
+ int oloc[OBJ_PROP_COUNT];
+ int Mloc[OBJ_PROP_COUNT];
+
+ struct obj_mtrl *mv;
+ struct obj_vert *vv;
+ struct obj_surf *sv;
+};
+
+/*----------------------------------------------------------------------------*/
-obj *obj_create(const char *);
-void obj_render(obj *);
-void obj_delete(obj *);
+struct obj *obj_create(const char *);
+void obj_render(struct obj *);
+void obj_delete(struct obj *);
/*----------------------------------------------------------------------------*/
-int obj_add_mtrl(obj *);
-int obj_add_vert(obj *);
-int obj_add_poly(obj *, int);
-int obj_add_line(obj *, int);
-int obj_add_surf(obj *);
+int obj_add_mtrl(struct obj *);
+int obj_add_vert(struct obj *);
+int obj_add_poly(struct obj *, int);
+int obj_add_line(struct obj *, int);
+int obj_add_surf(struct obj *);
-int obj_num_mtrl(const obj *);
-int obj_num_vert(const obj *);
-int obj_num_poly(const obj *, int);
-int obj_num_line(const obj *, int);
-int obj_num_surf(const obj *);
+int obj_num_mtrl(const struct obj *);
+int obj_num_vert(const struct obj *);
+int obj_num_poly(const struct obj *, int);
+int obj_num_line(const struct obj *, int);
+int obj_num_surf(const struct obj *);
-void obj_del_mtrl(obj *, int);
-void obj_del_vert(obj *, int);
-void obj_del_poly(obj *, int, int);
-void obj_del_line(obj *, int, int);
-void obj_del_surf(obj *, int);
+void obj_del_mtrl(struct obj *, int);
+void obj_del_vert(struct obj *, int);
+void obj_del_poly(struct obj *, int, int);
+void obj_del_line(struct obj *, int, int);
+void obj_del_surf(struct obj *, int);
/*----------------------------------------------------------------------------*/
-void obj_set_mtrl_name(obj *, int, const char *);
-void obj_set_mtrl_map (obj *, int, int, const char *);
-void obj_set_mtrl_opt (obj *, int, int, unsigned int);
-void obj_set_mtrl_c (obj *, int, int, const float *);
-void obj_set_mtrl_o (obj *, int, int, const float *);
-void obj_set_mtrl_s (obj *, int, int, const float *);
+void obj_set_mtrl_name(struct obj *, int, const char *);
+void obj_set_mtrl_map (struct obj *, int, int, const char *);
+void obj_set_mtrl_opt (struct obj *, int, int, unsigned int);
+void obj_set_mtrl_c (struct obj *, int, int, const float *);
+void obj_set_mtrl_o (struct obj *, int, int, const float *);
+void obj_set_mtrl_s (struct obj *, int, int, const float *);
-void obj_set_vert_v(obj *, int, const float *);
-void obj_set_vert_t(obj *, int, const float *);
-void obj_set_vert_n(obj *, int, const float *);
-void obj_set_vert_u(obj *, int, const float *);
+void obj_set_vert_v(struct obj *, int, const float *);
+void obj_set_vert_t(struct obj *, int, const float *);
+void obj_set_vert_n(struct obj *, int, const float *);
+void obj_set_vert_u(struct obj *, int, const float *);
-void obj_set_poly(obj *, int, int, const int *);
-void obj_set_line(obj *, int, int, const int *);
-void obj_set_surf(obj *, int, int);
+void obj_set_poly(struct obj *, int, int, const int *);
+void obj_set_line(struct obj *, int, int, const int *);
+void obj_set_surf(struct obj *, int, int);
-void obj_set_vert_loc(obj *, int, int, int, int);
-void obj_set_prop_loc(obj *, int, int, int, int);
+void obj_set_vert_loc(struct obj *, int, int, int, int);
+void obj_set_prop_loc(struct obj *, int, int, int, int);
/*----------------------------------------------------------------------------*/
-const char *obj_get_mtrl_name(const obj *, int);
-unsigned int obj_get_mtrl_map (const obj *, int, int);
-unsigned int obj_get_mtrl_opt (const obj *, int, int);
-void obj_get_mtrl_c (const obj *, int, int, float *);
-void obj_get_mtrl_o (const obj *, int, int, float *);
-void obj_get_mtrl_s (const obj *, int, int, float *);
+const char *obj_get_mtrl_name(const struct obj *, int);
+unsigned int obj_get_mtrl_map (const struct obj *, int, int);
+unsigned int obj_get_mtrl_opt (const struct obj *, int, int);
+void obj_get_mtrl_c (const struct obj *, int, int, float *);
+void obj_get_mtrl_o (const struct obj *, int, int, float *);
+void obj_get_mtrl_s (const struct obj *, int, int, float *);
-void obj_get_vert_v(const obj *, int, float *);
-void obj_get_vert_t(const obj *, int, float *);
-void obj_get_vert_n(const obj *, int, float *);
+void obj_get_vert_v(const struct obj *, int, float *);
+void obj_get_vert_t(const struct obj *, int, float *);
+void obj_get_vert_n(const struct obj *, int, float *);
-void obj_get_poly(const obj *, int, int, int *);
-void obj_get_line(const obj *, int, int, int *);
-int obj_get_surf(const obj *, int);
+void obj_get_poly(const struct obj *, int, int, int *);
+void obj_get_line(const struct obj *, int, int, int *);
+int obj_get_surf(const struct obj *, int);
/*----------------------------------------------------------------------------*/
-void obj_render_mtrl(const obj *, int);
-void obj_render_surf(const obj *, int);
-void obj_render_file(const obj *);
+void obj_render_mtrl(const struct obj *, int);
+void obj_render_surf(const struct obj *, int);
+void obj_render_file(const struct obj *);
/*----------------------------------------------------------------------------*/
unsigned int obj_load_image(const char *);
-void obj_mini(obj *);
-void obj_norm(obj *);
-void obj_proc(obj *);
-void obj_uniq(obj *, float, float, int);
-void obj_sort(obj *, int);
-float obj_acmr(obj *, int);
+void obj_mini(struct obj *);
+void obj_norm(struct obj *);
+void obj_proc(struct obj *);
+void obj_uniq(struct obj *, float, float, int);
+void obj_sort(struct obj *, int);
+float obj_acmr(struct obj *, int);
-void obj_bound(const obj *, float *);
-void obj_write(const obj *, const char *, const char *, int);
+void obj_bound(const struct obj *, float *);
+void obj_write(const struct obj *, const char *, const char *, int);
/*======================================================================+=====*/