#! /bin/sh

# Copyright (C) 1991 The Geometry Center

Usage="Usage: oogl2quad [-C] [-N] [infile]
Reads a MESH, OFF or QUAD file, writes a QUAD file to stdout.
Copies colors and normals, unless -C (no colors), -N (no normals).
Handles wrapped meshes."


if [ "$1" = "" -a -t 0 ]; then
	echo "$Usage" >&2
	exit 1
fi

allowC=1
allowN=1
longline=0
while
   case "$1" in
   -C|-c) allowC=0; shift ;;
   -N|-n) allowN=0; shift ;;
   -l) longline=1; shift ;;
   -) shift ;;
   *) test ;;
   esac
do :
done

if [ "$1" != "" -a ! -f "$1" ]; then
	echo "oogl2quad: can't open $1" >&2
	echo "$Usage" >&2
	exit 1
fi


sed -e 's/#.*//' -e 's/$/ % /' $@ | tr -s '\40\11\12' '\12\12\12' |
nawk '
BEGIN {
	allowC='$allowC';  allowN='$allowN';  long='$longline';
	cmapfile = "/u/gcg/grap/data/cmap.fmap";
	n = 3;
	k = -3;
	FS = RS;
	is = "OFF";
	toss = 0;
	colored = 0;
	getline;
	while($0 == "" || $0 == "%") getline;
	if(long==0) { suf[0]="\n"; suf[1]="\n"; suf[2]="\n"; suf[3]="\n"; }
	else { suf[0]="  "; suf[1]="  "; suf[2]="  "; suf[3]=""; }
	suf[3] = suf[3] "\n";

	key = $0;
	if(key ~ /QUAD/ || key ~ /POLY/) {
	    is = "QUAD";
	} else if(key ~ /OFF/) {
	    getline nvert; while(nvert == "%") getline nvert;
	    getline nface; while(nface == "%") getline nface;
	    getline nedge; while(nedge == "%") getline nedge;
	} else if(key ~ /MESH/) {
	    getline nu; while(nu == "%") getline nu;
	    getline nv; while(nv == "%") getline nv;
	    nvert = nu * nv;
	    uwrap = 0; vwrap = 0;
	    if(key ~ /u/) uwrap = 1;
	    if(key ~ /v/) vwrap = 1;
	    if(key ~ /U/) toss = 3;
	    is = "MESH";
	} else if(key + 0 != 0.0) {
	    nvert = key;
	    getline nface;
	    getline nedge;
	} else {
	    print "# Can'"'"'t handle " key " files."
	    exit;
	}
	n = 3;
	prefix = "QUAD";
	if(key ~ /N/) {
	    if(allowN==0) toss += 3;
	    else { n+=3; prefix = "NQUAD"; }
	}
	if(key ~ /C/) {
	    if(allowC==0) toss += 4;
	    else { n+=4; prefix = "C" prefix; colored = 1; }
	}

	pt = "";

	if(is == "QUAD") {
	    print prefix;

	    while(getline > 0) {
		while($0 == "%") getline;
		pt = $0;
		for(k = 1; k < n; k++) {
		    getline;
		    while($0 == "%") getline;
		    pt = pt " " $0;
		}
		for(k = 0; k < toss; k++) {
		    getline;
		    while($0 == "%") getline;
		}
		printf "%s%s", pt, suf[ptno++%4];
	    }
	    exit;
	} else if(is == "MESH") {
	    for(i = 0; i < nvert; i++) {
		for(k = 0; k < n; k++) {
		    getline;
		    while($0 == "%") getline;
		    pt = pt " " $0;
		}
		for(k = 0; k < toss; k++) {
		    getline;
		    while($0 == "%") getline;
		}
		p[i] = pt;
		pt = "";
	    }

	    print prefix;
	    if(vwrap == 1) { ov = nv-1; v0 = 0; } else { ov = 0; v0 = 1; }
	    if(uwrap == 1) { ou = nu-1; u0 = 0; } else { ou = 0; u0 = 1; }
	    print "#",ov,v0,nv,ou,u0,nu
	    for(v = v0; v < nv; v++) {
		for(u = u0; u < nu; u++) {
		    printf "%s", p[ov*nu + ou] suf[0];
		    printf "%s", p[ov*nu + u] suf[1];
		    printf "%s", p[v*nu + u] suf[2];
		    printf "%s", p[v*nu + ou] suf[3];
		    ou = u;
		}
		ov = v;
	    }
	    exit;
	} else {
	    # Read OFF vertices
	    nvert += 0;
	    for(i = 0; i < nvert; i++) {
		for(k = 0; k < n; k++) {
		    getline;
		    while($0 == "%") getline;
		    pt = pt " " $0;
		}
		for(k = 0; k < toss; k++) {
		    getline;
		    while($0 == "%") getline;
		}
		p[i] = pt;
		pt = "";
	    }
	    f = 0;
	    c[0] = 1; c[1] = 1; c[2] = 1; c[3] = 1;
	}
}

# Read OFF faces

$0 != "%" {
	nfv = $0 + 0;
	for(k = 0; k < nfv; k++) {
	    getline e[k];
	}
	getline;
	for(nc = 0; $0 != "%"; nc++) {
	    c[nc] = $0;
	    getline;
	}
	if(f == 0) {
	    if(nc > 0 && colored != 1 && allowC == 1) {
		prefix = "C" prefix; colored = 1;
	    }
	    print prefix;
	    if(nc == 1) {
		ncmap = 0;
		while((getline cmap[ncmap] <cmapfile) > 0) {
		    if(cmap[ncmap] != "") ncmap++;
		}
	    }
	}
	cl = "";
	if(nc > 0 && colored == 1) {
	    if(nc == 1) {
		if(c[0]+0 < ncmap) {
		    cl = " " cmap[c[0]];
		} else {
		    print "# " c[0] " >= " ncmap
		    cl = " " c[0]%2 " " int(c[0]/2)%2 " " int(c[0]/4)%2 " " .75
		}
	    } else cl = " " c[0] " " c[1] " " c[2] " " c[3];
	}

	if(nfv%2 == 1) e[nfv] = e[nfv-1];
	for(k = 2; k < nfv; k += 2) {
	    printf "%s", p[e[0]]   cl suf[0];
	    printf "%s", p[e[k-1]] cl suf[1];
	    printf "%s", p[e[k]]   cl suf[2];
	    printf "%s", p[e[k+1]] cl suf[3];
	}
	f++;
}'
