In obj.[ch] remove obj typedef in favour of struct obj directly, change index_t defin...
authorNick Downing <nick@ndcode.org>
Wed, 20 Apr 2022 05:09:07 +0000 (15:09 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 20 Apr 2022 05:09:12 +0000 (15:09 +1000)
obj.c
obj.h
render.c

diff --git a/obj.c b/obj.c
index 0597bb8..035dbac 100644 (file)
--- a/obj.c
+++ b/obj.c
 #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 *);
 
 /*----------------------------------------------------------------------------*/
 
@@ -389,7 +301,7 @@ static void dirpath(char *pathname)
 
 /*----------------------------------------------------------------------------*/
 
-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;
@@ -417,7 +329,7 @@ static void read_image(obj *O, int mi, int ki, const char *line,
 
         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;
         }
 
@@ -459,7 +371,7 @@ static void read_image(obj *O, int mi, int ki, const char *line,
     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];
 
@@ -470,7 +382,7 @@ static void read_color(obj *O, int mi, int ki, const char *line)
     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;
@@ -485,7 +397,7 @@ static void read_alpha(obj *O, int mi, int ki, const char *line)
 
 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];
 
@@ -573,7 +485,7 @@ static void read_mtllib(char *file, const char *line)
 
 static int read_usemtl(const char *path,
                        const char *file,
-                       const char *line, obj *O)
+                       const char *line, struct obj *O)
 {
     char name[MAXSTR];
 
@@ -626,7 +538,7 @@ static int read_poly_indices(const char *line, int *_vi, int *_ti, int *_ni)
     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;
 
@@ -698,7 +610,7 @@ static int read_poly_vertices(const char *line, obj *O, int gi)
     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];
@@ -761,7 +673,7 @@ static int read_line_indices(const char *line, int *_vi, int *_ti)
     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;
 
@@ -825,7 +737,7 @@ static int read_line_vertices(const char *line, obj *O)
     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;
 
@@ -897,7 +809,7 @@ static void read_vn(const char *line)
 
 /*----------------------------------------------------------------------------*/
 
-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];
@@ -987,7 +899,7 @@ static void obj_rel_surf(struct obj_surf *sp)
     if (sp->lv) free(sp->lv);
 }
 
-static void obj_rel(obj *O)
+static void obj_rel(struct obj *O)
 {
     int si;
     int mi;
@@ -1007,14 +919,14 @@ static void obj_rel(obj *O)
 
 /*============================================================================*/
 
-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)
         {
@@ -1044,7 +956,7 @@ obj *obj_create(const char *filename)
     return O;
 }
 
-void obj_delete(obj *O)
+void obj_delete(struct obj *O)
 {
     assert(O);
 
@@ -1055,7 +967,7 @@ void obj_delete(obj *O)
 
 /*----------------------------------------------------------------------------*/
 
-int obj_add_mtrl(obj *O)
+int obj_add_mtrl(struct obj *O)
 {
     unsigned int opt = 0;
 
@@ -1101,7 +1013,7 @@ int obj_add_mtrl(obj *O)
     return mi;
 }
 
-int obj_add_vert(obj *O)
+int obj_add_vert(struct obj *O)
 {
     int vi;
 
@@ -1118,7 +1030,7 @@ int obj_add_vert(obj *O)
     return vi;
 }
 
-int obj_add_poly(obj *O, int si)
+int obj_add_poly(struct obj *O, int si)
 {
     int pi;
 
@@ -1135,7 +1047,7 @@ int obj_add_poly(obj *O, int si)
     return pi;
 }
 
-int obj_add_line(obj *O, int si)
+int obj_add_line(struct obj *O, int si)
 {
     int li;
 
@@ -1152,7 +1064,7 @@ int obj_add_line(obj *O, int si)
     return li;
 }
 
-int obj_add_surf(obj *O)
+int obj_add_surf(struct obj *O)
 {
     int si;
 
@@ -1171,31 +1083,31 @@ int obj_add_surf(obj *O)
 
 /*----------------------------------------------------------------------------*/
 
-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;
@@ -1204,7 +1116,7 @@ int obj_num_surf(const obj *O)
 
 /*----------------------------------------------------------------------------*/
 
-void obj_del_mtrl(obj *O, int mi)
+void obj_del_mtrl(struct obj *O, int mi)
 {
     int si;
 
@@ -1234,7 +1146,7 @@ void obj_del_mtrl(obj *O, int mi)
     }
 }
 
-void obj_del_vert(obj *O, int vi)
+void obj_del_vert(struct obj *O, int vi)
 {
     int si;
     int pi;
@@ -1291,7 +1203,7 @@ void obj_del_vert(obj *O, int vi)
     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);
 
@@ -1304,7 +1216,7 @@ void obj_del_poly(obj *O, int si, int 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);
 
@@ -1317,7 +1229,7 @@ void obj_del_line(obj *O, int si, int 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);
 
@@ -1347,13 +1259,13 @@ static char *set_name(char *old, const char *src)
     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);
 
