Added struct b_offs to solid_base.
authorrlk <rlk@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Thu, 17 Mar 2011 20:14:26 +0000 (20:14 +0000)
committerrlk <rlk@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Thu, 17 Mar 2011 20:14:26 +0000 (20:14 +0000)
Refactored solid_base, solid_draw, and mapc to accomodate b_offs.
Temporarily commented out the glMultiTexture conditional.
Fixed long type warning in sync.c under OSX.
Fixed Ogg Vorbis warning static callbacks.
Added timer feature to mapc.
Added CSV feature to mapc.
Removed "visible geom" output from mapc output, as offs is more relevant.
Removed uniq_geoms tweak from mapc.
Added uniq_mtrl tweak to mapc (just for symmetry, not for optimization.)

git-svn-id: https://s.snth.net/svn/neverball/branches/gles@3527 78b8d119-cf0a-0410-b17c-f493084dd1d7

Makefile
share/audio.c
share/fs_ov.h
share/glext.h
share/mapc.c
share/solid_base.c
share/solid_base.h
share/solid_draw.c
share/sync.c

index 169b9f8..ab192c9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -321,6 +321,7 @@ BALL_DEPS := $(BALL_OBJS:.o=.d)
 PUTT_DEPS := $(PUTT_OBJS:.o=.d)
 MAPC_DEPS := $(MAPC_OBJS:.o=.d)
 
+#MAPS := $(shell find data/map-medium -name "*.map" \! -name "*.autosave.map")
 MAPS := $(shell find data -name "*.map" \! -name "*.autosave.map")
 SOLS := $(MAPS:%.map=%.sol)
 
index 2eeebe7..b94a481 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <SDL.h>
 
+#define OV_EXCLUDE_STATIC_CALLBACKS
 #include <vorbis/codec.h>
 #include <vorbis/vorbisfile.h>
 
index db4fcb7..b26a0c1 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef FS_OV
 #define FS_OV
 
+#define OV_EXCLUDE_STATIC_CALLBACKS
 #include <vorbis/vorbisfile.h>
 
 size_t fs_ov_read(void *ptr, size_t size, size_t nmemb, void *datasource);
index 7a12b9e..c86a483 100644 (file)
 
 /*---------------------------------------------------------------------------*/
 
-#ifndef GL_ARB_multitexture
+/*#ifndef GL_ARB_multitexture*/
 #define GL_TEXTURE0_ARB                   0x84C0
 #define GL_TEXTURE1_ARB                   0x84C1
 
 typedef void (*PFNGLACTIVETEXTUREARBPROC)(GLenum);
-#endif
+/*#endif*/
 
 extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB_;
 
index 1724f5c..f7b3977 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <sys/time.h>
 
 #include "solid_base.h"
 
 /*---------------------------------------------------------------------------*/
 
 static const char *input_file;
-static int         debug_output;
+static int         debug_output = 0;
+static int           csv_output = 0;
 static int         verbose;
 
+struct timeval t0;
+struct timeval t1;
+
 /*---------------------------------------------------------------------------*/
 
 /* Ohhhh... arbitrary! */
@@ -55,6 +60,7 @@ static int         verbose;
 #define MAXE    131072
 #define MAXS    65536
 #define MAXT    131072
+#define MAXO    131072
 #define MAXG    65536
 #define MAXL    4096
 #define MAXN    2048
@@ -103,6 +109,11 @@ static int inct(struct s_base *fp)
     return (fp->tc < MAXT) ? fp->tc++ : overflow("texc");
 }
 
