    var anx = 0;
    var any = 0;
    var anz = 0;
    var inc = 0;
    var spacing = 2;
    var gdepth=15;

    var paused = 0;

    var s3d = new space3d();
    var s3dn = new space3d();
    s3dn.cameraLocation = new vector(0,0,0);
    s3d.lightv=new vector(1,0,1);
    s3d.cameraLocation=new vector(0,0,-150);
    s3d.e.z=200;

    function renderAn() {
        anx = anx + (3.141592654/91);
        if (anx>(2*3.141592654)) {
            anx = anx - (2*3.141592654);
        }

        any = any + (3.141592654/77);
        if (any>(2*3.141592654)) {
            any = any - (2*3.141592654);
        }

        anz = anz + (3.141592654/180);
        if (anz>(2*3.141592654)) {
            anz = anz - (2*3.141592654);
        }

        inc+=(3.141592654/30);

        data=new Array();

        for (var j = -100; j<100; j+=spacing*2) {
            var cph = j*((3.141*3)/100);

            var rs = mmathi.sin(cph);
            var gs = mmathi.sin(cph+0.33*2*3.141);
            var bs = mmathi.sin(cph+0.66*2*3.141);

            if (rs<0) {rs = 0}
            if (gs<0) {gs = 0}
            if (bs<0) {bs = 0}

            rs = 1-rs;
            gs = 1-gs;
            bs = 1-bs;

            var c = new color(rs, gs, bs,0);
            /*var c = new color(0,0,1,0);*/
            var ph = cph+inc;

            var mr = new vector(anx, any, anz);
            //var mr = new vector(3.14,7*3.142/4,0.1);
            s3d.modelRotation=mr;
            s3dn.modelRotation=mr;

            var mod =s3dn.applyCamera(new vector(0,0,0).subtract(s3d.cameraLocation)).normalize();

            var sph = mmathi.sin(ph)+1;
            var cosph = mmathi.cos(ph);

            // Front Z face
            var t = new triangle(new vector(j-0.1,sph*20,0), new vector(j+spacing,sph*20,0), new vector(j-0.1,0,0),c);
            if (1 || t.surfaceNormal().normalize().dotProduct(mod)<0) {
                data.push(t);
                data.push(new triangle(new vector(j+spacing,0,0), new vector(j-0.1,0,0), new vector(j+spacing,sph*20,0),c));
            }
            else {
                data.push(new triangle(new vector(j-0.1,sph*20,0), new vector(j+spacing,0,0), new vector(j+spacing,sph*20,0),c));
                data.push(new triangle(new vector(j+spacing,0,0), new vector(j+spacing,sph*20,0), new vector(j-0.1,sph*20,0),c));
            }

            // Back Z face
            t = new triangle(new vector(j+spacing,sph*20,gdepth), new vector(j-0.1,sph*20,gdepth), new vector(j-0.1,0,gdepth),c);
            if (1 || t.surfaceNormal().normalize().dotProduct(mod)>0) {
                data.push(t);
                data.push(new triangle(new vector(j-0.1,0,gdepth), new vector(j+spacing,0, gdepth), new vector(j+spacing,sph*20,gdepth),c));
            }
            else {
                data.push(new triangle(new vector(j+spacing,sph*20,gdepth), new vector(j-0.1,0,gdepth), new vector(j-0.1,sph*20,gdepth),c));
                data.push(new triangle(new vector(j-0.1,0,gdepth), new vector(j+spacing,sph*20,gdepth), new vector(j+spacing,0, gdepth),c));
            }

            // top Y face
            t = new triangle(new vector(j-0.1,sph*20,gdepth), new vector(j+spacing,sph*20,gdepth), new vector(j-0.1,sph*20,0),c);
            if (1 || t.surfaceNormal().normalize().dotProduct(mod)>0) {
                data.push(t);
                data.push(new triangle(new vector(j+spacing,sph*20,0), new vector(j-0.1,sph*20,0), new vector(j+spacing,sph*20,gdepth),c));
            }
            else {
                data.push(new triangle(new vector(j-0.1,sph*20,gdepth), new vector(j-0.1,sph*20,0), new vector(j+spacing,sph*20,gdepth),c));
                data.push(new triangle(new vector(j+spacing,sph*20,0), new vector(j+spacing,sph*20,gdepth), new vector(j-0.1,sph*20,0),c));
            }

            // bottom Y face
            t = new triangle(new vector(j-0.1,0,gdepth), new vector(j-0.1,0,0), new vector(j+spacing,0,gdepth),c);
            if (1 || t.surfaceNormal().normalize().dotProduct(mod)<0) {
                data.push(t);
                data.push(new triangle(new vector(j+spacing,0,0), new vector(j+spacing,0,gdepth), new vector(j-0.1,0,0),c));
            }
            else {
                data.push(new triangle(new vector(j-0.1,0,gdepth), new vector(j+spacing,0,gdepth), new vector(j-0.1,0,0),c));
                data.push(new triangle(new vector(j+spacing,0,0), new vector(j-0.1,0,0), new vector(j+spacing,0,gdepth),c));
            }

            t = new triangle(new vector(j-0.1,0,0), new vector(j-0.1,sph*20,gdepth), new vector(j-0.1,0,gdepth),c);

            var v1 = s3d.applyCamera(t.v1);
            var v2 = s3d.applyCamera(t.v2);
            var v3 = s3d.applyCamera(t.v3);

            var tt = new triangle(v1, v2, v3, c);
            var cv = tt.surfaceNormal().normalize();

            var d =1;
            var iWinding=0
            if (Math.abs(cv.z) < 0.1) {
                d = (t.midX())*(cv.z>0 ? -1 : 1);
                iWinding=1;
                t.iWinding=1;
            }

            // left X face
            if ((d>0 && d!=1) || d==0) {
                data.push(t);
                data.push(new triangle(new vector(j-0.1,0,0), new vector(j-0.1,sph*20,0), new vector(j-0.1,sph*20,gdepth),c,iWinding));
            }
            else {
                t=new triangle(new vector(j-0.1,0,0), new vector(j-0.1,0,gdepth), new vector(j-0.1,sph*20,0),c,iWinding);
                data.push(t);
                t=new triangle(new vector(j-0.1,sph*20,gdepth), new vector(j-0.1,sph*20,0), new vector(j-0.1,0,gdepth),c,iWinding);
                data.push(t);
            }

            // right X face
            if (d==1 || (d<0)) {
                t = new triangle(new vector(j+spacing,0,gdepth), new vector(j+spacing,0,0), new vector(j+spacing,sph*20,gdepth),c,iWinding);
                data.push(t);
                data.push(new triangle(new vector(j+spacing,sph*20,0), new vector(j+spacing,sph*20,gdepth), new vector(j+spacing,0,0),c,iWinding));
            }
            else {
                data.push(new triangle(new vector(j+spacing,0,gdepth), new vector(j+spacing,sph*20,gdepth), new vector(j+spacing,0,0),c,iWinding));
                data.push(new triangle(new vector(j+spacing,sph*20,0), new vector(j+spacing,0,0), new vector(j+spacing,sph*20,gdepth),c,iWinding));
            }
        }

        s = render(document.getElementById("mainCanvas"), data, s3d);

        if (!paused) {
            setTimeout("renderAn()",30);
        }
    }

	 function spinit() {
	 	renderAn();
	 }

    function pauseIt() {
        paused=1-paused;

        if (!paused) {
            setTimeout("renderAn()",30);
        }
        return false;
    }