@@ -1366,14 +1278,14 @@ void obj_set_mtrl_map(obj *O, int mi, int ki, const char *str)
     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);
 
@@ -1383,7 +1295,7 @@ void obj_set_mtrl_c(obj *O, int mi, int ki, const float c[4])
     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);
 
@@ -1392,7 +1304,7 @@ void obj_set_mtrl_s(obj *O, int mi, int ki, const float s[3])
     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);
 
@@ -1403,7 +1315,7 @@ void obj_set_mtrl_o(obj *O, int mi, int ki, const float o[3])
 
 /*----------------------------------------------------------------------------*/
 
-static void invalidate(obj *O)
+static void invalidate(struct obj *O)
 {
 #ifndef CONF_NO_GL
     if (O->vbo) glDeleteBuffers     (1, &O->vbo);
@@ -1413,7 +1325,7 @@ static void invalidate(obj *O)
     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);
 
@@ -1424,7 +1336,7 @@ void obj_set_vert_v(obj *O, int vi, const float v[3])
     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);
 
@@ -1434,7 +1346,7 @@ void obj_set_vert_t(obj *O, int vi, const float t[2])
     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);
 
@@ -1445,7 +1357,7 @@ void obj_set_vert_n(obj *O, int vi, const float n[3])
     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);
 
@@ -1458,24 +1370,24 @@ void obj_set_vert_u(obj *O, int vi, const float u[3])
 
 /*----------------------------------------------------------------------------*/
 
-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);
 
@@ -1484,7 +1396,7 @@ void obj_set_surf(obj *O, int si, int mi)
 
 /*----------------------------------------------------------------------------*/
 
-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);
 
@@ -1496,7 +1408,7 @@ void obj_set_vert_loc(obj *O, int u, int n, int t, int v)
     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);
@@ -1508,25 +1420,25 @@ void obj_set_prop_loc(obj *O, int ki, int c, int o, int M)
 
 /*============================================================================*/
 
-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);
 
@@ -1536,7 +1448,7 @@ void obj_get_mtrl_c(const obj *O, int mi, int ki, float *c)
     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);
 
@@ -1545,7 +1457,7 @@ void obj_get_mtrl_s(const obj *O, int mi, int ki, float *s)
     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);
 
@@ -1556,7 +1468,7 @@ void obj_get_mtrl_o(const obj *O, int mi, int ki, float *o)
 
 /*----------------------------------------------------------------------------*/
 
-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);
 
@@ -1565,7 +1477,7 @@ void obj_get_vert_v(const obj *O, int vi, float *v)
     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);
 
@@ -1573,7 +1485,7 @@ void obj_get_vert_t(const obj *O, int vi, float *t)
     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);
 
@@ -1584,7 +1496,7 @@ void obj_get_vert_n(const obj *O, int vi, float *n)
 
 /*----------------------------------------------------------------------------*/
 
-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);
 
@@ -1593,7 +1505,7 @@ void obj_get_poly(const obj *O, int si, int pi, int *vi)
     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);
 
@@ -1601,7 +1513,7 @@ void obj_get_line(const obj *O, int si, int li, int *vi)
     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;
@@ -1609,7 +1521,7 @@ int obj_get_surf(const obj *O, int si)
 
 /*============================================================================*/
 
-void obj_mini(obj *O)
+void obj_mini(struct obj *O)
 {
     int si;
     int mi;
@@ -1636,7 +1548,7 @@ void obj_mini(obj *O)
     }
 }
 
-void obj_norm(obj *O)
+void obj_norm(struct obj *O)
 {
     int vi;
     int si;
@@ -1684,7 +1596,7 @@ void obj_norm(obj *O)
         }
 }
 