+static int inco(struct s_base *fp)
+{
+    return (fp->oc < MAXO) ? fp->oc++ : overflow("offs");
+}
+
 static int incg(struct s_base *fp)
 {
     return (fp->gc < MAXG) ? fp->gc++ : overflow("geom");
@@ -180,6 +191,7 @@ static void init_file(struct s_base *fp)
     fp->ec = 0;
     fp->sc = 0;
     fp->tc = 0;
+    fp->oc = 0;
     fp->gc = 0;
     fp->lc = 0;
     fp->nc = 0;
@@ -201,6 +213,7 @@ static void init_file(struct s_base *fp)
     fp->ev = (struct b_edge *) calloc(MAXE, sizeof (*fp->ev));
     fp->sv = (struct b_side *) calloc(MAXS, sizeof (*fp->sv));
     fp->tv = (struct b_texc *) calloc(MAXT, sizeof (*fp->tv));
+    fp->ov = (struct b_offs *) calloc(MAXO, sizeof (*fp->ov));
     fp->gv = (struct b_geom *) calloc(MAXG, sizeof (*fp->gv));
     fp->lv = (struct b_lump *) calloc(MAXL, sizeof (*fp->lv));
     fp->nv = (struct b_node *) calloc(MAXN, sizeof (*fp->nv));
@@ -496,9 +509,11 @@ static void move_body(struct s_base *fp,
 
         for (i = 0; i < bp->gc; i++)
         {
-            b[fp->gv[fp->iv[bp->g0 + i]].vi] = 1;
-            b[fp->gv[fp->iv[bp->g0 + i]].vj] = 1;
-            b[fp->gv[fp->iv[bp->g0 + i]].vk] = 1;
+            const struct b_geom *gp = fp->gv + fp->iv[bp->g0 + i];
+
+            b[fp->ov[gp->oi].vi] = 1;
+            b[fp->ov[gp->oj].vi] = 1;
+            b[fp->ov[gp->ok].vi] = 1;
         }
 
         /* Apply the motion to the marked vertices. */
@@ -555,24 +570,28 @@ static void read_f(struct s_base *fp, const char *line,
                    int v0, int t0, int s0, int mi)
 {
     struct b_geom *gp = fp->gv + incg(fp);
+    
+    struct b_offs *op = fp->ov + (gp->oi = inco(fp));
+    struct b_offs *oq = fp->ov + (gp->oj = inco(fp));
+    struct b_offs *or = fp->ov + (gp->ok = inco(fp));
 
     char c1;
     char c2;
 
     sscanf(line, "%d%c%d%c%d %d%c%d%c%d %d%c%d%c%d",
-           &gp->vi, &c1, &gp->ti, &c2, &gp->si,
-           &gp->vj, &c1, &gp->tj, &c2, &gp->sj,
-           &gp->vk, &c1, &gp->tk, &c2, &gp->sk);
-
-    gp->vi += (v0 - 1);
-    gp->vj += (v0 - 1);
-    gp->vk += (v0 - 1);
-    gp->ti += (t0 - 1);
-    gp->tj += (t0 - 1);
-    gp->tk += (t0 - 1);
-    gp->si += (s0 - 1);
-    gp->sj += (s0 - 1);
-    gp->sk += (s0 - 1);
+           &op->vi, &c1, &op->ti, &c2, &op->si,
+           &oq->vi, &c1, &oq->ti, &c2, &oq->si,
+           &or->vi, &c1, &or->ti, &c2, &or->si);
+
+    op->vi += (v0 - 1);
+    oq->vi += (v0 - 1);
+    or->vi += (v0 - 1);
+    op->ti += (t0 - 1);
+    oq->ti += (t0 - 1);
+    or->ti += (t0 - 1);
+    op->si += (s0 - 1);
+    oq->si += (s0 - 1);
+    or->si += (s0 - 1);
 
     gp->mi  = mi;
 }
@@ -1529,24 +1548,31 @@ static void clip_geom(struct s_base *fp,
 
     for (i = 0; i < n - 2; i++)
     {
-        fp->gv[fp->gc].mi = plane_m[si];
+        const int gi = incg(fp);
 
-        fp->gv[fp->gc].ti = t[0];
-        fp->gv[fp->gc].tj = t[i + 1];
-        fp->gv[fp->gc].tk = t[i + 2];
+        struct b_geom *gp = fp->gv + gi;
 
-        fp->gv[fp->gc].si = si;
-        fp->gv[fp->gc].sj = si;
-        fp->gv[fp->gc].sk = si;
+        struct b_offs *op = fp->ov + (gp->oi = inco(fp));
+        struct b_offs *oq = fp->ov + (gp->oj = inco(fp));
+        struct b_offs *or = fp->ov + (gp->ok = inco(fp));
 
-        fp->gv[fp->gc].vi = m[0];
-        fp->gv[fp->gc].vj = m[i + 1];
-        fp->gv[fp->gc].vk = m[i + 2];
+        gp->mi = plane_m[si];
 
-        fp->iv[fp->ic] = fp->gc;
-        inci(fp);
-        incg(fp);
+        op->ti = t[0];
+        oq->ti = t[i + 1];
+        or->ti = t[i + 2];
+
+        op->si = si;
+        oq->si = si;
+        or->si = si;
+
+        op->vi = m[0];
+        oq->vi = m[i + 1];
+        or->vi = m[i + 2];
+
+        fp->iv[fp->ic] = gi;
         lp->gc++;
+        inci(fp);
     }
 }
 
@@ -1672,92 +1698,89 @@ static int comp_texc(const struct b_texc *tp, const struct b_texc *tq)
     return 1;
 }
 
