#! /bin/sh

# Copyright (C) 1991 The Geometry Center

Usage="Usage: oogl2off [-C] [-N] [infile]
Reads a MESH or QUAD file, writes an OFF file to stdout.
Copies colors unless -C (no colors).  Discards 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 '

function getlines(nl) {
	_s = "";
	for(_n = 0; _n < nl; _n++) {
		while($0 == "%") getline;
		_s = _s " " $0;
		getline;
	}
	return _s;
}

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;
	    getline nface;
	    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 = "OFF";
	hasN = 0; hasC = 0;
	if(key ~ /N/) hasN = 1;
	if(key ~ /C/) hasC = 1;


	if(is == "QUAD") {
	    vtx = 0;
	    getline;
	    while($0 != "") {
		pt[vtx] = getlines(3);
		if(pt[vtx] == "   ") break;
		if(hasN != 0) getlines(3);
		if(hasC != 0) C[vtx] = getlines(4);
		vtx++;
	    }
	    if(vtx % 4 != 0) {
		print "# Warning: " vtx " vertices in QUAD file: not a whole number of quads!"
	    }
	    printf "OFF\n%d %d %d\n\n", vtx, vtx/4, vtx;
	    for(i = 0; i < vtx; i++) print pt[i];
	    print "";
	    fmt3 = "3\t%d %d %d";
	    fmt4 = "4\t%d %d %d %d";
	    if(allowC) {
		fmt3 = fmt3 "\t%s";
		fmt4 = fmt4 "\t%s";
	    }
	    fmt3 = fmt3 "\n";  fmt4 = fmt4 "\n";
	    for(i = 0; i < vtx; i += 4) {
		#if(pt[i] == pt[i+1] || pt[i+1] == pt[i+2]) printf fmt3, i,i+2,i+3, C[i];
		#if(pt[i+2] == pt[i+3] || pt[i] == pt[i+3]) printf fmt3, i,i+1,i+2, C[i];
		#else printf fmt4, i,i+1,i+2,i+3, C[i];
		printf fmt4, i,i+1,i+2,i+3, C[i];
	    }
	    exit;
	} else if(is == "MESH") {
	    for(i = 0; i < nvert; i++) {
		pt[i] = getlines(3);
		if(hasN != 0) getlines(3);
		if(hasC != 0) C[vtx] = getlines(4);
		if(toss > 0) getlines(toss);
	    }

	    printf "OFF\n%d %d %d\n\n", \
		nvert, (nu-1+uwrap)*(nv-1+vwrap), \
		2*u*v - (1-vwrap)*u - (1-uwrap)*v;

	    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++) {
		    print "4\t%d %d %d %d\n", ov*nu+ou, ov*nu+u, v*nu+u, v*nu+ou;
		    ou = u;
		}
		ov = v;
	    }
	}
}

'