-void obj_proc(obj *O)
+void obj_proc(struct obj *O)
 {
     int si;
     int sj;
@@ -1773,7 +1685,7 @@ void obj_proc(obj *O)
             }
 }
 
-void obj_init(obj *O)
+void obj_init(struct obj *O)
 {
 #ifndef CONF_NO_GL
     if (O->vao == 0)
@@ -1844,7 +1756,7 @@ void obj_init(obj *O)
 
 /*----------------------------------------------------------------------------*/
 
-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;
@@ -1860,7 +1772,7 @@ int obj_cmp_vert(obj *O, int vi, int vj, float eps, float dot)
     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;
@@ -1889,7 +1801,7 @@ void obj_swp_vert(obj *O, int vi, int vj)
     }
 }
 
-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;
@@ -1920,7 +1832,7 @@ void obj_uniq(obj *O, float eps, float dot, int verbose)
 
 /*----------------------------------------------------------------------------*/
 
-void obj_sort(obj *O, int qc)
+void obj_sort(struct obj *O, int qc)
 {
     const int vc = O->vc;
 
@@ -1966,7 +1878,7 @@ void obj_sort(obj *O, int qc)
 
         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++;
@@ -1987,7 +1899,7 @@ void obj_sort(obj *O, int qc)
 
         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;
@@ -1998,7 +1910,7 @@ void obj_sort(obj *O, int qc)
 
         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;
 
@@ -2015,7 +1927,7 @@ void obj_sort(obj *O, int 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. */
 
@@ -2090,7 +2002,7 @@ void obj_sort(obj *O, int qc)
     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;
@@ -2109,7 +2021,7 @@ float obj_acmr(obj *O, int qc)
 
         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++; }
@@ -2126,7 +2038,7 @@ float obj_acmr(obj *O, int qc)
 
 #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;
 
@@ -2140,7 +2052,7 @@ static void obj_render_prop(const obj *O, int mi, int 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);
@@ -2168,7 +2080,7 @@ static void obj_render_prop(const obj *O, int mi, int ki)
     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;
 
@@ -2188,7 +2100,7 @@ void obj_render_mtrl(const obj *O, int mi)
     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;
 
@@ -2217,7 +2129,7 @@ void obj_render_surf(const obj *O, int si)
     }
 }
 
-void obj_render(obj *O)
+void obj_render(struct obj *O)
 {
     int si;
 
@@ -2237,7 +2149,7 @@ void obj_render(obj *O)
 
 #else
 
-void obj_render(obj *O)
+void obj_render(struct obj *O)
 {
 }
 
@@ -2245,7 +2157,7 @@ void obj_render(obj *O)
 
 /*============================================================================*/
 
-void obj_bound(const obj *O, float *b)
+void obj_bound(const struct obj *O, float *b)
 {
     int vi;
 
@@ -2278,7 +2190,7 @@ void obj_bound(const obj *O, float *b)
 
 /*============================================================================*/
 
-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;
 
@@ -2290,7 +2202,7 @@ static void obj_write_map(FILE *fout, const obj *O, int mi, int ki, const char *
 
         /* 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. */
 
@@ -2312,7 +2224,7 @@ static void obj_write_map(FILE *fout, const obj *O, int mi, int ki, const char *
     }
 }
 
-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;
@@ -2361,7 +2273,7 @@ static void obj_write_mtl(const obj *O, const char *mtl)
     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;
@@ -2437,7 +2349,7 @@ static void obj_write_obj(const obj *O, const char *obj,
     }
 }
 
-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);
 
diff --git a/obj.h b/obj.h
index d2da08c..6eceff7 100644 (file)
--- a/obj.h
+++ b/obj.h
 #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
@@ -37,93 +57,167 @@ enum {
        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);
 
 /*======================================================================+=====*/
 
index 21cab0e..352509a 100644 (file)
--- a/render.c
+++ b/render.c
@@ -294,7 +294,7 @@ int main(void) {
 
   // model
 #if 1
-  obj *o = obj_create("Chest.obj"); //"grey_bliss_set.obj");
+  struct obj *o = obj_create("Chest.obj"); //"grey_bliss_set.obj");
   struct array *model_vertices;
   {
     int I = obj_num_vert(o);