-static int comp_geom(const struct b_geom *gp, const struct b_geom *gq)
+static int comp_offs(const struct b_offs *op, const struct b_offs *oq)
 {
-    if (gp->mi != gq->mi) return 0;
-
-    if (gp->ti != gq->ti) return 0;
-    if (gp->si != gq->si) return 0;
-    if (gp->vi != gq->vi) return 0;
+    if (op->ti != oq->ti) return 0;
+    if (op->si != oq->si) return 0;
+    if (op->vi != oq->vi) return 0;
 
-    if (gp->tj != gq->tj) return 0;
-    if (gp->sj != gq->sj) return 0;
-    if (gp->vj != gq->vj) return 0;
+    return 1;
+}
 
-    if (gp->tk != gq->tk) return 0;
-    if (gp->sk != gq->sk) return 0;
-    if (gp->vk != gq->vk) return 0;
+static int comp_geom(const struct b_geom *gp, const struct b_geom *gq)
+{
+    if (gp->mi != gq->mi) return 0;
+    if (gp->oi != gq->oi) return 0;
+    if (gp->oj != gq->oj) return 0;
+    if (gp->ok != gq->ok) return 0;
 
     return 1;
 }
 
 /*---------------------------------------------------------------------------*/
 
+static int mtrl_swaps[MAXM];
+static int vert_swaps[MAXV];
+static int edge_swaps[MAXE];
+static int side_swaps[MAXS];
+static int texc_swaps[MAXT];
+static int offs_swaps[MAXO];
+static int geom_swaps[MAXG];
+
 /*
  * For each file  element type, replace all references  to element 'i'
  * with a  reference to element  'j'.  These are used  when optimizing
  * and sorting the file.
  */
 
-static void swap_mtrl(struct s_base *fp, int mi, int mj)
-{
-    int i;
-
-    for (i = 0; i < fp->gc; i++)
-        if (fp->gv[i].mi == mi) fp->gv[i].mi = mj;
-    for (i = 0; i < fp->rc; i++)
-        if (fp->rv[i].mi == mi) fp->rv[i].mi = mj;
-}
-
-static int vert_swaps[MAXV];
-
-static void apply_vert_swaps(struct s_base *fp)
+static void swap_vert(struct s_base *fp, int vi, int vj)
 {
     int i, j;
 
     for (i = 0; i < fp->ec; i++)
     {
-        fp->ev[i].vi = vert_swaps[fp->ev[i].vi];
-        fp->ev[i].vj = vert_swaps[fp->ev[i].vj];
+        if (fp->ev[i].vi == vi) fp->ev[i].vi = vj;
+        if (fp->ev[i].vj == vi) fp->ev[i].vj = vj;
     }
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        fp->gv[i].vi = vert_swaps[fp->gv[i].vi];
-        fp->gv[i].vj = vert_swaps[fp->gv[i].vj];
-        fp->gv[i].vk = vert_swaps[fp->gv[i].vk];
-    }
+    for (i = 0; i < fp->oc; i++)
+        if (fp->ov[i].vi == vi) fp->ov[i].vi = vj;
 
     for (i = 0; i < fp->lc; i++)
         for (j = 0; j < fp->lv[i].vc; j++)
-            fp->iv[fp->lv[i].v0 + j] = vert_swaps[fp->iv[fp->lv[i].v0 + j]];
+            if (fp->iv[fp->lv[i].v0 + j] == vi)
+                fp->iv[fp->lv[i].v0 + j]  = vj;
 }
 
-static void swap_vert(struct s_base *fp, int vi, int vj)
+static void apply_mtrl_swaps(struct s_base *fp)
+{
+    int i;
+
+    for (i = 0; i < fp->gc; i++)
+        fp->gv[i].mi = mtrl_swaps[fp->gv[i].mi];
+    for (i = 0; i < fp->rc; i++)
+        fp->rv[i].mi = mtrl_swaps[fp->rv[i].mi];
+}
+
+
+static void apply_vert_swaps(struct s_base *fp)
 {
     int i, j;
 
     for (i = 0; i < fp->ec; i++)
     {
-        if (fp->ev[i].vi == vi) fp->ev[i].vi = vj;
-        if (fp->ev[i].vj == vi) fp->ev[i].vj = vj;
+        fp->ev[i].vi = vert_swaps[fp->ev[i].vi];
+        fp->ev[i].vj = vert_swaps[fp->ev[i].vj];
     }
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        if (fp->gv[i].vi == vi) fp->gv[i].vi = vj;
-        if (fp->gv[i].vj == vi) fp->gv[i].vj = vj;
-        if (fp->gv[i].vk == vi) fp->gv[i].vk = vj;
-    }
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].vi = vert_swaps[fp->ov[i].vi];
 
     for (i = 0; i < fp->lc; i++)
         for (j = 0; j < fp->lv[i].vc; j++)
