#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! */
#define MAXE 131072
#define MAXS 65536
#define MAXT 131072
+#define MAXO 131072
#define MAXG 65536
#define MAXL 4096
#define MAXN 2048
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");
fp->ec = 0;
fp->sc = 0;
fp->tc = 0;
+ fp->oc = 0;
fp->gc = 0;
fp->lc = 0;
fp->nc = 0;
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));
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. */
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;
}
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);
}
}
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;
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];
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;
{
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;
}
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);
uniq_edge(fp);
uniq_side(fp);
uniq_texc(fp);
+ uniq_offs(fp);
uniq_geom(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++;
}
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)
/*---------------------------------------------------------------------------*/
-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. */
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[])
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);
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;
}
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)
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);
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)
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);
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);
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)
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);
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);