#include "ggen.h"

void final(target_t *targ)
{
	// cout << "===real version" << endl;

	double aper=6.0;    // cm
	double slope1=10;   // degrees
	double dome1=2.44;   // cm radius
	double l1=10.2;     // cm    beta=0.34
	double slope2=17;   // degrees
	double dome2=7.96;   // cm radius
	double l2=27.9;     // cm    beta=0.93
	double erx=3.0;
	double ery=6.0;
	double lpipe=12.0;

	// l2=0.0;   // squash it
	// lpipe=0.0;

	const double pi=3.1415926535;
	point orig( 0.0, 0.0);
	point iris(l1,    aper);
	point irix(l1+l2, aper);
	point anod(l1+l2+lpipe, 0.0);
	design *d = new design();
	d->debug=0;

	if (lpipe!=0) {
	 line_ray    r4(d,irix,0);
	 line_ray    r5(d,anod,0.5*pi);
	 join(d,r5,r4);
	} else {
	 line_seg  *ls2 = new line_seg(anod,irix);
	 d->add(ls2);
	}

	if (l2!=0) {
	 ellipse_ray r2x(d,irix,erx,ery,pi,false);
	 line_ray    r3x(d,r2x,(90+slope2)*pi/180.);

	 design *dy = new design();
	 ellipse_ray r2y(dy,iris,erx,ery,0,true);
	 line_ray    r3y(dy,r2y,(90-slope2)*pi/180.);

	 join(d,r3x,r3y,dome2);
	 dy->reverse();
	 d->add(dy);
	}

	if (l1!=0.0) {
	 ellipse_ray r2(d,iris,3.0,6.0,pi,false);
	 line_ray    r3(d,r2,(90+slope1)*pi/180.);

	 line_ray    r1(d,orig,0.5*pi);
	 join(d,r3,r1,dome1);
	} else {
	 line_seg   *ls1 = new line_seg(iris,orig);
	 d->add(ls1);
	}

	d->reverse();

	// d->eliminate_ellipses();

	d->emit(targ);

}

target_t* get_ps(ostream &os);
target_t* get_fish(ostream &os);
target_t* get_pov(ostream &os);
target_t* get_dump(void);
int main(int argc, char *argv[])
{
	target_t *targ;
	if (argc > 1 && strcmp(argv[1],"ps")==0 )
		targ = get_ps(cout);
	else if (argc > 1 && strcmp(argv[1],"fish")==0 )
		targ = get_fish(cout);
	else if (argc > 1 && strcmp(argv[1],"pov")==0 )
		targ = get_pov(cout);
	else
		targ = get_dump();
	// stupid(targ);
	final(targ);
}