-            if (fp->iv[fp->lv[i].v0 + j] == vi)
-                fp->iv[fp->lv[i].v0 + j]  = vj;
+            fp->iv[fp->lv[i].v0 + j] = vert_swaps[fp->iv[fp->lv[i].v0 + j]];
 }
 
-static int edge_swaps[MAXE];
-
 static void apply_edge_swaps(struct s_base *fp)
 {
     int i, j;
@@ -1767,18 +1790,12 @@ static void apply_edge_swaps(struct s_base *fp)
             fp->iv[fp->lv[i].e0 + j] = edge_swaps[fp->iv[fp->lv[i].e0 + j]];
 }
 
-static int side_swaps[MAXS];
-
 static void apply_side_swaps(struct s_base *fp)
 {
     int i, j;
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        fp->gv[i].si = side_swaps[fp->gv[i].si];
-        fp->gv[i].sj = side_swaps[fp->gv[i].sj];
-        fp->gv[i].sk = side_swaps[fp->gv[i].sk];
-    }
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].si = side_swaps[fp->ov[i].si];
     for (i = 0; i < fp->nc; i++)
         fp->nv[i].si = side_swaps[fp->nv[i].si];
 
@@ -1787,22 +1804,26 @@ static void apply_side_swaps(struct s_base *fp)
             fp->iv[fp->lv[i].s0 + j] = side_swaps[fp->iv[fp->lv[i].s0 + j]];
 }
 
-static int texc_swaps[MAXT];
-
 static void apply_texc_swaps(struct s_base *fp)
 {
     int i;
 
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].ti = texc_swaps[fp->ov[i].ti];
+}
+
+static void apply_offs_swaps(struct s_base *fp)
+{
+    int i;
+
     for (i = 0; i < fp->gc; i++)
     {
-        fp->gv[i].ti = texc_swaps[fp->gv[i].ti];
-        fp->gv[i].tj = texc_swaps[fp->gv[i].tj];
-        fp->gv[i].tk = texc_swaps[fp->gv[i].tk];
+        fp->gv[i].oi = offs_swaps[fp->gv[i].oi];
+        fp->gv[i].oj = offs_swaps[fp->gv[i].oj];
+        fp->gv[i].ok = offs_swaps[fp->gv[i].ok];
     }
 }
 
-static int geom_swaps[MAXG];
-
 static void apply_geom_swaps(struct s_base *fp)
 {
     int i, j;
@@ -1826,22 +1847,20 @@ static void uniq_mtrl(struct s_base *fp)
     {
         for (j = 0; j < k; j++)
             if (comp_mtrl(fp->mv + i, fp->mv + j))
-            {
-                swap_mtrl(fp, i, j);
                 break;
-            }
+
+        mtrl_swaps[i] = j;
 
         if (j == k)
         {
             if (i != k)
-            {
                 fp->mv[k] = fp->mv[i];
-                swap_mtrl(fp, i, k);
-            }
             k++;
         }
     }
 
+    apply_mtrl_swaps(fp);
+
     fp->mc = k;
 }
 
@@ -1895,34 +1914,49 @@ static void uniq_edge(struct s_base *fp)
     fp->ec = k;
 }
 
-static int geomlist[MAXV];
-static int nextgeom[MAXG];
-
-static void uniq_geom(struct s_base *fp)
+static void uniq_offs(struct s_base *fp)
 {
     int i, j, k = 0;
 
-    for (i = 0; i < MAXV; i++)
-        geomlist[i] = -1;
-
-    for (i = 0; i < fp->gc; i++)
+    for (i = 0; i < fp->oc; i++)
     {
-        int key = fp->gv[i].vj;
+        for (j = 0; j < k; j++)
+            if (comp_offs(fp->ov + i, fp->ov + j))
+                break;
 
-        for (j = geomlist[key]; j != -1; j = nextgeom[j])
-            if (comp_geom(fp->gv + i, fp->gv + j))
-                goto found;
+        offs_swaps[i] = j;
+
+        if (j == k)
+        {
+            if (i != k)
+                fp->ov[k] = fp->ov[i];
+            k++;
+        }
+    }
+
+    apply_offs_swaps(fp);
 
-        fp->gv[k] = fp->gv[i];
+    fp->oc = k;
+}
 
-        nextgeom[k] = geomlist[key];
-        geomlist[key] = k;
+static void uniq_geom(struct s_base *fp)
+{
+    int i, j, k = 0;
 
-        j = k;
-        k++;
+    for (i = 0; i < fp->gc; i++)
+    {
+        for (j = 0; j < k; j++)
+            if (comp_geom(fp->gv + i, fp->gv + j))
+                break;
 
-found:
         geom_swaps[i] = j;
+
+        if (j == k)
+        {
+            if (i != k)
+                fp->gv[k] = fp->gv[i];
+            k++;
+        }
     }
 
     apply_geom_swaps(fp);
@@ -1991,6 +2025,7 @@ static void uniq_file(struct s_base *fp)
         uniq_edge(fp);
         uniq_side(fp);
         uniq_texc(fp);
+        uniq_offs(fp);
         uniq_geom(fp);
     }
 }
@@ -2034,21 +2069,21 @@ static void smth_file(struct s_base *fp)
             {
                 struct b_geom *gp = fp->gv + gi;
 
-                T[c].vi = gp->vi;
+                T[c].vi = fp->ov[gp->oi].vi;
+                T[c].si = fp->ov[gp->oi].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->si;
                 T[c].gi = gi;
                 c++;
 
-                T[c].vi = gp->vj;
+                T[c].vi = fp->ov[gp->oj].vi;
+                T[c].si = fp->ov[gp->oj].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->sj;
                 T[c].gi = gi;
                 c++;
 
-                T[c].vi = gp->vk;
+                T[c].vi = fp->ov[gp->ok].vi;
+                T[c].si = fp->ov[gp->ok].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->sk;
                 T[c].gi = gi;
                 c++;
             }
@@ -2131,20 +2166,23 @@ static void smth_file(struct s_base *fp)
             for (i = 0; i < c; ++i)
             {
                 struct b_geom *gp = fp->gv + T[i].gi;
+                struct b_offs *op = fp->ov + gp->oi;
+                struct b_offs *oq = fp->ov + gp->oj;
+                struct b_offs *or = fp->ov + gp->ok;
 
-                if (gp->vi == T[i].vi) gp->si = T[i].si;
-                if (gp->vj == T[i].vi) gp->sj = T[i].si;
-                if (gp->vk == T[i].vi) gp->sk = T[i].si;
+                if (op->vi == T[i].vi) op->si = T[i].si;
+                if (oq->vi == T[i].vi) oq->si = T[i].si;
+                if (or->vi == T[i].vi) or->si = T[i].si;
             }
 
             free(T);
         }
 
         uniq_side(fp);
+        uniq_offs(fp);
     }
 }
 
-
 /*---------------------------------------------------------------------------*/
 
 static void sort_file(struct s_base *fp)
@@ -2426,12 +2464,11 @@ static void node_file(struct s_base *fp)
 
 /*---------------------------------------------------------------------------*/
 
-static void dump_file(struct s_base *p, const char *name)
+static void dump_file(struct s_base *p, const char *name, double t)
 {
-    int i, j;
+    int i;
     int c = 0;
     int n = 0;
-    int m;
 
     /* Count the number of solid lumps. */
 
@@ -2439,41 +2476,34 @@ static void dump_file(struct s_base *p, const char *name)
         if ((p->lv[i].fl & 1) == 0)
             n++;
 
-    /* Count the number of visible geoms. */
-
-    m = p->rc + (p->zc + p->jc + p->xc) * 32;
-
-    for (i = 0; i < p->hc; i++)
-        if (p->hv[i].t == ITEM_COIN)
-            m += 124;
-        else
-            m += 304;
-
-    for (i = 0; i < p->bc; i++)
-    {
-        for (j = 0; j < p->bv[i].lc; j++)
-            m += p->lv[p->bv[i].l0 + j].gc;
-        m += p->bv[i].gc;
-    }
-
     /* Count the total value of all coins. */
 
     for (i = 0; i < p->hc; i++)
         if (p->hv[i].t == ITEM_COIN)
             c += p->hv[i].n;
 
-    printf("%s (%d/%d/$%d)\n"
-           "  mtrl  vert  edge  side  texc"
-           "  geom  lump  path  node  body\n"
-           "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n"
-           "  item  goal  view  jump  swch"
-           "  bill  ball  char  dict  indx\n"
-           "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n",
-           name, n, m, c,
-           p->mc, p->vc, p->ec, p->sc, p->tc,
-           p->gc, p->lc, p->pc, p->nc, p->bc,
-           p->hc, p->zc, p->wc, p->jc, p->xc,
-           p->rc, p->uc, p->ac, p->dc, p->ic);
+    if (csv_output)
+        printf("%s,%d,%d,%.3f"
+               "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,"
+               "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
+               name, n, c, t,
+               p->mc, p->vc, p->ec, p->sc, p->tc,
+               p->oc, p->gc, p->lc, p->pc, p->nc, p->bc,
+               p->hc, p->zc, p->wc, p->jc, p->xc,
+               p->rc, p->uc, p->ac, p->dc, p->ic);
+    else
+        printf("%s (%d/$%d) %.3f\n"
+               "  mtrl  vert  edge  side  texc"
+               "  offs  geom  lump  path  node  body\n"
+               "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n"
+               "  item  goal  view  jump  swch"
+               "  bill  ball  char  dict  indx\n"
+               "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n",
+               name, n, c, t,
+               p->mc, p->vc, p->ec, p->sc, p->tc,
+               p->oc, p->gc, p->lc, p->pc, p->nc, p->bc,
+               p->hc, p->zc, p->wc, p->jc, p->xc,
+               p->rc, p->uc, p->ac, p->dc, p->ic);
 }
 
 int main(int argc, char *argv[])
@@ -2494,10 +2524,15 @@ int main(int argc, char *argv[])
 
     if (argc > 2)
     {
+        int argi;
+
         input_file = argv[1];
 
-        if (argc > 3 && strcmp(argv[3], "--debug") == 0)
-            debug_output = 1;
+        for (argi = 3; argi < argc; ++argi)
+        {
+            if (strcmp(argv[argi], "--debug") == 0) debug_output = 1;
+            if (strcmp(argv[argi], "--csv")   == 0)   csv_output = 1;
+        }
 
         strncpy(src, argv[1], MAXSTR - 1);
         strncpy(dst, argv[1], MAXSTR - 1);
@@ -2520,28 +2555,34 @@ int main(int argc, char *argv[])
                 return 1;
             }
 
-            init_file(&f);
-            read_map(&f, fin);
+            gettimeofday(&t0, 0);
+            {
+                init_file(&f);
+                read_map(&f, fin);
+
+                resolve();
+                targets(&f);
 
-            resolve();
-            targets(&f);
+                clip_file(&f);
+                move_file(&f);
+                uniq_file(&f);
+                smth_file(&f);
+                sort_file(&f);
+                node_file(&f);
 
-            clip_file(&f);
-            move_file(&f);
-            uniq_file(&f);
-            smth_file(&f);
-            sort_file(&f);
-            node_file(&f);
-            dump_file(&f, dst);
+                sol_stor_base(&f, base_name(dst));
+            }
+            gettimeofday(&t1, 0);
 
-            sol_stor_base(&f, base_name(dst));
+            dump_file(&f, dst, (t1.tv_sec  - t0.tv_sec) +
+                               (t1.tv_usec - t0.tv_usec) / 1000000.0);
 
             fs_close(fin);
 
             free_imagedata();
         }
     }
-    else fprintf(stderr, "Usage: %s <map> <data> [--debug]\n", argv[0]);
+    else fprintf(stderr, "Usage: %s <map> <data> [--debug] [--csv]\n", argv[0]);
 
     return 0;
 }
index cecece3..aae2d16 100644 (file)
@@ -87,18 +87,19 @@ static void sol_load_texc(fs_file fin, struct b_texc *tp)
     get_array(fin,  tp->u, 2);
 }
 
+static void sol_load_offs(fs_file fin, struct b_offs *op)
+{
+    get_index(fin, &op->ti);
+    get_index(fin, &op->si);
+    get_index(fin, &op->vi);
+}
+
 static void sol_load_geom(fs_file fin, struct b_geom *gp)
 {
     get_index(fin, &gp->mi);
-    get_index(fin, &gp->ti);
-    get_index(fin, &gp->si);
-    get_index(fin, &gp->vi);
-    get_index(fin, &gp->tj);
-    get_index(fin, &gp->sj);
-    get_index(fin, &gp->vj);
-    get_index(fin, &gp->tk);
-    get_index(fin, &gp->sk);
-    get_index(fin, &gp->vk);
+    get_index(fin, &gp->oi);
+    get_index(fin, &gp->oj);
+    get_index(fin, &gp->ok);
 }
 
 static void sol_load_lump(fs_file fin, struct b_lump *lp)
@@ -235,6 +236,7 @@ static void sol_load_indx(fs_file fin, struct s_base *fp)
     get_index(fin, &fp->ec);
     get_index(fin, &fp->sc);
     get_index(fin, &fp->tc);
+    get_index(fin, &fp->oc);
     get_index(fin, &fp->gc);
     get_index(fin, &fp->lc);
     get_index(fin, &fp->nc);
@@ -271,6 +273,8 @@ static int sol_load_file(fs_file fin, struct s_base *fp)
         fp->sv = (struct b_side *) calloc(fp->sc, sizeof (*fp->sv));
     if (fp->tc)
         fp->tv = (struct b_texc *) calloc(fp->tc, sizeof (*fp->tv));
+    if (fp->oc)
+        fp->ov = (struct b_offs *) calloc(fp->oc, sizeof (*fp->ov));
     if (fp->gc)
         fp->gv = (struct b_geom *) calloc(fp->gc, sizeof (*fp->gv));
     if (fp->lc)
@@ -309,6 +313,7 @@ static int sol_load_file(fs_file fin, struct s_base *fp)
     for (i = 0; i < fp->ec; i++) sol_load_edge(fin, fp->ev + i);
     for (i = 0; i < fp->sc; i++) sol_load_side(fin, fp->sv + i);
     for (i = 0; i < fp->tc; i++) sol_load_texc(fin, fp->tv + i);
+    for (i = 0; i < fp->oc; i++) sol_load_offs(fin, fp->ov + i);
     for (i = 0; i < fp->gc; i++) sol_load_geom(fin, fp->gv + i);
     for (i = 0; i < fp->lc; i++) sol_load_lump(fin, fp->lv + i);
     for (i = 0; i < fp->nc; i++) sol_load_node(fin, fp->nv + i);
@@ -396,6 +401,7 @@ void sol_free_base(struct s_base *fp)
     if (fp->ev) free(fp->ev);
     if (fp->sv) free(fp->sv);
     if (fp->tv) free(fp->tv);
+    if (fp->ov) free(fp->ov);
     if (fp->gv) free(fp->gv);
     if (fp->lv) free(fp->lv);
     if (fp->nv) free(fp->nv);
@@ -450,18 +456,19 @@ static void sol_stor_texc(fs_file fout, struct b_texc *tp)
     put_array(fout,  tp->u, 2);
 }
 
+static void sol_stor_offs(fs_file fout, struct b_offs *op)
+{
+    put_index(fout, op->ti);
+    put_index(fout, op->si);
+    put_index(fout, op->vi);
+}
+
 static void sol_stor_geom(fs_file fout, struct b_geom *gp)
 {
     put_index(fout, gp->mi);
-    put_index(fout, gp->ti);
-    put_index(fout, gp->si);
-    put_index(fout, gp->vi);
-    put_index(fout, gp->tj);
-    put_index(fout, gp->sj);
-    put_index(fout, gp->vj);
-    put_index(fout, gp->tk);
-    put_index(fout, gp->sk);
-    put_index(fout, gp->vk);
+    put_index(fout, gp->oi);
+    put_index(fout, gp->oj);
+    put_index(fout, gp->ok);
 }
 
 static void sol_stor_lump(fs_file fout, struct b_lump *lp)
@@ -589,6 +596,7 @@ static void sol_stor_file(fs_file fout, struct s_base *fp)
     put_index(fout, fp->ec);
     put_index(fout, fp->sc);
     put_index(fout, fp->tc);
+    put_index(fout, fp->oc);
     put_index(fout, fp->gc);
     put_index(fout, fp->lc);
     put_index(fout, fp->nc);
@@ -611,6 +619,7 @@ static void sol_stor_file(fs_file fout, struct s_base *fp)
     for (i = 0; i < fp->ec; i++) sol_stor_edge(fout, fp->ev + i);
     for (i = 0; i < fp->sc; i++) sol_stor_side(fout, fp->sv + i);
     for (i = 0; i < fp->tc; i++) sol_stor_texc(fout, fp->tv + i);
+    for (i = 0; i < fp->oc; i++) sol_stor_offs(fout, fp->ov + i);
     for (i = 0; i < fp->gc; i++) sol_stor_geom(fout, fp->gv + i);
     for (i = 0; i < fp->lc; i++) sol_stor_lump(fout, fp->lv + i);
     for (i = 0; i < fp->nc; i++) sol_stor_node(fout, fp->nv + i);
index c041300..25b091a 100644 (file)
@@ -153,12 +153,15 @@ struct b_texc
     float u[2];                                /* texture coordinate         */
 };
 
+struct b_offs
+{
+    int ti, si, vi;
+};
+
 struct b_geom
 {
     int mi;
-    int ti, si, vi;
-    int tj, sj, vj;
-    int tk, sk, vk;
+    int oi, oj, ok;
 };
 
 struct b_lump
@@ -280,6 +283,7 @@ struct s_base
     int ec;
     int sc;
     int tc;
+    int oc;
     int gc;
     int lc;
     int nc;
@@ -301,6 +305,7 @@ struct s_base
     struct b_edge *ev;
     struct b_side *sv;
     struct b_texc *tv;
+    struct b_offs *ov;
     struct b_geom *gv;
     struct b_lump *lv;
     struct b_node *nv;
index 5cab6d3..fbe649b 100644 (file)
@@ -276,29 +276,33 @@ static void sol_draw_geom(const struct s_base *base,
 {
     if (gp->mi == mi)
     {
-        const float *ui = base->tv[gp->ti].u;
-        const float *uj = base->tv[gp->tj].u;
-        const float *uk = base->tv[gp->tk].u;
+        const struct b_offs *op = base->ov + gp->oi;
+        const struct b_offs *oq = base->ov + gp->oj;
+        const struct b_offs *or = base->ov + gp->ok;
 
-        const float *ni = base->sv[gp->si].n;
-        const float *nj = base->sv[gp->sj].n;
-        const float *nk = base->sv[gp->sk].n;
+        const float *u0 = base->tv[op->ti].u;
+        const float *u1 = base->tv[oq->ti].u;
+        const float *u2 = base->tv[or->ti].u;
 
-        const float *vi = base->vv[gp->vi].p;
-        const float *vj = base->vv[gp->vj].p;
-        const float *vk = base->vv[gp->vk].p;
+        const float *n0 = base->sv[op->si].n;
+        const float *n1 = base->sv[oq->si].n;
+        const float *n2 = base->sv[or->si].n;
 
-        glTexCoord2fv(ui);
-        glNormal3fv(ni);
-        glVertex3fv(vi);
+        const float *p0 = base->vv[op->vi].p;
+        const float *p1 = base->vv[oq->vi].p;
+        const float *p2 = base->vv[or->vi].p;
 
-        glTexCoord2fv(uj);
-        glNormal3fv(nj);
-        glVertex3fv(vj);
+        glTexCoord2fv(u0);
+        glNormal3fv(n0);
+        glVertex3fv(p0);
 
-        glTexCoord2fv(uk);
-        glNormal3fv(nk);
-        glVertex3fv(vk);
+        glTexCoord2fv(u1);
+        glNormal3fv(n1);
+        glVertex3fv(p1);
+
+        glTexCoord2fv(u2);
+        glNormal3fv(n2);
+        glVertex3fv(p2);
     }
 }
 
@@ -467,13 +471,13 @@ static void sol_shad_geom(const struct s_base *base,
 {
     if (gp->mi == mi)
     {
-        const float *vi = base->vv[gp->vi].p;
-        const float *vj = base->vv[gp->vj].p;
-        const float *vk = base->vv[gp->vk].p;
+        const float *v0 = base->vv[base->ov[gp->oi].vi].p;
+        const float *v1 = base->vv[base->ov[gp->oj].vi].p;
+        const float *v2 = base->vv[base->ov[gp->ok].vi].p;
 
-        glVertex3fv(vi);
-        glVertex3fv(vj);
-        glVertex3fv(vk);
+        glVertex3fv(v0);
+        glVertex3fv(v1);
+        glVertex3fv(v2);
     }
 }
 
index 7a7df36..0395ba9 100644 (file)
@@ -30,7 +30,7 @@ void sync_init(void)
 
 void sync_init(void)
 {
-    long swap = 1;
+    GLint swap = 1;
     CGLSetParameter(CGLGetCurrentContext(),  kCGLCPSwapInterval, &swap);
 }